mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
This commit was generated by cvs2svn to track changes on a CVS vendor
branch.
This commit is contained in:
commit
003b4ee57e
47
ipmitool/Makefile.am
Normal file
47
ipmitool/Makefile.am
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
EXTRA_DIST = ipmitool.spec.in control/pkginfo control/prototype debian/*
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure configure-stamp \
|
||||||
|
config.guess config.sub depcomp install-sh ltmain.sh missing \
|
||||||
|
mkinstalldirs config.h.in stamp-h.in $(distdir).tar.gz
|
||||||
|
|
||||||
|
SUBDIRS = libltdl lib src include doc
|
||||||
|
|
||||||
|
INCLUDES = $(LTDLINCL)
|
||||||
|
|
||||||
|
dist-hook: ipmitool.spec
|
||||||
|
cp ipmitool.spec $(distdir)
|
||||||
|
|
46
ipmitool/bootstrap
Executable file
46
ipmitool/bootstrap
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/sh -x
|
||||||
|
#
|
||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
aclocal
|
||||||
|
libtoolize --automake --copy --ltdl
|
||||||
|
|
||||||
|
autoheader
|
||||||
|
automake --foreign --add-missing --copy
|
||||||
|
|
||||||
|
aclocal
|
||||||
|
autoconf
|
||||||
|
automake --foreign
|
||||||
|
|
133
ipmitool/configure.in
Normal file
133
ipmitool/configure.in
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
dnl
|
||||||
|
dnl autoconf for ipmitool
|
||||||
|
dnl
|
||||||
|
AC_INIT([src/ipmitool.c])
|
||||||
|
AM_INIT_AUTOMAKE([ipmitool], [1.5.4])
|
||||||
|
AM_CONFIG_HEADER([config.h])
|
||||||
|
AC_CONFIG_SRCDIR([src/ipmitool.c])
|
||||||
|
AC_PREREQ(2.50)
|
||||||
|
|
||||||
|
IPMITOOL_PKG=ipmitool
|
||||||
|
AC_SUBST(IPMITOOL_PKG)
|
||||||
|
AC_SUBST(ac_configure_args)
|
||||||
|
|
||||||
|
dnl check for programs
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CPP
|
||||||
|
AC_PROG_INSTALL
|
||||||
|
AC_PROG_LN_S
|
||||||
|
AC_PROG_MAKE_SET
|
||||||
|
|
||||||
|
AC_CHECK_PROG(SED, sed, sed)
|
||||||
|
|
||||||
|
dnl setup libtool and ltdl
|
||||||
|
AC_LIB_LTDL
|
||||||
|
AC_LIBTOOL_DLOPEN
|
||||||
|
AC_LIBLTDL_CONVENIENCE
|
||||||
|
AM_PROG_LIBTOOL
|
||||||
|
LIBTOOL="$LIBTOOL --silent"
|
||||||
|
AC_SUBST(LTDLINCL)
|
||||||
|
AC_SUBST(LIBLTDL)
|
||||||
|
AC_CONFIG_SUBDIRS(libltdl)
|
||||||
|
|
||||||
|
AC_CHECK_LIB([m], [pow], [], [
|
||||||
|
echo "** libm library pow() not found!"
|
||||||
|
exit 1
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_SEARCH_LIBS(gethostbyname, nsl)
|
||||||
|
AC_SEARCH_LIBS(socket, socket, ,
|
||||||
|
[AC_CHECK_LIB(nsl, socket, LIBS="$LIBS -lsocket -lnsl", , -lsocket)])
|
||||||
|
|
||||||
|
AC_CHECK_LIB([ltdl], [lt_dlopen], [], [
|
||||||
|
echo "** libltdl library lt_dlopen() not found!"
|
||||||
|
exit 1
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl check for headers
|
||||||
|
AC_HEADER_STDC
|
||||||
|
AC_CHECK_HEADERS([stdlib.h string.h sys/ioctl.h sys/stat.h unistd.h])
|
||||||
|
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h sys/socket.h])
|
||||||
|
|
||||||
|
have_openipmi=no
|
||||||
|
AC_CHECK_HEADER([linux/ipmi.h],
|
||||||
|
[have_openipmi=yes],
|
||||||
|
[AC_MSG_WARN([Unable to find OpenIPMI header files])])
|
||||||
|
|
||||||
|
dnl check for typedefs, structs, and compiler options
|
||||||
|
AC_C_CONST
|
||||||
|
AC_C_INLINE
|
||||||
|
|
||||||
|
dnl check for lib functions
|
||||||
|
AC_PROG_GCC_TRADITIONAL
|
||||||
|
AC_FUNC_MALLOC
|
||||||
|
AC_FUNC_SELECT_ARGTYPES
|
||||||
|
AC_FUNC_STAT
|
||||||
|
AC_FUNC_STRTOD
|
||||||
|
AC_CHECK_FUNCS([alarm gethostbyname socket select])
|
||||||
|
AC_CHECK_FUNCS([memmove memset strchr strdup strerror])
|
||||||
|
|
||||||
|
dnl check for byteswap functionality
|
||||||
|
AC_CHECK_HEADERS([asm/byteorder.h byteswap.h])
|
||||||
|
AC_CHECK_FUNCS([bswap_16 bswap_32])
|
||||||
|
AC_C_BIGENDIAN
|
||||||
|
|
||||||
|
if test "x$prefix" = "xNONE"; then
|
||||||
|
prefix="$ac_default_prefix"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$exec_prefix" = "xNONE"; then
|
||||||
|
exec_prefix="$prefix"
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl enable plugins for interfaces
|
||||||
|
AC_ARG_WITH([plugin-path],
|
||||||
|
[[ --with-plugin-path=DIR Set plugin path to DIR]],
|
||||||
|
[pluginpath="$withval"],
|
||||||
|
[pluginpath="${exec_prefix}/lib/ipmitool"])
|
||||||
|
|
||||||
|
AC_DEFINE_UNQUOTED(PLUGIN_PATH, "$pluginpath", "IPMI interface plugin path")
|
||||||
|
AC_SUBST(pluginpath)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([intf-lan],
|
||||||
|
[[ --enable-intf-lan enable IPMI-over-LAN interface [default=yes]]],
|
||||||
|
[if test "x$enableval" = "xyes"; then
|
||||||
|
PLUGINS="$PLUGINS lan"
|
||||||
|
fi],
|
||||||
|
[PLUGINS="$PLUGINS lan"])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([intf-open],
|
||||||
|
[[ --enable-intf-open enable OpenIPMI device interface [default=no]]],
|
||||||
|
[if test "x$enableval" = "xyes"; then
|
||||||
|
if test "x$have_openipmi" = "xyes"; then
|
||||||
|
PLUGINS="$PLUGINS open"
|
||||||
|
else
|
||||||
|
echo "** Unable to build OpenIPMI interface support!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
|
||||||
|
AC_SUBST(PLUGINS)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([ipmievd],
|
||||||
|
[[ --enable-ipmievd enable IPMI event daemon [default=no]]],,)
|
||||||
|
|
||||||
|
AM_CONDITIONAL(IPMIEVD, test "x$enable_ipmievd" = "xyes")
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([ipmitool.spec
|
||||||
|
Makefile
|
||||||
|
doc/Makefile
|
||||||
|
lib/Makefile
|
||||||
|
include/Makefile
|
||||||
|
include/ipmitool/Makefile
|
||||||
|
src/Makefile
|
||||||
|
src/plugins/Makefile
|
||||||
|
src/plugins/lan/Makefile
|
||||||
|
src/plugins/open/Makefile])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo Building $PACKAGE version $VERSION with interface plugins: $PLUGINS
|
||||||
|
echo Plugin Path: $pluginpath
|
||||||
|
echo
|
@ -1,8 +1,36 @@
|
|||||||
ipmitool (1.4.1.1-1) unstable; urgency=low
|
ipmitool (1.5.4) unstable; urgency=low
|
||||||
|
|
||||||
* First public source relese
|
* Put interface plugin API into library
|
||||||
|
* Fix ipmievd
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@sun.com> Wed, 12 Nov 2003 09:23:18 -0700
|
-- Duncan Laurie <duncan@sun.com> Fri, 14 Nov 2003 15:16:34 -0700
|
||||||
|
|
||||||
|
ipmitool (1.5.3) unstable; urgency=low
|
||||||
|
|
||||||
|
* Add -g option to work with grizzly bmc
|
||||||
|
|
||||||
|
-- Duncan Laurie <duncan@sun.com> Mon, 3 Nov 2003 18:04:07 -0700
|
||||||
|
|
||||||
|
ipmitool (1.5.2) unstable; urgency=low
|
||||||
|
|
||||||
|
* add support for setting gratuitous arp interval
|
||||||
|
|
||||||
|
-- Duncan Laurie <duncan@sun.com> Fri, 24 Oct 2003 11:00:00 -0700
|
||||||
|
|
||||||
|
ipmitool (1.5.1) unstable; urgency=low
|
||||||
|
|
||||||
|
* better SEL support
|
||||||
|
* fix display bug in SDR list
|
||||||
|
|
||||||
|
-- Duncan Laurie <duncan@sun.com> Wed, 8 Oct 2003 17:28:51 -0700
|
||||||
|
|
||||||
|
ipmitool (1.5.0) unstable; urgency=low
|
||||||
|
|
||||||
|
* more robust UDP packet handling
|
||||||
|
* add Intel IMB driver support
|
||||||
|
* use autoconf/automake/libtool
|
||||||
|
|
||||||
|
-- Duncan Laurie <duncan@sun.com> Fri, 5 Sep 2003 11:57:32 -0700
|
||||||
|
|
||||||
ipmitool (1.2-1) unstable; urgency=low
|
ipmitool (1.2-1) unstable; urgency=low
|
||||||
|
|
||||||
@ -13,13 +41,13 @@ ipmitool (1.2-1) unstable; urgency=low
|
|||||||
|
|
||||||
ipmitool (1.1-1) unstable; urgency=low
|
ipmitool (1.1-1) unstable; urgency=low
|
||||||
|
|
||||||
* Minor fixes
|
* Minor fixes.
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@sun.com> Tue, 1 Apr 2003 14:31:10 -0700
|
-- Duncan Laurie <duncan@sun.com> Tue, 1 Apr 2003 14:31:10 -0700
|
||||||
|
|
||||||
ipmitool (1.0-1) unstable; urgency=low
|
ipmitool (1.0-1) unstable; urgency=low
|
||||||
|
|
||||||
* Initial Release
|
* Initial Release.
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@sun.com> Sun, 30 Mar 2003 21:30:46 -0700
|
-- Duncan Laurie <duncan@sun.com> Sun, 30 Mar 2003 21:30:46 -0700
|
||||||
|
|
||||||
|
@ -1 +1,3 @@
|
|||||||
usr/sbin
|
usr/bin
|
||||||
|
usr/lib/ipmitool
|
||||||
|
usr/include/ipmitool
|
||||||
|
@ -1,20 +1,9 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# GNU copyright 1997 to 1999 by Joey Hess.
|
|
||||||
#
|
|
||||||
# Modified to make a template file for a multi-binary package with separated
|
|
||||||
# build-arch and build-indep targets by Bill Allombert 2001
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
#export DH_VERBOSE=1
|
||||||
|
|
||||||
# This is the debhelper compatability version to use.
|
|
||||||
export DH_COMPAT=4
|
export DH_COMPAT=4
|
||||||
# This has to be exported to make some magic below work.
|
|
||||||
export DH_OPTIONS
|
export DH_OPTIONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS = -Wall -g
|
CFLAGS = -Wall -g
|
||||||
|
|
||||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
||||||
@ -29,11 +18,11 @@ endif
|
|||||||
configure: configure-stamp
|
configure: configure-stamp
|
||||||
configure-stamp:
|
configure-stamp:
|
||||||
dh_testdir
|
dh_testdir
|
||||||
# Add here commands to configure the package.
|
./configure --enable-intf-lan --enable-intf-open \
|
||||||
|
--enable-ipmievd \
|
||||||
|
--prefix=/usr --mandir=/usr/share/man
|
||||||
touch configure-stamp
|
touch configure-stamp
|
||||||
|
|
||||||
|
|
||||||
#Architecture
|
#Architecture
|
||||||
build: build-arch build-indep
|
build: build-arch build-indep
|
||||||
|
|
||||||
@ -97,7 +86,7 @@ binary-common:
|
|||||||
# dh_installpam
|
# dh_installpam
|
||||||
# dh_installinit
|
# dh_installinit
|
||||||
# dh_installcron
|
# dh_installcron
|
||||||
dh_installmanpages
|
# dh_installmanpages
|
||||||
# dh_installinfo
|
# dh_installinfo
|
||||||
# dh_undocumented
|
# dh_undocumented
|
||||||
# dh_installchangelogs
|
# dh_installchangelogs
|
||||||
@ -111,6 +100,7 @@ binary-common:
|
|||||||
dh_installdeb
|
dh_installdeb
|
||||||
# dh_perl
|
# dh_perl
|
||||||
dh_gencontrol
|
dh_gencontrol
|
||||||
|
dh_md5sums
|
||||||
dh_builddeb
|
dh_builddeb
|
||||||
# Build architecture independant packages using the common target.
|
# Build architecture independant packages using the common target.
|
||||||
binary-indep: build-indep install-indep
|
binary-indep: build-indep install-indep
|
||||||
@ -122,3 +112,4 @@ binary-arch: build-arch install-arch
|
|||||||
|
|
||||||
binary: binary-arch #binary-indep
|
binary: binary-arch #binary-indep
|
||||||
.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure
|
.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure
|
||||||
|
|
||||||
|
39
ipmitool/doc/Makefile.am
Normal file
39
ipmitool/doc/Makefile.am
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
man_MANS = ipmitool.1
|
||||||
|
|
||||||
|
EXTRA_DIST = $(man_MANS)
|
348
ipmitool/doc/ipmitool.1
Normal file
348
ipmitool/doc/ipmitool.1
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
.TH "ipmitool" "1" "" "Duncan Laurie" ""
|
||||||
|
.SH "NAME"
|
||||||
|
.LP
|
||||||
|
ipmitool \- utility for controlling IPMI-enabled devices
|
||||||
|
.SH "SYNTAX"
|
||||||
|
.LP
|
||||||
|
ipmitool [\fB\-ghcvV\fR] \fB\-I\fR \fIlan\fP \fB\-H\fR \fIaddress\fP [\fB\-P\fR \fIpassword\fP] <\fIexpression\fP>
|
||||||
|
.br
|
||||||
|
ipmitool [\fB\-ghcvV\fR] \fB\-I\fR \fIopen\fP <\fIexpression\fP>
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
.LP
|
||||||
|
This program lets you perform various IPMI functions with either a kernel device driver or over a LAN interface. These functions include printing FRU information, LAN configuration, sensor readings, and remote chassis power control.
|
||||||
|
.SH "OPTIONS"
|
||||||
|
.LP
|
||||||
|
.TP
|
||||||
|
\fB\-h\fR
|
||||||
|
Get basic usage help from the command line.
|
||||||
|
.TP
|
||||||
|
\fB\-c\fR
|
||||||
|
Make output suitable for parsing where possible by separating fields with commas instead of spaces.
|
||||||
|
.TP
|
||||||
|
\fB\-g\fR
|
||||||
|
Attempt to be extra robust in IPMI-over-LAN communications.
|
||||||
|
.TP
|
||||||
|
\fB\-V\fR
|
||||||
|
Display version information.
|
||||||
|
.TP
|
||||||
|
\fB\-v\fR
|
||||||
|
Increase verbose output level. This option may be specified multiple times to increase the level of debug output. If given three times you will get hexdumps of all incoming and outgoing packets.
|
||||||
|
.TP
|
||||||
|
\fB\-I\fR <\fIinterface\fP>
|
||||||
|
Selects IPMI interface to use. Possible interfaces are \fIlan\fP or \fIopen\fP.
|
||||||
|
.TP
|
||||||
|
\fB\-H\fR <\fIaddress\fP>
|
||||||
|
Remote server address, can be IP address or hostname. This option is required for the LAN interface connection.
|
||||||
|
.TP
|
||||||
|
\fB\-P\fR <\fIpassword\fP>
|
||||||
|
Remote server password, 16 character maximum. This is optional for the LAN interface, if it is not provided the session will not be authenticated.
|
||||||
|
.SH "EXPRESSIONS"
|
||||||
|
.LP
|
||||||
|
.TP
|
||||||
|
.I help
|
||||||
|
This can be used to get command-line help on ipmitool commands. It may also be placed at the end of commands to get option usage help.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
ipmitool -I open help
|
||||||
|
.br
|
||||||
|
Commands: chassis, fru, lan, sdr, sel
|
||||||
|
.LP
|
||||||
|
.PP
|
||||||
|
ipmitool -I open chassis help
|
||||||
|
.br
|
||||||
|
Chassis Commands: status, power, identify, policy, restart_cause
|
||||||
|
.LP
|
||||||
|
.PP
|
||||||
|
ipmitool -I open chassis power help
|
||||||
|
.br
|
||||||
|
Chassis Power Commands: status, on, off, cycle, reset, diag, soft
|
||||||
|
.LP
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
\fIraw\fP <\fBnetfn\fR> <\fBcmd\fR> [\fBdata\fR]
|
||||||
|
This will allow you to execute raw IPMI commands. For example to query the POH counter with a raw command:
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
ipmitool -I open raw 0x0 0xf
|
||||||
|
.br
|
||||||
|
RAW REQ (netfn=0x0 cmd=0xf data_len=0)
|
||||||
|
.br
|
||||||
|
RAW RSP (5 bytes)
|
||||||
|
.br
|
||||||
|
3c 72 0c 00 00
|
||||||
|
.LP
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
\fIchaninfo\fP [\fBchannel\fR]
|
||||||
|
This command will display information about the selected channel. If no channel is given it will display information about the currently used channel:
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
ipmitool -I open chaninfo
|
||||||
|
.br
|
||||||
|
Channel 0xf info:
|
||||||
|
.br
|
||||||
|
Channel Medium Type : System Interface
|
||||||
|
.br
|
||||||
|
Channel Protocol Type : KCS
|
||||||
|
.br
|
||||||
|
Session Support : session-less
|
||||||
|
.br
|
||||||
|
Active Session Count : 0
|
||||||
|
.br
|
||||||
|
Protocol Vendor ID : 7154
|
||||||
|
.LP
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
\fIuserinfo\fP <\fBchannel\fR>
|
||||||
|
This command will display information about configured user information on a specific LAN channel. This command will fail on system interfaces. Try channel 6 or 7.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
ipmitool -I open userinfo 6
|
||||||
|
.br
|
||||||
|
Maximum User IDs : 4
|
||||||
|
.br
|
||||||
|
Enabled User IDs : 1
|
||||||
|
.br
|
||||||
|
Fixed Name User IDs : 1
|
||||||
|
.br
|
||||||
|
Access Available : call-in / callback
|
||||||
|
.br
|
||||||
|
Link Authentication : disabled
|
||||||
|
.br
|
||||||
|
IPMI Messaging : enabled
|
||||||
|
.LP
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I chassis
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I status
|
||||||
|
This command returns information about the high-level status of the system chassis and main power subsystem.
|
||||||
|
.TP
|
||||||
|
.I poh
|
||||||
|
This command will return the Power-On Hours counter.
|
||||||
|
.TP
|
||||||
|
\fIidentify\fP <\fBinterval\fR>
|
||||||
|
Control the front panel identify light. Default is 15. Use 0 to turn off.
|
||||||
|
.TP
|
||||||
|
.I restart_cause
|
||||||
|
Query the chassis for the cause of the last system restart.
|
||||||
|
.TP
|
||||||
|
.I policy
|
||||||
|
Set the chassis power policy in the event power failure.
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I list
|
||||||
|
Return supported policies.
|
||||||
|
.TP
|
||||||
|
.I always-on
|
||||||
|
Turn on when power is restored.
|
||||||
|
.TP
|
||||||
|
.I previous
|
||||||
|
Returned to previous state when power is restored.
|
||||||
|
.TP
|
||||||
|
.I always-off
|
||||||
|
Stay off after power is restored.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I power
|
||||||
|
Performs a chassis control command to view and change the power state.
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I status
|
||||||
|
Show current chassis power status.
|
||||||
|
.TP
|
||||||
|
.I on
|
||||||
|
Power up chassis.
|
||||||
|
.TP
|
||||||
|
.I off
|
||||||
|
Power down chassis into soft off (S4/S5 state). WARNING: this command does not initiate a clean shutdown of the operating system prior to powering down the system.
|
||||||
|
.TP
|
||||||
|
.I cycle
|
||||||
|
This command provides a power off interval of at least 1 second. No action should occur if chassis power is in S4/S5 state, but it is recommended to check power state first and only issue a power cycle command if the system power is on or in lower sleep state than S4/S5.
|
||||||
|
.TP
|
||||||
|
.I reset
|
||||||
|
This command will perform a hard reset.
|
||||||
|
.TP
|
||||||
|
.I diag
|
||||||
|
Pulse a version of a diagnostic interrupt (NMI) that goes directly to the processor(s).
|
||||||
|
.TP
|
||||||
|
.I soft
|
||||||
|
Initiate a soft\-shutdown of OS via ACPI by emulating a fatal overtemperature.
|
||||||
|
.RE
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I lan
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
\fIprint\fP <\fBchannel\fR>
|
||||||
|
Print the current configuration for the given channel.
|
||||||
|
.TP
|
||||||
|
\fIset\fP <\fBchannel\fR> <\fBparameter\fR>
|
||||||
|
Set the given parameter on the given channel. Valid parameters are:
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
\fIipaddr\fP <\fBx.x.x.x\fR>
|
||||||
|
Set the IP address for this channel.
|
||||||
|
.TP
|
||||||
|
\fInetmask\fP <\fBx.x.x.x\fR>
|
||||||
|
Set the netmask for this channel.
|
||||||
|
.TP
|
||||||
|
\fImacaddr\fP <\fBxx:xx:xx:xx:xx:xx\fR>
|
||||||
|
Set the MAC adddress for this channel.
|
||||||
|
.TP
|
||||||
|
\fIdefgw\fP \fIipaddr\fP <\fBx.x.x.x\fR>
|
||||||
|
Set the default gateway IP address.
|
||||||
|
.TP
|
||||||
|
\fIdefgw\fP \fImacaddr\fP <\fBxx:xx:xx:xx:xx:xx\fR>
|
||||||
|
Set the default gateway MAC address.
|
||||||
|
.TP
|
||||||
|
\fIbakgw\fP \fIipaddr\fP <\fBx.x.x.x\fR>
|
||||||
|
Set the backup gateway IP address.
|
||||||
|
.TP
|
||||||
|
\fIbakgw\fP \fImacaddr\fP <\fBxx:xx:xx:xx:xx:xx\fR>
|
||||||
|
Set the backup gateway MAC address.
|
||||||
|
.TP
|
||||||
|
\fIpassword\fP <\fBpass\fR>
|
||||||
|
Set the null user password.
|
||||||
|
.TP
|
||||||
|
\fIuser\fP
|
||||||
|
Enable user access mode.
|
||||||
|
.TP
|
||||||
|
\fIaccess\fP <\fBon|off\fR>
|
||||||
|
Set LAN channel access mode.
|
||||||
|
.TP
|
||||||
|
\fIipsrc\fP <\fBsource\fR>
|
||||||
|
Set the IP address source:
|
||||||
|
.br
|
||||||
|
none = unspecified
|
||||||
|
.br
|
||||||
|
static = manually configured static IP address
|
||||||
|
.br
|
||||||
|
dhcp = address obtained by BMC running DHCP
|
||||||
|
.br
|
||||||
|
bios = address loaded by BIOS or system software
|
||||||
|
.TP
|
||||||
|
\fIarp\fP \fIrespond\fP <\fBon|off\fR>
|
||||||
|
Set BMC generated ARP responses.
|
||||||
|
.TP
|
||||||
|
\fIarp\fP \fIgenerate\fP <\fBon|off\fR>
|
||||||
|
Set BMC generated gratuitous ARPs.
|
||||||
|
.TP
|
||||||
|
\fIarp\fP \fIinterval\fP <\fBseconds\fR>
|
||||||
|
Set BMC generated gratuitous ARP interval.
|
||||||
|
.TP
|
||||||
|
\fIauth\fP <\fBlevel,...\fR> <\fBtype,...\fR>
|
||||||
|
Set the valid authtypes for a given auth level.
|
||||||
|
.RS
|
||||||
|
Levels:
|
||||||
|
.B callback
|
||||||
|
.B user
|
||||||
|
.B operator
|
||||||
|
.B admin
|
||||||
|
.br
|
||||||
|
Types:
|
||||||
|
.B none
|
||||||
|
.B md2
|
||||||
|
.B md5
|
||||||
|
.B key
|
||||||
|
.RE
|
||||||
|
.RE
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I fru
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I print
|
||||||
|
This command will read all Field Replacable Unit inventory data and extract such information as serial number, part number, asset tags, and short strings describing the chassis, board, or product.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I sdr
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I list
|
||||||
|
This command will read the SDR and extract sensor information, then query each sensor and print its name, reading, and status.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I sel
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I info
|
||||||
|
This command will query the BMC for information about the SEL and its contents.
|
||||||
|
.TP
|
||||||
|
.I clear
|
||||||
|
This command will clear the contents of the SEL. It cannot be undone so be careful.
|
||||||
|
.TP
|
||||||
|
.I list
|
||||||
|
This command will list the contents of the SEL.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.I sol
|
||||||
|
.RS
|
||||||
|
.TP
|
||||||
|
.I setup
|
||||||
|
Setup Serial-over-LAN: enable, set authentication and baud rate.
|
||||||
|
.RE
|
||||||
|
.SH "OPEN INTERFACE"
|
||||||
|
.LP
|
||||||
|
The ipmitool \fIopen\fP interface utilizes the MontaVista OpenIPMI kernel device driver. This driver is present in 2.5.57 and later development kernels and in 2.4.21pre1 and later stable kernels. There are also IPMI driver kernel patches for different versions available from the OpenIPMI homepage.
|
||||||
|
.LP
|
||||||
|
The following kernel modules must be loaded in order for ipmitool to work:
|
||||||
|
.TP
|
||||||
|
.B ipmi_msghandler
|
||||||
|
Incoming and outgoing message handler for IPMI interfaces.
|
||||||
|
.TP
|
||||||
|
.B ipmi_kcs_drv
|
||||||
|
An IPMI Keyboard Controler Style (KCS) interface driver for the message handler.
|
||||||
|
.TP
|
||||||
|
.B ipmi_devintf
|
||||||
|
Linux character device interface for the message handler.
|
||||||
|
.LP
|
||||||
|
Once they are loaded there will be a dynamic char device entry that must exist at \fB/dev/ipmi0\fR. Usually if this is the first dynamic device it will be major number \fB254\fR and minor number \fB0\fR so you would create the dev entry with:
|
||||||
|
.LP
|
||||||
|
.I mknod /dev/ipmi0 c 254 0
|
||||||
|
.LP
|
||||||
|
In order to force ipmitool to make use of the device interface you can specifiy it on the command line:
|
||||||
|
.PP
|
||||||
|
ipmitool \-I open [option...]
|
||||||
|
.LP
|
||||||
|
Alternatively if you do not provide a hostname on the command line ipmitool will assume you want to use the open interface.
|
||||||
|
.SH "LAN INTERFACE"
|
||||||
|
.LP
|
||||||
|
The ipmitool \fIlan\fP interface communicates with the BMC over an Ethernet LAN connection using UDP under IPv4. UDP datagrams are formatted to contain IPMI request/response messages with a IPMI session headers and RMCP headers.
|
||||||
|
.LP
|
||||||
|
IPMI\-over\-LAN uses version 1 of the Remote Management Control Protocol (RMCP) to support \fIpre\-OS\fP and \fIOS\-absent\fP management. RMCP is a request\-response protocol delivered using UDP datagrams to port 623.
|
||||||
|
.LP
|
||||||
|
The LAN interface is an authenticatiod multi\-session connection; messages delivered to the BMC can (and should) be authenticated with a challenge/response protocol with either straight password/key or MD5 message\-digest algorithm. ipmitool will attempt to connect with administrator privilege level as this is required to perform chassis power functions.
|
||||||
|
.LP
|
||||||
|
You can tell ipmitool to use the lan interface with the \fB\-I\fR option:
|
||||||
|
.PP
|
||||||
|
ipmitool \-I lan [option...] <address> [password]
|
||||||
|
.LP
|
||||||
|
A hostname \fBmust\fR be given on the command line in order to use the lan interface with ipmitool. The password field is optional; if you do not provide a password on the command line ipmitool will attempt to connect without authentication. If you specify a password it will use MD5 authentication if supported by the BMC and straight password/key otherwise.
|
||||||
|
.SH "FILES"
|
||||||
|
.TP
|
||||||
|
.I /dev/ipmi0
|
||||||
|
This character device file is used by the OpenIPMI kernel driver.
|
||||||
|
.SH "EXAMPLES"
|
||||||
|
.LP
|
||||||
|
If you want to remotely control the power of an IPMI\-over\-LAN enabled system you can use:
|
||||||
|
.LP
|
||||||
|
ipmitool \-I lan \-H 192.168.1.1 \-P password chassis power on
|
||||||
|
.br
|
||||||
|
Chassis Power Control: Up/On
|
||||||
|
.LP
|
||||||
|
ipmitool \-I lan \-H 192.168.1.1 \-P password chassis power status
|
||||||
|
.br
|
||||||
|
Chassis Power is on
|
||||||
|
.SH "AUTHOR"
|
||||||
|
.LP
|
||||||
|
Duncan Laurie <duncan@sun.com>
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.LP
|
||||||
|
.TP
|
||||||
|
Intelligent Platform Management Interface Specification
|
||||||
|
http://www.intel.com/design/servers/ipmi/spec.htm
|
||||||
|
.TP
|
||||||
|
OpenIPMI project (MontaVista IPMI kernel driver)
|
||||||
|
http://openipmi.sourceforge.net/
|
38
ipmitool/include/Makefile.am
Normal file
38
ipmitool/include/Makefile.am
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
SUBDIRS = ipmitool
|
||||||
|
|
42
ipmitool/include/ipmitool/Makefile.am
Normal file
42
ipmitool/include/ipmitool/Makefile.am
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
ipmitooldir = $(includedir)/ipmitool
|
||||||
|
|
||||||
|
ipmitool_HEADERS = bswap.h helper.h ipmi.h ipmi_intf.h \
|
||||||
|
ipmi_chassis.h ipmi_entity.h ipmi_fru.h ipmi_lanp.h \
|
||||||
|
ipmi_sdr.h ipmi_sel.h ipmi_sol.h ipmi_bmc.h
|
||||||
|
|
55
ipmitool/include/ipmitool/bswap.h
Normal file
55
ipmitool/include/ipmitool/bswap.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_BSWAP_H
|
||||||
|
#define IPMI_BSWAP_H
|
||||||
|
|
||||||
|
#if defined(__sun)
|
||||||
|
|
||||||
|
#define BSWAP_16(x) ((((x) & 0xff00) >> 8) | (((x) & 0x00ff) << 8))
|
||||||
|
#define BSWAP_32(x) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) |\
|
||||||
|
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <byteswap.h>
|
||||||
|
|
||||||
|
#define BSWAP_16(x) bswap_16(x)
|
||||||
|
#define BSWAP_32(x) bswap_32(x)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* IPMI_BSWAP_H */
|
58
ipmitool/include/ipmitool/helper.h
Normal file
58
ipmitool/include/ipmitool/helper.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_HELPER_H
|
||||||
|
#define IPMI_HELPER_H
|
||||||
|
|
||||||
|
struct valstr {
|
||||||
|
unsigned char val;
|
||||||
|
const char * str;
|
||||||
|
};
|
||||||
|
const char * val2str(unsigned char val, const struct valstr * vs);
|
||||||
|
|
||||||
|
unsigned short buf2short(unsigned char * buf);
|
||||||
|
unsigned long buf2long(unsigned char * buf);
|
||||||
|
const char * buf2str(unsigned char * buf, int len);
|
||||||
|
void printbuf(unsigned char * buf, int len, char * desc);
|
||||||
|
|
||||||
|
void signal_handler(int sig, void * handler);
|
||||||
|
|
||||||
|
#define SIG_IGNORE(s) ((void)signal((s), SIG_IGN))
|
||||||
|
#define SIG_DEFAULT(s) ((void)signal((s), SIG_DFL))
|
||||||
|
#define SIG_HANDLE(s,h) ((void)signal_handler((s), (h)))
|
||||||
|
|
||||||
|
#endif /* IPMI_HELPER_H */
|
||||||
|
|
126
ipmitool/include/ipmitool/ipmi.h
Normal file
126
ipmitool/include/ipmitool/ipmi.h
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_H
|
||||||
|
#define IPMI_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#define BUF_SIZE 256
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
extern int csv_output;
|
||||||
|
|
||||||
|
struct ipmi_session {
|
||||||
|
unsigned char username[16];
|
||||||
|
unsigned char challenge[16];
|
||||||
|
unsigned char password;
|
||||||
|
unsigned char authtype;
|
||||||
|
unsigned char authcode[16];
|
||||||
|
unsigned char privlvl;
|
||||||
|
unsigned long in_seq;
|
||||||
|
unsigned long out_seq;
|
||||||
|
unsigned long id;
|
||||||
|
int active;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ipmi_rq {
|
||||||
|
struct {
|
||||||
|
unsigned char netfn;
|
||||||
|
unsigned char cmd;
|
||||||
|
unsigned short data_len;
|
||||||
|
unsigned char *data;
|
||||||
|
} msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ipmi_rq_entry {
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct ipmi_intf * intf;
|
||||||
|
struct ipmi_session * session;
|
||||||
|
unsigned char rq_seq;
|
||||||
|
unsigned char * msg_data;
|
||||||
|
int msg_len;
|
||||||
|
struct ipmi_rq_entry * next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ipmi_rs {
|
||||||
|
unsigned char ccode;
|
||||||
|
unsigned char data[BUF_SIZE];
|
||||||
|
int data_len;
|
||||||
|
struct {
|
||||||
|
unsigned char authtype;
|
||||||
|
unsigned long seq;
|
||||||
|
unsigned long id;
|
||||||
|
} session;
|
||||||
|
unsigned char msglen;
|
||||||
|
struct {
|
||||||
|
unsigned char rq_addr;
|
||||||
|
unsigned char netfn;
|
||||||
|
unsigned char rq_lun;
|
||||||
|
unsigned char rs_addr;
|
||||||
|
unsigned char rq_seq;
|
||||||
|
unsigned char rs_lun;
|
||||||
|
unsigned char cmd;
|
||||||
|
} header;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ipmi_intf {
|
||||||
|
int fd;
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
int abort;
|
||||||
|
int pedantic;
|
||||||
|
int (*open)(struct ipmi_intf *, char *, int, char *);
|
||||||
|
void (*close)(struct ipmi_intf *);
|
||||||
|
struct ipmi_rs *(*sendrecv)(struct ipmi_intf *, struct ipmi_rq *);
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IPMI_NETFN_CHASSIS 0x0
|
||||||
|
#define IPMI_NETFN_BRIDGE 0x2
|
||||||
|
#define IPMI_NETFN_SE 0x4
|
||||||
|
#define IPMI_NETFN_APP 0x6
|
||||||
|
#define IPMI_NETFN_FIRMWARE 0x8
|
||||||
|
#define IPMI_NETFN_STORAGE 0xa
|
||||||
|
#define IPMI_NETFN_TRANSPORT 0xc
|
||||||
|
#define IPMI_NETFN_SOL 0x34
|
||||||
|
|
||||||
|
#define IPMI_BMC_SLAVE_ADDR 0x20
|
||||||
|
#define IPMI_REMOTE_SWID 0x81
|
||||||
|
|
||||||
|
int handle_ipmi(struct ipmi_intf *intf, unsigned char * data, int data_len);
|
||||||
|
|
||||||
|
#endif /* IPMI_H */
|
49
ipmitool/include/ipmitool/ipmi_bmc.h
Normal file
49
ipmitool/include/ipmitool/ipmi_bmc.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_BMC_H
|
||||||
|
#define IPMI_BMC_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define BMC_GET_DEVICE_ID 0x01
|
||||||
|
#define BMC_COLD_RESET 0x02
|
||||||
|
#define BMC_WARM_RESET 0x03
|
||||||
|
#define BMC_GET_SELF_TEST 0x04
|
||||||
|
|
||||||
|
int ipmi_bmc_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
|
#endif /*IPMI_BMC_H*/
|
56
ipmitool/include/ipmitool/ipmi_chassis.h
Normal file
56
ipmitool/include/ipmitool/ipmi_chassis.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_CHASSIS_H
|
||||||
|
#define IPMI_CHASSIS_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define IPMI_CHASSIS_CTL_POWER_DOWN 0x0
|
||||||
|
#define IPMI_CHASSIS_CTL_POWER_UP 0x1
|
||||||
|
#define IPMI_CHASSIS_CTL_POWER_CYCLE 0x2
|
||||||
|
#define IPMI_CHASSIS_CTL_HARD_RESET 0x3
|
||||||
|
#define IPMI_CHASSIS_CTL_PULSE_DIAG 0x4
|
||||||
|
#define IPMI_CHASSIS_CTL_ACPI_SOFT 0x5
|
||||||
|
|
||||||
|
#define IPMI_CHASSIS_POLICY_NO_CHANGE 0x3
|
||||||
|
#define IPMI_CHASSIS_POLICY_ALWAYS_ON 0x2
|
||||||
|
#define IPMI_CHASSIS_POLICY_PREVIOUS 0x1
|
||||||
|
#define IPMI_CHASSIS_POLICY_ALWAYS_OFF 0x0
|
||||||
|
|
||||||
|
int ipmi_chassis_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
|
#endif /*IPMI_CHASSIS_H*/
|
88
ipmitool/include/ipmitool/ipmi_entity.h
Normal file
88
ipmitool/include/ipmitool/ipmi_entity.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_ENTITY_H
|
||||||
|
#define IPMI_ENTITY_H
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
|
||||||
|
const struct valstr entity_id_vals[] __attribute__((unused)) = {
|
||||||
|
{ 0x00, "Unspecified" },
|
||||||
|
{ 0x01, "Other" },
|
||||||
|
{ 0x02, "Unknown" },
|
||||||
|
{ 0x03, "Processor" },
|
||||||
|
{ 0x04, "Disk or Disk Bay" },
|
||||||
|
{ 0x05, "Peripheral Bay" },
|
||||||
|
{ 0x06, "System Management Module" },
|
||||||
|
{ 0x07, "System Board" },
|
||||||
|
{ 0x08, "Memory Module" },
|
||||||
|
{ 0x09, "Processor Module" },
|
||||||
|
{ 0x0a, "Power Supply" },
|
||||||
|
{ 0x0b, "Add-in Card" },
|
||||||
|
{ 0x0c, "Front Panel Board" },
|
||||||
|
{ 0x0d, "Back Panel Board" },
|
||||||
|
{ 0x0e, "Power System Board" },
|
||||||
|
{ 0x0f, "Drive Backplane" },
|
||||||
|
{ 0x10, "System Internal Expansion Board" },
|
||||||
|
{ 0x11, "Other System Board" },
|
||||||
|
{ 0x12, "Processor Board" },
|
||||||
|
{ 0x13, "Power Unit" },
|
||||||
|
{ 0x14, "Power Module" },
|
||||||
|
{ 0x15, "Power Management" },
|
||||||
|
{ 0x16, "Chassis Back Panel Board" },
|
||||||
|
{ 0x17, "System Chassis" },
|
||||||
|
{ 0x18, "Sub-Chassis" },
|
||||||
|
{ 0x19, "Other Chassis Board" },
|
||||||
|
{ 0x1a, "Disk Drive Bay" },
|
||||||
|
{ 0x1b, "Peripheral Bay" },
|
||||||
|
{ 0x1c, "Device Bay" },
|
||||||
|
{ 0x1d, "Fan Device" },
|
||||||
|
{ 0x1e, "Cooling Unit" },
|
||||||
|
{ 0x1f, "Cable/Interconnect" },
|
||||||
|
{ 0x20, "Memory Device" },
|
||||||
|
{ 0x21, "System Management Software" },
|
||||||
|
{ 0x22, "BIOS" },
|
||||||
|
{ 0x23, "Operating System" },
|
||||||
|
{ 0x24, "System Bus" },
|
||||||
|
{ 0x25, "Group" },
|
||||||
|
{ 0x26, "Remote Management Device" },
|
||||||
|
{ 0x27, "External Environment" },
|
||||||
|
{ 0x28, "Battery" },
|
||||||
|
{ 0x00, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* IPMI_ENTITY_H */
|
||||||
|
|
124
ipmitool/include/ipmitool/ipmi_fru.h
Normal file
124
ipmitool/include/ipmitool/ipmi_fru.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_FRU_H
|
||||||
|
#define IPMI_FRU_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define GET_FRU_INFO 0x10
|
||||||
|
#define GET_FRU_DATA 0x11
|
||||||
|
#define SET_FRU_DATA 0x12
|
||||||
|
|
||||||
|
enum {
|
||||||
|
FRU_CHASSIS_PARTNO,
|
||||||
|
FRU_CHASSIS_SERIAL,
|
||||||
|
FRU_BOARD_MANUF,
|
||||||
|
FRU_BOARD_PRODUCT,
|
||||||
|
FRU_BOARD_SERIAL,
|
||||||
|
FRU_BOARD_PARTNO,
|
||||||
|
FRU_PRODUCT_MANUF,
|
||||||
|
FRU_PRODUCT_NAME,
|
||||||
|
FRU_PRODUCT_PARTNO,
|
||||||
|
FRU_PRODUCT_VERSION,
|
||||||
|
FRU_PRODUCT_SERIAL,
|
||||||
|
FRU_PRODUCT_ASSET,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fru_info {
|
||||||
|
unsigned short size;
|
||||||
|
unsigned char access : 1;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct fru_header {
|
||||||
|
unsigned char version;
|
||||||
|
struct {
|
||||||
|
unsigned char internal;
|
||||||
|
unsigned char chassis;
|
||||||
|
unsigned char board;
|
||||||
|
unsigned char product;
|
||||||
|
unsigned char multi;
|
||||||
|
} offset;
|
||||||
|
unsigned char pad;
|
||||||
|
unsigned char checksum;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct fru_area_chassis {
|
||||||
|
unsigned char area_ver;
|
||||||
|
unsigned char area_len;
|
||||||
|
unsigned char type;
|
||||||
|
char * part;
|
||||||
|
char * serial;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fru_area_board {
|
||||||
|
unsigned char area_ver;
|
||||||
|
unsigned char area_len;
|
||||||
|
unsigned char lang;
|
||||||
|
unsigned long mfg_date_time;
|
||||||
|
char * mfg;
|
||||||
|
char * prod;
|
||||||
|
char * serial;
|
||||||
|
char * part;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct fru_area_product {
|
||||||
|
unsigned char area_ver;
|
||||||
|
unsigned char area_len;
|
||||||
|
unsigned char lang;
|
||||||
|
char * mfg;
|
||||||
|
char * name;
|
||||||
|
char * part;
|
||||||
|
char * version;
|
||||||
|
char * serial;
|
||||||
|
char * asset;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char * chassis_type_desc[] __attribute__((unused)) = {
|
||||||
|
"Unspecified", "Other", "Unknown",
|
||||||
|
"Desktop", "Low Profile Desktop", "Pizza Box",
|
||||||
|
"Mini Tower", "Tower",
|
||||||
|
"Portable", "LapTop", "Notebook", "Hand Held", "Docking Station",
|
||||||
|
"All in One", "Sub Notebook", "Space-saving", "Lunch Box",
|
||||||
|
"Main Server Chassis", "Expansion Chassis", "SubChassis",
|
||||||
|
"Bus Expansion Chassis", "Peripheral Chassis", "RAID Chassis",
|
||||||
|
"Rack Mount Chassis"
|
||||||
|
};
|
||||||
|
|
||||||
|
void ipmi_print_fru(struct ipmi_intf *, unsigned char);
|
||||||
|
int ipmi_fru_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
|
#endif /* IPMI_FRU_H */
|
46
ipmitool/include/ipmitool/ipmi_intf.h
Normal file
46
ipmitool/include/ipmitool/ipmi_intf.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_INTF_H
|
||||||
|
#define IPMI_INTF_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
int ipmi_intf_init(void);
|
||||||
|
void ipmi_intf_exit(void);
|
||||||
|
struct ipmi_intf * ipmi_intf_load(char * name);
|
||||||
|
|
||||||
|
#endif /* IPMI_INTF_H */
|
134
ipmitool/include/ipmitool/ipmi_lanp.h
Normal file
134
ipmitool/include/ipmitool/ipmi_lanp.h
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_LANP_H
|
||||||
|
#define IPMI_LANP_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define IPMI_LAN_SET_CONFIG 0x01
|
||||||
|
#define IPMI_LAN_GET_CONFIG 0x02
|
||||||
|
#define IPMI_LAN_SUSPEND_ARP 0x03
|
||||||
|
# define IPMI_LAN_SUSPEND_ARP_RESP (2)
|
||||||
|
# define IPMI_LAN_SUSPEND_ARP_GRAT (1)
|
||||||
|
#define IPMI_LAN_GET_STAT 0x04
|
||||||
|
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_NONE 0x0
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_MD2 0x1
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_MD5 0x2
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_KEY 0x4
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_OEM 0x5
|
||||||
|
|
||||||
|
#define IPMI_SESSION_PRIV_CALLBACK 0x1
|
||||||
|
#define IPMI_SESSION_PRIV_USER 0x2
|
||||||
|
#define IPMI_SESSION_PRIV_OPERATOR 0x3
|
||||||
|
#define IPMI_SESSION_PRIV_ADMIN 0x4
|
||||||
|
#define IPMI_SESSION_PRIV_OEM 0x5
|
||||||
|
|
||||||
|
extern const struct valstr ipmi_privlvl_vals[];
|
||||||
|
extern const struct valstr ipmi_authtype_vals[];
|
||||||
|
extern struct ipmi_session lan_session;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPMI_LANP_SET_IN_PROGRESS,
|
||||||
|
IPMI_LANP_AUTH_TYPE,
|
||||||
|
IPMI_LANP_AUTH_TYPE_ENABLE,
|
||||||
|
IPMI_LANP_IP_ADDR,
|
||||||
|
IPMI_LANP_IP_ADDR_SRC,
|
||||||
|
IPMI_LANP_MAC_ADDR,
|
||||||
|
IPMI_LANP_SUBNET_MASK,
|
||||||
|
IPMI_LANP_IP_HEADER,
|
||||||
|
IPMI_LANP_PRI_RMCP_PORT,
|
||||||
|
IPMI_LANP_SEC_RMCP_PORT,
|
||||||
|
IPMI_LANP_BMC_ARP,
|
||||||
|
IPMI_LANP_GRAT_ARP,
|
||||||
|
IPMI_LANP_DEF_GATEWAY_IP,
|
||||||
|
IPMI_LANP_DEF_GATEWAY_MAC,
|
||||||
|
IPMI_LANP_BAK_GATEWAY_IP,
|
||||||
|
IPMI_LANP_BAK_GATEWAY_MAC,
|
||||||
|
IPMI_LANP_SNMP_STRING,
|
||||||
|
IPMI_LANP_NUM_DEST,
|
||||||
|
IPMI_LANP_DEST_TYPE,
|
||||||
|
IPMI_LANP_DEST_ADDR,
|
||||||
|
IPMI_LANP_OEM_ALERT_STRING=96,
|
||||||
|
IPMI_LANP_ALERT_RETRY=97,
|
||||||
|
IPMI_LANP_UTC_OFFSET=98,
|
||||||
|
IPMI_LANP_DHCP_SERVER_IP=192,
|
||||||
|
IPMI_LANP_DHCP_SERVER_MAC=193,
|
||||||
|
IPMI_LANP_DHCP_ENABLE=194,
|
||||||
|
IPMI_LANP_CHAN_ACCESS_MODE=201,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct lan_param {
|
||||||
|
int cmd;
|
||||||
|
int size;
|
||||||
|
char desc[24];
|
||||||
|
unsigned char * data;
|
||||||
|
} ipmi_lan_params[] __attribute__((unused)) = {
|
||||||
|
{ IPMI_LANP_SET_IN_PROGRESS, 1, "Set in Progress" },
|
||||||
|
{ IPMI_LANP_AUTH_TYPE, 1, "Auth Type" },
|
||||||
|
{ IPMI_LANP_AUTH_TYPE_ENABLE, 5, "Auth Type Enable" },
|
||||||
|
{ IPMI_LANP_IP_ADDR, 4, "IP Address" },
|
||||||
|
{ IPMI_LANP_IP_ADDR_SRC, 1, "IP Address Source" },
|
||||||
|
{ IPMI_LANP_MAC_ADDR, 6, "MAC Address" },
|
||||||
|
{ IPMI_LANP_SUBNET_MASK, 4, "Subnet Mask" },
|
||||||
|
{ IPMI_LANP_IP_HEADER, 3, "IP Header" },
|
||||||
|
{ IPMI_LANP_PRI_RMCP_PORT, 2, "Primary RMCP Port" },
|
||||||
|
{ IPMI_LANP_SEC_RMCP_PORT, 2, "Secondary RMCP Port" },
|
||||||
|
{ IPMI_LANP_BMC_ARP, 1, "BMC ARP Control" },
|
||||||
|
{ IPMI_LANP_GRAT_ARP, 1, "Gratituous ARP Intrvl" },
|
||||||
|
{ IPMI_LANP_DEF_GATEWAY_IP, 4, "Default Gateway IP" },
|
||||||
|
{ IPMI_LANP_DEF_GATEWAY_MAC, 6, "Default Gateway MAC" },
|
||||||
|
{ IPMI_LANP_BAK_GATEWAY_IP, 4, "Backup Gateway IP" },
|
||||||
|
{ IPMI_LANP_BAK_GATEWAY_MAC, 6, "Backup Gateway MAC" },
|
||||||
|
{ IPMI_LANP_SNMP_STRING, 18, "Community String" },
|
||||||
|
{ IPMI_LANP_NUM_DEST, 1, "Number of Destinations"},
|
||||||
|
{ IPMI_LANP_DEST_TYPE, 4, "Destination Type" },
|
||||||
|
{ IPMI_LANP_DEST_ADDR, 13, "Destination Addresses" },
|
||||||
|
{ IPMI_LANP_OEM_ALERT_STRING, 28, "OEM Alert String" },
|
||||||
|
{ IPMI_LANP_ALERT_RETRY, 1, "Alert Retry Algorithm" },
|
||||||
|
{ IPMI_LANP_UTC_OFFSET, 3, "UTC Offset" },
|
||||||
|
{ IPMI_LANP_DHCP_SERVER_IP, 4, "DHCP Server IP" },
|
||||||
|
{ IPMI_LANP_DHCP_SERVER_MAC, 6, "DHDP Server MAC" },
|
||||||
|
{ IPMI_LANP_DHCP_ENABLE, 1, "DHCP Enable" },
|
||||||
|
{ IPMI_LANP_CHAN_ACCESS_MODE, 2, "Channel Access Mode" },
|
||||||
|
{ -1 }
|
||||||
|
};
|
||||||
|
|
||||||
|
void ipmi_get_channel_info(struct ipmi_intf * intf, unsigned char channel);
|
||||||
|
int ipmi_lanp_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
|
#endif /*IPMI_LANP_H*/
|
325
ipmitool/include/ipmitool/ipmi_sdr.h
Normal file
325
ipmitool/include/ipmitool/ipmi_sdr.h
Normal file
@ -0,0 +1,325 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_SDR_H
|
||||||
|
#define IPMI_SDR_H
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <ipmitool/bswap.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
int ipmi_sdr_main(struct ipmi_intf *, int, char **);
|
||||||
|
int utos(unsigned val, unsigned bits);
|
||||||
|
|
||||||
|
#define __TO_TOL(mtol) (unsigned short)(BSWAP_16(mtol) & 0x3f)
|
||||||
|
#define __TO_M(mtol) (unsigned short)(utos((((BSWAP_16(mtol) & 0xff00) >> 8) | ((BSWAP_16(mtol) & 0xc0) << 2)), 10))
|
||||||
|
#define __TO_B(bacc) (unsigned int)(utos((((BSWAP_32(bacc) & 0xff000000) >> 24) | \
|
||||||
|
((BSWAP_32(bacc) & 0xc00000) >> 14)), 10))
|
||||||
|
#define __TO_ACC(bacc) (unsigned int)(((BSWAP_32(bacc) & 0x3f0000) >> 16) | ((BSWAP_32(bacc) & 0xf000) >> 6))
|
||||||
|
#define __TO_ACC_EXP(bacc) (unsigned int)((BSWAP_32(bacc) & 0xc00) >> 10)
|
||||||
|
#define __TO_R_EXP(bacc) (unsigned int)(utos(((BSWAP_32(bacc) & 0xf0) >> 4), 4))
|
||||||
|
#define __TO_B_EXP(bacc) (unsigned int)(utos((BSWAP_32(bacc) & 0xf), 4))
|
||||||
|
|
||||||
|
#define CONVERT_RAW(val, m, b, k1, k2) (float)(((m * val) + (b * pow(10, k1))) * pow(10, k2))
|
||||||
|
#define CONVERT_TOL(val, m, k2) (float)(((m * val) / 2) * pow(10, k2))
|
||||||
|
|
||||||
|
#define CONVERT_SENSOR_RAW(sensor, val) (float)(((__TO_M((sensor)->mtol) * val) + (__TO_B((sensor)->bacc) * pow(10, __TO_B_EXP((sensor)->bacc)))) * pow(10, __TO_R_EXP((sensor)->bacc)))
|
||||||
|
#define CONVERT_SENSOR_TOL(sensor) (float)((((__TO_M((sensor)->mtol) * __TO_TOL((sensor)->mtol)) / 2) * pow(10, __TO_R_EXP((sensor)->bacc))))
|
||||||
|
|
||||||
|
#define GET_SDR_REPO_INFO 0x20
|
||||||
|
#define GET_SDR_ALLOC_INFO 0x21
|
||||||
|
|
||||||
|
#define SDR_SENSOR_STAT_LO_NC (1<<0)
|
||||||
|
#define SDR_SENSOR_STAT_LO_CR (1<<1)
|
||||||
|
#define SDR_SENSOR_STAT_LO_NR (1<<2)
|
||||||
|
#define SDR_SENSOR_STAT_HI_NC (1<<3)
|
||||||
|
#define SDR_SENSOR_STAT_HI_CR (1<<4)
|
||||||
|
#define SDR_SENSOR_STAT_HI_NR (1<<5)
|
||||||
|
|
||||||
|
struct sdr_repo_info_rs {
|
||||||
|
unsigned char version; /* SDR version (51h) */
|
||||||
|
unsigned short count; /* number of records */
|
||||||
|
unsigned short free; /* free space in SDR */
|
||||||
|
unsigned long add_stamp; /* last add timestamp */
|
||||||
|
unsigned long erase_stamp; /* last del timestamp */
|
||||||
|
unsigned char op_support; /* supported operations */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
#define GET_SDR_RESERVE_REPO 0x22
|
||||||
|
struct sdr_reserve_repo_rs {
|
||||||
|
unsigned short reserve_id; /* reservation ID */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
#define GET_SDR 0x23
|
||||||
|
struct sdr_get_rq {
|
||||||
|
unsigned short reserve_id; /* reservation ID */
|
||||||
|
unsigned short id; /* record ID */
|
||||||
|
unsigned char offset; /* offset into SDR */
|
||||||
|
#define GET_SDR_ENTIRE_RECORD 0xff
|
||||||
|
#define GET_SDR_MAX_LEN 30
|
||||||
|
unsigned char length; /* length to read */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sdr_get_rs {
|
||||||
|
unsigned short next; /* next record id */
|
||||||
|
unsigned short id; /* record ID */
|
||||||
|
unsigned char version; /* SDR version (51h) */
|
||||||
|
#define SDR_RECORD_TYPE_FULL_SENSOR 0x01
|
||||||
|
#define SDR_RECORD_TYPE_COMPACT_SENSOR 0x02
|
||||||
|
unsigned char type; /* record type */
|
||||||
|
unsigned char length; /* remaining record bytes */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sdr_record_compact_sensor {
|
||||||
|
struct {
|
||||||
|
unsigned char owner_id;
|
||||||
|
unsigned char lun : 2, /* sensor owner lun */
|
||||||
|
__reserved : 2,
|
||||||
|
channel : 4; /* channel number */
|
||||||
|
unsigned char sensor_num; /* unique sensor number */
|
||||||
|
} keys;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char id; /* physical entity id */
|
||||||
|
unsigned char instance : 7, /* instance number */
|
||||||
|
logical : 1; /* physical/logical */
|
||||||
|
} entity;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
unsigned char sensor_scan : 1,
|
||||||
|
event_gen : 1,
|
||||||
|
type : 1,
|
||||||
|
hysteresis : 1,
|
||||||
|
thresholds : 1,
|
||||||
|
events : 1,
|
||||||
|
scanning : 1,
|
||||||
|
__reserved : 1;
|
||||||
|
} init;
|
||||||
|
struct {
|
||||||
|
unsigned char event_msg : 2,
|
||||||
|
threshold : 2,
|
||||||
|
hysteresis : 2,
|
||||||
|
rearm : 1,
|
||||||
|
ignore : 1;
|
||||||
|
} capabilities;
|
||||||
|
unsigned char type; /* sensor type */
|
||||||
|
} sensor;
|
||||||
|
|
||||||
|
unsigned char event_type; /* event/reading type code */
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned short assert_event; /* assertion event mask */
|
||||||
|
unsigned short deassert_event; /* de-assertion event mask */
|
||||||
|
unsigned short read; /* discrete reaading mask */
|
||||||
|
} discrete;
|
||||||
|
struct {
|
||||||
|
unsigned short lower; /* lower threshold reading mask */
|
||||||
|
unsigned short upper; /* upper threshold reading mask */
|
||||||
|
unsigned char set; /* settable threshold mask */
|
||||||
|
unsigned char read; /* readable threshold mask */
|
||||||
|
} threshold;
|
||||||
|
} mask;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char pct : 1,
|
||||||
|
modifier : 2,
|
||||||
|
rate : 3,
|
||||||
|
analog : 2;
|
||||||
|
struct {
|
||||||
|
unsigned char base;
|
||||||
|
unsigned char modifier;
|
||||||
|
} type;
|
||||||
|
} unit;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char count : 4,
|
||||||
|
mod_type : 2,
|
||||||
|
__reserved : 2;
|
||||||
|
unsigned char mod_offset : 7,
|
||||||
|
entity_inst : 1;
|
||||||
|
} share;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
unsigned char positive;
|
||||||
|
unsigned char negative;
|
||||||
|
} hysteresis;
|
||||||
|
} threshold;
|
||||||
|
|
||||||
|
unsigned char __reserved[3];
|
||||||
|
unsigned char oem; /* reserved for OEM use */
|
||||||
|
unsigned char id_code; /* sensor ID string type/length code */
|
||||||
|
unsigned char id_string[16]; /* sensor ID string bytes, only if id_code != 0 */
|
||||||
|
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sdr_record_full_sensor {
|
||||||
|
struct {
|
||||||
|
unsigned char owner_id;
|
||||||
|
unsigned char lun : 2, /* sensor owner lun */
|
||||||
|
__reserved : 2,
|
||||||
|
channel : 4; /* channel number */
|
||||||
|
unsigned char sensor_num; /* unique sensor number */
|
||||||
|
} keys;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char id; /* physical entity id */
|
||||||
|
unsigned char instance : 7, /* instance number */
|
||||||
|
logical : 1; /* physical/logical */
|
||||||
|
} entity;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
unsigned char sensor_scan : 1,
|
||||||
|
event_gen : 1,
|
||||||
|
type : 1,
|
||||||
|
hysteresis : 1,
|
||||||
|
thresholds : 1,
|
||||||
|
events : 1,
|
||||||
|
scanning : 1,
|
||||||
|
__reserved : 1;
|
||||||
|
} init;
|
||||||
|
struct {
|
||||||
|
unsigned char event_msg : 2,
|
||||||
|
threshold : 2,
|
||||||
|
hysteresis : 2,
|
||||||
|
rearm : 1,
|
||||||
|
ignore : 1;
|
||||||
|
} capabilities;
|
||||||
|
unsigned char type;
|
||||||
|
} sensor;
|
||||||
|
|
||||||
|
unsigned char event_type; /* event/reading type code */
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned short assert_event; /* assertion event mask */
|
||||||
|
unsigned short deassert_event; /* de-assertion event mask */
|
||||||
|
unsigned short read; /* discrete reaading mask */
|
||||||
|
} discrete;
|
||||||
|
struct {
|
||||||
|
unsigned short lower; /* lower threshold reading mask */
|
||||||
|
unsigned short upper; /* upper threshold reading mask */
|
||||||
|
unsigned char set; /* settable threshold mask */
|
||||||
|
unsigned char read; /* readable threshold mask */
|
||||||
|
} threshold;
|
||||||
|
} mask;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char pct : 1,
|
||||||
|
modifier : 2,
|
||||||
|
rate : 3,
|
||||||
|
analog : 2;
|
||||||
|
struct {
|
||||||
|
unsigned char base;
|
||||||
|
unsigned char modifier;
|
||||||
|
} type;
|
||||||
|
} unit;
|
||||||
|
|
||||||
|
unsigned char linearization; /* 70h=non linear, 71h-7Fh=non linear, OEM */
|
||||||
|
|
||||||
|
unsigned short mtol; /* M, tolerance */
|
||||||
|
|
||||||
|
unsigned long bacc; /* accuracy, B, Bexp, Rexp */
|
||||||
|
|
||||||
|
struct {
|
||||||
|
unsigned char nominal_read : 1, /* nominal reading field specified */
|
||||||
|
normal_max : 1, /* normal max field specified */
|
||||||
|
normal_min : 1, /* normal min field specified */
|
||||||
|
__reserved : 5;
|
||||||
|
} analog_flag;
|
||||||
|
|
||||||
|
unsigned char nominal_read; /* nominal reading, raw value */
|
||||||
|
unsigned char normal_max; /* normal maximum, raw value */
|
||||||
|
unsigned char normal_min; /* normal minimum, raw value */
|
||||||
|
unsigned char sensor_max; /* sensor maximum, raw value */
|
||||||
|
unsigned char sensor_min; /* sensor minimum, raw value */
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct {
|
||||||
|
unsigned char non_recover;
|
||||||
|
unsigned char critical;
|
||||||
|
unsigned char non_critical;
|
||||||
|
} upper;
|
||||||
|
struct {
|
||||||
|
unsigned char non_recover;
|
||||||
|
unsigned char critical;
|
||||||
|
unsigned char non_critical;
|
||||||
|
} lower;
|
||||||
|
struct {
|
||||||
|
unsigned char positive;
|
||||||
|
unsigned char negative;
|
||||||
|
} hysteresis;
|
||||||
|
} threshold;
|
||||||
|
unsigned char __reserved[2];
|
||||||
|
unsigned char oem; /* reserved for OEM use */
|
||||||
|
unsigned char id_code; /* sensor ID string type/length code */
|
||||||
|
unsigned char id_string[16]; /* sensor ID string bytes, only if id_code != 0 */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* unit description codes (IPMI v1.5 section 37.16) */
|
||||||
|
#define UNIT_MAX 0x90
|
||||||
|
static const char * unit_desc[] __attribute__((unused)) = {
|
||||||
|
"unspecified",
|
||||||
|
"degrees C", "degrees F", "degrees K",
|
||||||
|
"Volts", "Amps", "Watts", "Joules",
|
||||||
|
"Coulombs", "VA", "Nits",
|
||||||
|
"lumen", "lux", "Candela",
|
||||||
|
"kPa", "PSI", "Newton",
|
||||||
|
"CFM", "RPM", "Hz",
|
||||||
|
"microsecond", "millisecond", "second", "minute", "hour", "day", "week",
|
||||||
|
"mil", "inches", "feet", "cu in", "cu feet", "mm", "cm", "m", "cu cm", "cu m",
|
||||||
|
"liters", "fluid ounce",
|
||||||
|
"radians", "steradians", "revolutions", "cycles", "gravities",
|
||||||
|
"ounce", "pound", "ft-lb", "oz-in",
|
||||||
|
"gauss", "gilberts", "henry", "millihenry",
|
||||||
|
"farad", "microfarad", "ohms", "siemens", "mole", "becquerel",
|
||||||
|
"PPM", "reserved",
|
||||||
|
"Decibels", "DbA", "DbC",
|
||||||
|
"gray", "sievert", "color temp deg K",
|
||||||
|
"bit", "kilobit", "megabit", "gigabit",
|
||||||
|
"byte", "kilobyte", "megabyte", "gigabyte",
|
||||||
|
"word", "dword", "qword", "line",
|
||||||
|
"hit", "miss", "retry", "reset",
|
||||||
|
"overflow", "underrun",
|
||||||
|
"collision", "packets",
|
||||||
|
"messages", "characters",
|
||||||
|
"error", "correctable error", "uncorrectable error",
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* IPMI_SDR_H */
|
361
ipmitool/include/ipmitool/ipmi_sel.h
Normal file
361
ipmitool/include/ipmitool/ipmi_sel.h
Normal file
@ -0,0 +1,361 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_SEL_H
|
||||||
|
#define IPMI_SEL_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IPMI_EVENT_CLASS_DISCRETE,
|
||||||
|
IPMI_EVENT_CLASS_DIGITAL,
|
||||||
|
IPMI_EVENT_CLASS_THRESHOLD,
|
||||||
|
IPMI_EVENT_CLASS_OEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sel_get_rq {
|
||||||
|
unsigned short reserve_id;
|
||||||
|
unsigned short record_id;
|
||||||
|
unsigned char offset;
|
||||||
|
unsigned char length;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sel_event_record {
|
||||||
|
unsigned short record_id;
|
||||||
|
unsigned char record_type;
|
||||||
|
unsigned long timestamp;
|
||||||
|
unsigned short gen_id;
|
||||||
|
unsigned char evm_rev;
|
||||||
|
unsigned char sensor_type;
|
||||||
|
unsigned char sensor_num;
|
||||||
|
unsigned char event_type : 7;
|
||||||
|
unsigned char event_dir : 1;
|
||||||
|
unsigned char event_data[3];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sel_oem_record_ts {
|
||||||
|
unsigned short next_id;
|
||||||
|
unsigned short record_id;
|
||||||
|
unsigned char record_type;
|
||||||
|
unsigned long timestamp;
|
||||||
|
unsigned char mfg_id[3];
|
||||||
|
unsigned char oem_defined[6];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
struct sel_oem_record_nots {
|
||||||
|
unsigned short next_id;
|
||||||
|
unsigned short record_id;
|
||||||
|
unsigned char record_type;
|
||||||
|
unsigned char oem_defined[13];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
|
||||||
|
struct ipmi_event_sensor_types {
|
||||||
|
unsigned char code;
|
||||||
|
unsigned char offset;
|
||||||
|
unsigned char class;
|
||||||
|
const char * type;
|
||||||
|
const char * desc;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ipmi_event_sensor_types generic_event_types[] __attribute__((unused)) = {
|
||||||
|
/* Threshold Based States */
|
||||||
|
{ 0x01, 0x00, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Non-critical - going low" },
|
||||||
|
{ 0x01, 0x01, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Non-critical - going high" },
|
||||||
|
{ 0x01, 0x02, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Critical - going low" },
|
||||||
|
{ 0x01, 0x03, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Critical - going high" },
|
||||||
|
{ 0x01, 0x04, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Non-recoverable - going low" },
|
||||||
|
{ 0x01, 0x05, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Lower Non-recoverable - going high" },
|
||||||
|
{ 0x01, 0x06, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Non-critical - going low" },
|
||||||
|
{ 0x01, 0x07, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Non-critical - going high" },
|
||||||
|
{ 0x01, 0x08, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Critical - going low" },
|
||||||
|
{ 0x01, 0x09, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Critical - going high" },
|
||||||
|
{ 0x01, 0x0a, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Non-recoverable - going low" },
|
||||||
|
{ 0x01, 0x0b, IPMI_EVENT_CLASS_THRESHOLD, "Threshold", "Upper Non-recoverable - going high" },
|
||||||
|
/* DMI-based "usage state" States */
|
||||||
|
{ 0x02, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Usage State", "Transition to Idle" },
|
||||||
|
{ 0x02, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Usage State", "Transition to Active" },
|
||||||
|
{ 0x02, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Usage State", "Transition to Busy" },
|
||||||
|
/* Digital-Discrete Event States */
|
||||||
|
{ 0x03, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "State Deasserted" },
|
||||||
|
{ 0x03, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "State Asserted" },
|
||||||
|
{ 0x04, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Predictive Failure Deasserted" },
|
||||||
|
{ 0x04, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Predictive Failure Asserted" },
|
||||||
|
{ 0x05, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Limit Not Exceeded" },
|
||||||
|
{ 0x05, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Limit Exceeded" },
|
||||||
|
{ 0x06, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Performance Met" },
|
||||||
|
{ 0x06, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Digital State", "Performance Lags" },
|
||||||
|
/* Severity Event States */
|
||||||
|
{ 0x07, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to OK" },
|
||||||
|
{ 0x07, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Non-critial from OK" },
|
||||||
|
{ 0x07, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Critical from less severe" },
|
||||||
|
{ 0x07, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Non-recoverable from less severe" },
|
||||||
|
{ 0x07, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Non-critical from more severe" },
|
||||||
|
{ 0x07, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Critical from Non-recoverable" },
|
||||||
|
{ 0x07, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Transition to Non-recoverable" },
|
||||||
|
{ 0x07, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Monitor" },
|
||||||
|
{ 0x07, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Severity State", "Informational" },
|
||||||
|
/* Availability Status States */
|
||||||
|
{ 0x08, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Availability State", "Device Removed/Absent" },
|
||||||
|
{ 0x08, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Availability State", "Device Inserted/Present" },
|
||||||
|
{ 0x09, 0x00, IPMI_EVENT_CLASS_DIGITAL, "Availability State", "Device Disabled" },
|
||||||
|
{ 0x09, 0x01, IPMI_EVENT_CLASS_DIGITAL, "Availability State", "Device Enabled" },
|
||||||
|
{ 0x0a, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Running" },
|
||||||
|
{ 0x0a, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to In Test" },
|
||||||
|
{ 0x0a, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Power Off" },
|
||||||
|
{ 0x0a, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to On Line" },
|
||||||
|
{ 0x0a, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Off Line" },
|
||||||
|
{ 0x0a, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Off Duty" },
|
||||||
|
{ 0x0a, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Degraded" },
|
||||||
|
{ 0x0a, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Transition to Power Save" },
|
||||||
|
{ 0x0a, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Availability State", "Install Error" },
|
||||||
|
/* Redundancy States */
|
||||||
|
{ 0x0b, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Fully Redundant" },
|
||||||
|
{ 0x0b, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Redundancy Lost" },
|
||||||
|
{ 0x0b, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Redundancy Degraded" },
|
||||||
|
{ 0x0b, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Non-Redundant: Sufficient from Redundant" },
|
||||||
|
{ 0x0b, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Non-Redundant: Sufficient from Insufficient" },
|
||||||
|
{ 0x0b, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Non-Redundant: Insufficient Resources" },
|
||||||
|
{ 0x0b, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Redundancy Degraded from Fully Redundant" },
|
||||||
|
{ 0x0b, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Redundancy State", "Redundancy Degraded from Non-Redundant" },
|
||||||
|
/* ACPI Device Power States */
|
||||||
|
{ 0x0c, 0x00, IPMI_EVENT_CLASS_DISCRETE, "ACPI Device Power State", "D0 Power State" },
|
||||||
|
{ 0x0c, 0x01, IPMI_EVENT_CLASS_DISCRETE, "ACPI Device Power State", "D1 Power State" },
|
||||||
|
{ 0x0c, 0x02, IPMI_EVENT_CLASS_DISCRETE, "ACPI Device Power State", "D2 Power State" },
|
||||||
|
{ 0x0c, 0x03, IPMI_EVENT_CLASS_DISCRETE, "ACPI Device Power State", "D3 Power State" },
|
||||||
|
/* END */
|
||||||
|
{ 0x00, 0x00, 0x00, NULL, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unused)) = {
|
||||||
|
{ 0x00, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Reserved", NULL },
|
||||||
|
{ 0x01, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Temperature", NULL },
|
||||||
|
{ 0x02, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Voltage", NULL },
|
||||||
|
{ 0x03, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Current", NULL },
|
||||||
|
{ 0x04, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Fan", NULL },
|
||||||
|
|
||||||
|
{ 0x05, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "General Chassis intrusion" },
|
||||||
|
{ 0x05, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "Drive Bay intrusion" },
|
||||||
|
{ 0x05, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "I/O Card area intrusion" },
|
||||||
|
{ 0x05, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "Processor area intrusion" },
|
||||||
|
{ 0x05, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "System unplugged from LAN" },
|
||||||
|
{ 0x05, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "Unauthorized dock/undock" },
|
||||||
|
{ 0x05, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Physical Security", "FAN area intrusion" },
|
||||||
|
|
||||||
|
{ 0x06, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Front Panel Lockout violation attempted" },
|
||||||
|
{ 0x06, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Pre-boot password viiolation - user password" },
|
||||||
|
{ 0x06, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Pre-boot password violation - setup password" },
|
||||||
|
{ 0x06, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Pre-boot password violation - network boot password" },
|
||||||
|
{ 0x06, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Other pre-boot password violation" },
|
||||||
|
{ 0x06, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Platform Security", "Out-of-band access password violation" },
|
||||||
|
|
||||||
|
{ 0x07, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Processor", "IERR" },
|
||||||
|
{ 0x07, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Thermal Trip" },
|
||||||
|
{ 0x07, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Processor", "FRB1/BIST failure" },
|
||||||
|
{ 0x07, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Processor", "FRB2/Hang in POST failure" },
|
||||||
|
{ 0x07, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Processor", "FRB3/Processor startup/init failure" },
|
||||||
|
{ 0x07, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Configuration Error" },
|
||||||
|
{ 0x07, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Processor", "SM BIOS Uncorrectable CPU-complex Error" },
|
||||||
|
{ 0x07, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Presence detected" },
|
||||||
|
{ 0x07, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Disabled" },
|
||||||
|
{ 0x07, 0x09, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Terminator presence detected" },
|
||||||
|
|
||||||
|
{ 0x08, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Presence detected" },
|
||||||
|
{ 0x08, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Failure detected" },
|
||||||
|
{ 0x08, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Predictive failure" },
|
||||||
|
{ 0x08, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Power Supply AC lost" },
|
||||||
|
{ 0x08, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "AC lost or out-of-range" },
|
||||||
|
{ 0x08, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "AC out-of-range, but present" },
|
||||||
|
|
||||||
|
{ 0x09, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Power off/down" },
|
||||||
|
{ 0x09, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Power cycle" },
|
||||||
|
{ 0x09, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "240VA power down" },
|
||||||
|
{ 0x09, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Interlock power down" },
|
||||||
|
{ 0x09, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "AC lost" },
|
||||||
|
{ 0x09, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Soft-power control failure" },
|
||||||
|
{ 0x09, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Failure detected" },
|
||||||
|
{ 0x09, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Predictive failure" },
|
||||||
|
|
||||||
|
{ 0x0a, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Cooling Device", NULL },
|
||||||
|
{ 0x0b, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Other Units-based Sensor", NULL },
|
||||||
|
|
||||||
|
{ 0x0c, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Correctable ECC" },
|
||||||
|
{ 0x0c, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Uncorrectable ECC" },
|
||||||
|
{ 0x0c, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Parity" },
|
||||||
|
{ 0x0c, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Memory Scrub Failed" },
|
||||||
|
{ 0x0c, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Memory Device Disabled" },
|
||||||
|
{ 0x0c, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Correctable ECC logging limit reached" },
|
||||||
|
|
||||||
|
{ 0x0d, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Drive Slot", NULL },
|
||||||
|
{ 0x0e, 0x00, IPMI_EVENT_CLASS_DISCRETE, "POST Memory Resize", NULL },
|
||||||
|
|
||||||
|
{ 0x0f, 0x00, IPMI_EVENT_CLASS_DISCRETE, "System Firmware", "Error" },
|
||||||
|
{ 0x0f, 0x01, IPMI_EVENT_CLASS_DISCRETE, "System Firmware", "Hang" },
|
||||||
|
{ 0x0f, 0x02, IPMI_EVENT_CLASS_DISCRETE, "System Firmware", "Progress" },
|
||||||
|
|
||||||
|
{ 0x10, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Event Logging Disabled", "Correctable memory error logging disabled" },
|
||||||
|
{ 0x10, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Event Logging Disabled", "Event logging disabled" },
|
||||||
|
{ 0x10, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Event Logging Disabled", "Log area reset/cleared" },
|
||||||
|
{ 0x10, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Event Logging Disabled", "All event logging disabled" },
|
||||||
|
|
||||||
|
{ 0x11, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "BIOS Reset" },
|
||||||
|
{ 0x11, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS Reset" },
|
||||||
|
{ 0x11, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS Shut Down" },
|
||||||
|
{ 0x11, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS Power Down" },
|
||||||
|
{ 0x11, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS Power Cycle" },
|
||||||
|
{ 0x11, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS NMI/diag Interrupt" },
|
||||||
|
{ 0x11, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS Expired" },
|
||||||
|
{ 0x11, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 1", "OS pre-timeout Interrupt" },
|
||||||
|
|
||||||
|
{ 0x12, 0x00, IPMI_EVENT_CLASS_DISCRETE, "System Event", "System Reconfigured" },
|
||||||
|
{ 0x12, 0x01, IPMI_EVENT_CLASS_DISCRETE, "System Event", "OEM System boot event" },
|
||||||
|
{ 0x12, 0x02, IPMI_EVENT_CLASS_DISCRETE, "System Event", "Undetermined system hardware failure" },
|
||||||
|
{ 0x12, 0x03, IPMI_EVENT_CLASS_DISCRETE, "System Event", "Entry added to auxillary log" },
|
||||||
|
{ 0x12, 0x04, IPMI_EVENT_CLASS_DISCRETE, "System Event", "PEF Action" },
|
||||||
|
{ 0x12, 0x05, IPMI_EVENT_CLASS_DISCRETE, "System Event", "Timestamp Clock Sync." },
|
||||||
|
|
||||||
|
{ 0x13, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Front Panel NMI" },
|
||||||
|
{ 0x13, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Timeout" },
|
||||||
|
{ 0x13, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "I/O Channel check NMI" },
|
||||||
|
{ 0x13, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Software NMI" },
|
||||||
|
{ 0x13, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "PCI PERR" },
|
||||||
|
{ 0x13, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "PCI SERR" },
|
||||||
|
{ 0x13, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "EISA failsafe timeout" },
|
||||||
|
{ 0x13, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Correctable error" },
|
||||||
|
{ 0x13, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Uncorrectable error" },
|
||||||
|
{ 0x13, 0x09, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Fatal NMI" },
|
||||||
|
|
||||||
|
{ 0x14, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Button", "Power Button pressed" },
|
||||||
|
{ 0x14, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Button", "Sleep Button pressed" },
|
||||||
|
{ 0x14, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Button", "Reset Button pressed" },
|
||||||
|
|
||||||
|
{ 0x15, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Module/Board", NULL },
|
||||||
|
{ 0x16, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Microcontroller/Coprocessor", NULL },
|
||||||
|
{ 0x17, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Add-in Card", NULL },
|
||||||
|
{ 0x18, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Chassis", NULL },
|
||||||
|
{ 0x19, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Chip Set", NULL },
|
||||||
|
{ 0x1a, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Other FRU", NULL },
|
||||||
|
{ 0x1b, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Cable/Interconnect", NULL },
|
||||||
|
{ 0x1c, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Terminator", NULL },
|
||||||
|
|
||||||
|
{ 0x1d, 0x00, IPMI_EVENT_CLASS_DISCRETE, "System Boot Initiated", "Initiated by power up" },
|
||||||
|
{ 0x1d, 0x01, IPMI_EVENT_CLASS_DISCRETE, "System Boot Initiated", "Initiated by hard reset" },
|
||||||
|
{ 0x1d, 0x02, IPMI_EVENT_CLASS_DISCRETE, "System Boot Initiated", "Initiated by warm reset" },
|
||||||
|
{ 0x1d, 0x03, IPMI_EVENT_CLASS_DISCRETE, "System Boot Initiated", "User requested PXE boot" },
|
||||||
|
{ 0x1d, 0x04, IPMI_EVENT_CLASS_DISCRETE, "System Boot Initiated", "Automatic boot to diagnostic" },
|
||||||
|
|
||||||
|
{ 0x1e, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Boot Error", "No bootable media" },
|
||||||
|
{ 0x1e, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Boot Error", "Non-bootable disk in drive" },
|
||||||
|
{ 0x1e, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Boot Error", "PXE server not found" },
|
||||||
|
{ 0x1e, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Boot Error", "Invalid boot sector" },
|
||||||
|
{ 0x1e, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Boot Error", "Timeout waiting for selection" },
|
||||||
|
|
||||||
|
{ 0x1f, 0x00, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "A: boot completed" },
|
||||||
|
{ 0x1f, 0x01, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "C: boot completed" },
|
||||||
|
{ 0x1f, 0x02, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "PXE boot completed" },
|
||||||
|
{ 0x1f, 0x03, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "Diagnostic boot completed" },
|
||||||
|
{ 0x1f, 0x04, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "CD-ROM boot completed" },
|
||||||
|
{ 0x1f, 0x05, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "ROM boot completed" },
|
||||||
|
{ 0x1f, 0x06, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "boot completed - device not specified" },
|
||||||
|
|
||||||
|
{ 0x20, 0x00, IPMI_EVENT_CLASS_DISCRETE, "OS Critical Stop", "Stop during OS load/init" },
|
||||||
|
{ 0x20, 0x01, IPMI_EVENT_CLASS_DISCRETE, "OS Critical Stop", "Run-time stop" },
|
||||||
|
|
||||||
|
{ 0x21, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Fault Status asserted" },
|
||||||
|
{ 0x21, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Identify Status asserted" },
|
||||||
|
{ 0x21, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot/Connector Device installed/attached" },
|
||||||
|
{ 0x21, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot/Connector ready for device installation" },
|
||||||
|
{ 0x21, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot/Connector ready for device removal" },
|
||||||
|
{ 0x21, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot Power is off" },
|
||||||
|
{ 0x21, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot/Connector device removal request" },
|
||||||
|
{ 0x21, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Interlock asserted" },
|
||||||
|
{ 0x21, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Slot/Connector", "Slot is disabled" },
|
||||||
|
|
||||||
|
{ 0x22, 0x00, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S0/G0: working" },
|
||||||
|
{ 0x22, 0x01, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S1: sleeping with system hw & processor context maintained" },
|
||||||
|
{ 0x22, 0x02, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S2: sleeping, processor context lost" },
|
||||||
|
{ 0x22, 0x03, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S3: sleeping, processor & hw context lost, memory retained" },
|
||||||
|
{ 0x22, 0x04, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S4: non-volatile sleep/suspend-to-disk" },
|
||||||
|
{ 0x22, 0x05, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S5/G2: soft-off" },
|
||||||
|
{ 0x22, 0x06, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S4/S5: soft-off" },
|
||||||
|
{ 0x22, 0x07, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "G3: mechanical off" },
|
||||||
|
{ 0x22, 0x08, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "Sleeping in S1/S2/S3 state" },
|
||||||
|
{ 0x22, 0x09, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "G1: sleeping" },
|
||||||
|
{ 0x22, 0x0a, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "S5: entered by override" },
|
||||||
|
{ 0x22, 0x0b, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "Legacy ON state" },
|
||||||
|
{ 0x22, 0x0c, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "Legacy OFF state" },
|
||||||
|
{ 0x22, 0x0e, IPMI_EVENT_CLASS_DISCRETE, "System ACPI Power State", "Unknown" },
|
||||||
|
|
||||||
|
{ 0x23, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "Timer expired" },
|
||||||
|
{ 0x23, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "Hard reset" },
|
||||||
|
{ 0x23, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "Power down" },
|
||||||
|
{ 0x23, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "Power cycle" },
|
||||||
|
{ 0x23, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "reserved" },
|
||||||
|
{ 0x23, 0x05, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "reserved" },
|
||||||
|
{ 0x23, 0x06, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "reserved" },
|
||||||
|
{ 0x23, 0x07, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "reserved" },
|
||||||
|
{ 0x23, 0x08, IPMI_EVENT_CLASS_DISCRETE, "Watchdog 2", "Timer interrupt" },
|
||||||
|
|
||||||
|
{ 0x24, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Platform Alert", "Platform generated page" },
|
||||||
|
{ 0x24, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Platform Alert", "Platform generated LAN alert" },
|
||||||
|
{ 0x24, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Platform Alert", "Platform Event Trap generated" },
|
||||||
|
{ 0x24, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Platform Alert", "Platform generated SNMP trap, OEM format" },
|
||||||
|
|
||||||
|
{ 0x25, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Entity Presence", "Present" },
|
||||||
|
{ 0x25, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Entity Presence", "Absent" },
|
||||||
|
{ 0x25, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Entity Presence", "Disabled" },
|
||||||
|
|
||||||
|
{ 0x26, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Monitor ASIC/IC", NULL },
|
||||||
|
|
||||||
|
{ 0x27, 0x00, IPMI_EVENT_CLASS_DISCRETE, "LAN", "Heartbeat Lost" },
|
||||||
|
{ 0x27, 0x01, IPMI_EVENT_CLASS_DISCRETE, "LAN", "Heartbeat" },
|
||||||
|
|
||||||
|
{ 0x28, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Management Subsystem Health", "Sensor access degraded or unavailable" },
|
||||||
|
{ 0x28, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Management Subsystem Health", "Controller access degraded or unavailable" },
|
||||||
|
{ 0x28, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Management Subsystem Health", "Management controller off-line" },
|
||||||
|
{ 0x28, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Management Subsystem Health", "Management controller unavailable" },
|
||||||
|
|
||||||
|
{ 0x29, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Battery", "Low" },
|
||||||
|
{ 0x29, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Battery", "Failed" },
|
||||||
|
{ 0x29, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Battery", "Presence Detected" },
|
||||||
|
|
||||||
|
{ 0x00, 0x00, 0x00, NULL, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
int ipmi_sel_main(struct ipmi_intf *, int, char **);
|
||||||
|
void ipmi_sel_print_std_entry(int num, struct sel_event_record * evt);
|
||||||
|
|
||||||
|
#endif /* IPMI_SEL_H */
|
55
ipmitool/include/ipmitool/ipmi_sol.h
Normal file
55
ipmitool/include/ipmitool/ipmi_sol.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_SOL_H
|
||||||
|
#define IPMI_SOL_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define ACTIVATE_SOL 0x01
|
||||||
|
#define SET_SOL_CONFIG 0x03
|
||||||
|
#define GET_SOL_CONFIG 0x04
|
||||||
|
|
||||||
|
#define SOL_ENABLE_PARAM 0x01
|
||||||
|
#define SOL_AUTHENTICATION_PARAM 0x02
|
||||||
|
#define SOL_ENABLE_FLAG 0x01
|
||||||
|
#define SOL_PRIVILEGE_LEVEL_USER 0x02
|
||||||
|
#define SOL_BAUD_RATE_PARAM 0x05
|
||||||
|
#define SOL_PREFERRED_BAUD_RATE 0x07
|
||||||
|
|
||||||
|
int ipmi_sol_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
|
#endif /* IPMI_SOL_H */
|
@ -1,53 +1,95 @@
|
|||||||
Summary: Utility for interfacing with IPMI hardware
|
Name: @IPMITOOL_PKG@
|
||||||
Name: ipmitool
|
Summary: @IPMITOOL_PKG@ - Utility for interfacing with IPMI devices
|
||||||
Version: @@VERSION@@
|
Version: @VERSION@
|
||||||
Release: 1
|
Release: 1
|
||||||
Copyright: Sun Microsystems
|
Copyright: BSD
|
||||||
License: BSD
|
Group: Utilities
|
||||||
Group: Applications/System
|
Vendor: Sun Microsystems
|
||||||
Source: ipmitool.tar.gz
|
Packager: Duncan Laurie <duncan@sun.com>
|
||||||
|
Source: @IPMITOOL_PKG@-@VERSION@.tar.gz
|
||||||
|
Buildroot: /var/tmp/@IPMITOOL_PKG@-root
|
||||||
|
|
||||||
|
%package dev
|
||||||
|
Summary: Development files for ipmitool
|
||||||
|
Group: Utilities
|
||||||
|
|
||||||
%description
|
%description
|
||||||
This package contains a utility for interfacing with IPMI
|
This package contains a utility for interfacing with IPMI-enabled devices
|
||||||
hardware through either the Linux OpenIPMI kernel driver or
|
through either the OpenIPMI kernel driver or with IPMI-over-LAN protocol.
|
||||||
over ethernet LAN. It provides some basic functions for
|
It provides some basic functions for reading the SDR and displaying sensor
|
||||||
reading the SDR and displaying sensor values, printing FRU
|
values, displaying the contents of the SEL, printing FRU information,
|
||||||
information, LAN configuration, and chassis power control.
|
reading and setting LAN configuration, and chassis power control.
|
||||||
|
|
||||||
|
%description dev
|
||||||
|
Additional development files for creating applications or interface plugins
|
||||||
|
for ipmitool.
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
[ "$RPM_BUILD_ROOT" ] && rm -rf $RPM_BUILD_ROOT
|
if [ "$RPM_BUILD_ROOT" ] && [ "$RPM_BUILD_ROOT" != "/" ]; then
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
fi
|
||||||
|
|
||||||
%setup -q -n ipmitool
|
%setup
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/sbin
|
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/share/man/man1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
./configure @ac_configure_args@ \
|
||||||
|
--prefix=%{_prefix} \
|
||||||
|
--bindir=%{_bindir} \
|
||||||
|
--datadir=%{_datadir} \
|
||||||
|
--includedir=%{_includedir} \
|
||||||
|
--libdir=%{_libdir} \
|
||||||
|
--mandir=%{_mandir} \
|
||||||
|
--sysconfdir=%{_sysconfdir}
|
||||||
make
|
make
|
||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/sbin
|
make DESTDIR=$RPM_BUILD_ROOT install
|
||||||
make install DESTDIR=$RPM_BUILD_ROOT
|
|
||||||
make install-man DESTDIR=$RPM_BUILD_ROOT
|
|
||||||
install -m 0755 -o root -g root bmcautoconf.sh $RPM_BUILD_ROOT/usr/sbin
|
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
rm -rf $RPM_BUILD_ROOT
|
if [ "$RPM_BUILD_ROOT" ] && [ "$RPM_BUILD_ROOT" != "/" ]; then
|
||||||
|
rm -rf $RPM_BUILD_ROOT
|
||||||
|
fi
|
||||||
|
rm -rf $RPM_BUILD_DIR/@IPMITOOL_PKG@-@VERSION@
|
||||||
|
|
||||||
%files
|
%files
|
||||||
/usr/sbin/ipmitool
|
%defattr(-,root,root)
|
||||||
/usr/sbin/bmcautoconf.sh
|
%doc %{_mandir}/man1/*
|
||||||
/usr/share/man/man1/ipmitool.1.gz
|
%{_bindir}/*
|
||||||
|
%dir %{_libdir}/ipmitool
|
||||||
|
%attr(755,root,root) %{_libdir}/ipmitool/*
|
||||||
|
|
||||||
|
%files dev
|
||||||
|
%defattr(-,root,root)
|
||||||
|
%dir %{_includedir}/ipmitool
|
||||||
|
%{_includedir}/ipmitool/*.h
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Wed Nov 12 2003 <duncan@sun.com> 1.4.1.1-1
|
* Fri Nov 14 2003 <duncan@sun.com> 1.5.4-1
|
||||||
- first public release
|
- pull interface plugin api into library
|
||||||
|
- fix ipmievd
|
||||||
|
|
||||||
|
* Fri Oct 31 2003 <duncan@sun.com> 1.5.3-1
|
||||||
|
- add -g optin for pedantic ipmi-over-lan communication
|
||||||
|
|
||||||
|
* Fri Oct 24 2003 <duncan@sun.com> 1.5.2-1
|
||||||
|
- add gratuitous arp interval setting
|
||||||
|
|
||||||
|
* Wed Oct 8 2003 <duncan@sun.com> 1.5.1-1
|
||||||
|
- better SEL support
|
||||||
|
- fix display bug in SDR list
|
||||||
|
|
||||||
|
* Fri Sep 5 2003 <duncan@sun.com> 1.5.0-1
|
||||||
|
- use automake/autoconf/libtool
|
||||||
|
- dynamic loading interface plugins
|
||||||
|
|
||||||
* Wed May 28 2003 <duncan@sun.com> 1.4.0-1
|
* Wed May 28 2003 <duncan@sun.com> 1.4.0-1
|
||||||
- make UDP packet handling more robust
|
- make UDP packet handling more robust
|
||||||
|
- fix imb driver support
|
||||||
|
|
||||||
* Thu May 22 2003 <duncan@sun.com> 1.3-1
|
* Thu May 22 2003 <duncan@sun.com> 1.3-1
|
||||||
- update manpage
|
- update manpage
|
||||||
- rework of low-level network handling
|
- rework of low-level network handling
|
||||||
|
- add basic imb driver support
|
||||||
|
|
||||||
* Wed Apr 2 2003 <duncan@sun.com> 1.2-1
|
* Wed Apr 2 2003 <duncan@sun.com> 1.2-1
|
||||||
- change command line option parsing
|
- change command line option parsing
|
||||||
|
43
ipmitool/lib/Makefile.am
Normal file
43
ipmitool/lib/Makefile.am
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libipmitool.la
|
||||||
|
libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_lanp.c \
|
||||||
|
ipmi_fru.c ipmi_chassis.c ipmi_bmc.c ipmi_intf.c
|
||||||
|
libipmitool_la_LDFLAGS = -export-dynamic
|
||||||
|
libipmitool_la_LIBADD = -lm $(LIBLTDL)
|
||||||
|
libipmitool_la_DEPENDENCIES = $(LIBLTDL)
|
@ -37,7 +37,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <helper.h>
|
#include <ipmitool/helper.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -115,18 +115,13 @@ void signal_handler(int sig, void * handler)
|
|||||||
act.sa_flags = 0;
|
act.sa_flags = 0;
|
||||||
|
|
||||||
if (sigemptyset(&act.sa_mask) < 0) {
|
if (sigemptyset(&act.sa_mask) < 0) {
|
||||||
printf("SIGNAL[%s] unable to empty signal set\n",
|
psignal(sig, "unable to empty signal set");
|
||||||
(char *)strsignal(sig));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sigaction(sig, &act, NULL) < 0) {
|
if (sigaction(sig, &act, NULL) < 0) {
|
||||||
printf("SIGNAL[%s] unable to register handler @ %p\n",
|
psignal(sig, "unable to register handler");
|
||||||
(char *)strsignal(sig), (void *)handler);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("SIGNAL[%s]: handler registered @ %p\n",
|
|
||||||
(char *)strsignal(sig), (void *)handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
91
ipmitool/lib/ipmi_bmc.c
Normal file
91
ipmitool/lib/ipmi_bmc.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_bmc.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static int ipmi_bmc_reset(struct ipmi_intf * intf, int cmd)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = cmd;
|
||||||
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp) {
|
||||||
|
printf("Error in BMC Reset Command\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (rsp->ccode) {
|
||||||
|
printf("BMC Reset Command returned %x\n", rsp->ccode);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_bmc_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc || !strncmp(argv[0], "help", 4)) {
|
||||||
|
printf("BMC Commands: reset\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "reset", 5)) {
|
||||||
|
if (argc < 2 || !strncmp(argv[1], "help", 4)) {
|
||||||
|
printf("reset commands: warm, cold\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[1], "cold", 4)) {
|
||||||
|
ipmi_bmc_reset(intf, BMC_COLD_RESET);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[1], "warm", 4)) {
|
||||||
|
ipmi_bmc_reset(intf, BMC_WARM_RESET);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("reset commands: warm, cold\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
506
ipmitool/lib/ipmi_chassis.c
Normal file
506
ipmitool/lib/ipmi_chassis.c
Normal file
@ -0,0 +1,506 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_chassis.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static int ipmi_chassis_power_status(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x1;
|
||||||
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("error in Chassis Status Command\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Chassis Power is %s\n", (rsp->data[0] & 0x1) ? "on" : "off");
|
||||||
|
|
||||||
|
return rsp->data[0] & 0x1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct valstr ipmi_chassis_power_control_vals[] = {
|
||||||
|
{ 0x00, "Down/Off" },
|
||||||
|
{ 0x01, "Up/On" },
|
||||||
|
{ 0x02, "Cycle" },
|
||||||
|
{ 0x03, "Reset" },
|
||||||
|
{ 0x04, "Pulse" },
|
||||||
|
{ 0x05, "Soft" },
|
||||||
|
{ 0x00, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ipmi_chassis_power_control(struct ipmi_intf * intf, unsigned char ctl)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x2;
|
||||||
|
req.msg.data = &ctl;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
printf("Chassis Power Control: %s\n",
|
||||||
|
val2str(ctl, ipmi_chassis_power_control_vals));
|
||||||
|
|
||||||
|
intf->sendrecv(intf, &req);
|
||||||
|
intf->abort = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_identify(struct ipmi_intf * intf, char * arg)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x4;
|
||||||
|
|
||||||
|
printf("Chassis identify interval: ");
|
||||||
|
|
||||||
|
if (arg) {
|
||||||
|
unsigned char interval = (unsigned char)atoi(arg);
|
||||||
|
|
||||||
|
req.msg.data = &interval;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
if (interval)
|
||||||
|
printf("%d seconds\n", interval);
|
||||||
|
else
|
||||||
|
printf("off\n");
|
||||||
|
} else {
|
||||||
|
printf("default (15 seconds)\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
intf->sendrecv(intf, &req);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_poh(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned long count;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0xf;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memcpy(&count, rsp->data+1, 4);
|
||||||
|
|
||||||
|
printf("POH Counter : %li hours total (%li days, %li hours)\n",
|
||||||
|
count, (unsigned long)(count / 24), (unsigned long)(count % 24));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_restart_cause(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x7;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("System restart cause: ");
|
||||||
|
|
||||||
|
switch (rsp->data[0] & 0xf) {
|
||||||
|
case 0:
|
||||||
|
printf("unknown\n");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
printf("chassis power control command\n");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
printf("reset via pushbutton\n");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
printf("power-up via pushbutton\n");
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
printf("watchdog expired\n");
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
printf("OEM\n");
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
printf("power-up due to always-restore power policy\n");
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
printf("power-up due to restore-previous power policy\n");
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
printf("reset via PEF\n");
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
printf("power-cycle via PEF\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("error!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_status(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* byte 1 */
|
||||||
|
printf("System Power : %s\n", (rsp->data[0] & 0x1) ? "on" : "off");
|
||||||
|
printf("Power Overload : %s\n", (rsp->data[0] & 0x2) ? "true" : "false");
|
||||||
|
printf("Power Interlock : %s\n", (rsp->data[0] & 0x4) ? "active" : "inactive");
|
||||||
|
printf("Main Power Fault : %s\n", (rsp->data[0] & 0x8) ? "true" : "false");
|
||||||
|
printf("Power Control Fault : %s\n", (rsp->data[0] & 0x10) ? "true" : "false");
|
||||||
|
printf("Power Restore Policy : ");
|
||||||
|
switch ((rsp->data[0] & 0x60) >> 5) {
|
||||||
|
case 0x0:
|
||||||
|
printf("always-off\n");
|
||||||
|
break;
|
||||||
|
case 0x1:
|
||||||
|
printf("previous\n");
|
||||||
|
break;
|
||||||
|
case 0x2:
|
||||||
|
printf("always-on\n");
|
||||||
|
break;
|
||||||
|
case 0x3:
|
||||||
|
default:
|
||||||
|
printf("unknown\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* byte 2 */
|
||||||
|
printf("Last Power Event : ");
|
||||||
|
if (rsp->data[1] & 0x1)
|
||||||
|
printf("ac-failed ");
|
||||||
|
if (rsp->data[1] & 0x2)
|
||||||
|
printf("overload ");
|
||||||
|
if (rsp->data[1] & 0x4)
|
||||||
|
printf("interlock ");
|
||||||
|
if (rsp->data[1] & 0x8)
|
||||||
|
printf("fault ");
|
||||||
|
if (rsp->data[1] & 0x10)
|
||||||
|
printf("command");
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
/* byte 3 */
|
||||||
|
printf("Chassis Intrusion : %s\n", (rsp->data[2] & 0x1) ? "active" : "inactive");
|
||||||
|
printf("Front-Panel Lockout : %s\n", (rsp->data[2] & 0x2) ? "active" : "inactive");
|
||||||
|
printf("Drive Fault : %s\n", (rsp->data[2] & 0x4) ? "true" : "false");
|
||||||
|
printf("Cooling/Fan Fault : %s\n", (rsp->data[2] & 0x8) ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_set_bootparam(struct ipmi_intf * intf, unsigned char param, unsigned char * data, int len)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char msg_data[16];
|
||||||
|
|
||||||
|
memset(msg_data, 0, 16);
|
||||||
|
msg_data[0] = param & 0x7f;
|
||||||
|
memcpy(msg_data+1, data, len);
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x8;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = len + 1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error setting Chassis Boot Parameter %d\n", param);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Chassis Set Boot Param %d to %s\n", param, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char msg_data[3];
|
||||||
|
|
||||||
|
if (!arg)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(msg_data, 0, 3);
|
||||||
|
|
||||||
|
msg_data[0] = (unsigned char)atoi(arg) & 0x7f;
|
||||||
|
msg_data[1] = 0;
|
||||||
|
msg_data[2] = 0;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x9;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (verbose > 2)
|
||||||
|
printbuf(rsp->data, rsp->data_len, "Boot Option");
|
||||||
|
|
||||||
|
printf("Boot parameter version: %d\n", rsp->data[0]);
|
||||||
|
printf("Boot parameter %d is %s\n", rsp->data[1] & 0x7f,
|
||||||
|
(rsp->data[1] & 0x80) ? "invalid/locked" : "valid/unlocked");
|
||||||
|
printf("Boot parameter data: %s\n", buf2str(rsp->data+2, rsp->data_len - 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_set_bootflag(struct ipmi_intf * intf, char * arg)
|
||||||
|
{
|
||||||
|
unsigned char flags[5];
|
||||||
|
|
||||||
|
if (!arg) {
|
||||||
|
printf("Error: no bootflag argument supplied\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(arg, "force_pxe", 9)) {
|
||||||
|
flags[1] = 0x04; // 00000100
|
||||||
|
}
|
||||||
|
else if (!strncmp(arg, "force_disk", 10)) {
|
||||||
|
flags[1] = 0x08; // 00001000
|
||||||
|
}
|
||||||
|
else if (!strncmp(arg, "force_diag", 10)) {
|
||||||
|
flags[1] = 0x10; // 00010000
|
||||||
|
}
|
||||||
|
else if (!strncmp(arg, "force_cdrom", 11)) {
|
||||||
|
flags[1] = 0x14; // 00010100
|
||||||
|
}
|
||||||
|
else if (!strncmp(arg, "force_floppy", 12)) {
|
||||||
|
flags[1] = 0x3c; // 00111100
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Invalid bootflag: %s\n", arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
flags[0] = 0x80; /* set flag valid bit */
|
||||||
|
ipmi_chassis_set_bootparam(intf, 5, flags, 5);
|
||||||
|
|
||||||
|
flags[0] = 0x08; /* don't automatically clear boot flag valid bit in 60 seconds */
|
||||||
|
ipmi_chassis_set_bootparam(intf, 3, flags, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_chassis_power_policy(struct ipmi_intf * intf, unsigned char policy)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
if (!policy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_CHASSIS;
|
||||||
|
req.msg.cmd = 0x6;
|
||||||
|
req.msg.data = &policy;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (policy == IPMI_CHASSIS_POLICY_NO_CHANGE) {
|
||||||
|
printf("Supported chassis power policy: ");
|
||||||
|
if (rsp->data[0] & (1<<IPMI_CHASSIS_POLICY_ALWAYS_OFF))
|
||||||
|
printf("always-off ");
|
||||||
|
if (rsp->data[0] & (1<<IPMI_CHASSIS_POLICY_ALWAYS_ON))
|
||||||
|
printf("always-on ");
|
||||||
|
if (rsp->data[0] & (1<<IPMI_CHASSIS_POLICY_PREVIOUS))
|
||||||
|
printf("previous");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Set chassis power restore policy to ");
|
||||||
|
switch (policy) {
|
||||||
|
case IPMI_CHASSIS_POLICY_ALWAYS_ON:
|
||||||
|
printf("always-on\n");
|
||||||
|
break;
|
||||||
|
case IPMI_CHASSIS_POLICY_ALWAYS_OFF:
|
||||||
|
printf("always-off\n");
|
||||||
|
break;
|
||||||
|
case IPMI_CHASSIS_POLICY_PREVIOUS:
|
||||||
|
printf("previous\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("unknown\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc || !strncmp(argv[0], "help", 4)) {
|
||||||
|
printf("Chassis Commands: status, power, identify, policy, restart_cause, poh\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "status", 6)) {
|
||||||
|
ipmi_chassis_status(intf);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "power", 5)) {
|
||||||
|
unsigned char ctl = 0;
|
||||||
|
|
||||||
|
if (argc < 2 || !strncmp(argv[1], "help", 4)) {
|
||||||
|
printf("chassis power Commands: status, on, off, cycle, reset, diag, soft\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!strncmp(argv[1], "status", 6)) {
|
||||||
|
ipmi_chassis_power_status(intf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(argv[1], "up", 2) || !strncmp(argv[1], "on", 2))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_POWER_UP;
|
||||||
|
else if (!strncmp(argv[1], "down", 4) || !strncmp(argv[1], "off", 3))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_POWER_DOWN;
|
||||||
|
else if (!strncmp(argv[1], "cycle", 5))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_POWER_CYCLE;
|
||||||
|
else if (!strncmp(argv[1], "reset", 5))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_HARD_RESET;
|
||||||
|
else if (!strncmp(argv[1], "diag", 5))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_PULSE_DIAG;
|
||||||
|
else if (!strncmp (argv[1], "acpi", 4) || !strncmp(argv[1], "soft", 4))
|
||||||
|
ctl = IPMI_CHASSIS_CTL_ACPI_SOFT;
|
||||||
|
else {
|
||||||
|
printf("Invalid chassis power command: %s\n", argv[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipmi_chassis_power_control(intf, ctl);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "identify", 8)) {
|
||||||
|
if (argc < 2) {
|
||||||
|
ipmi_chassis_identify(intf, NULL);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[1], "help", 4)) {
|
||||||
|
printf("chassis identify <interval>\n");
|
||||||
|
printf(" default is 15 seconds\n");
|
||||||
|
printf(" 0 to turn off\n");
|
||||||
|
} else {
|
||||||
|
ipmi_chassis_identify(intf, argv[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "poh", 3)) {
|
||||||
|
ipmi_chassis_poh(intf);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "restart_cause", 13)) {
|
||||||
|
ipmi_chassis_restart_cause(intf);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "policy", 4)) {
|
||||||
|
if (argc < 2 || !strncmp(argv[1], "help", 4)) {
|
||||||
|
printf("chassis policy <state>\n");
|
||||||
|
printf(" list : return supported policies\n");
|
||||||
|
printf(" always-on : turn on when power is restored\n");
|
||||||
|
printf(" previous : return to previous state when power is restored\n");
|
||||||
|
printf(" always-off : stay off after power is restored\n");
|
||||||
|
} else {
|
||||||
|
unsigned char ctl;
|
||||||
|
|
||||||
|
if (!strncmp(argv[1], "list", 4))
|
||||||
|
ctl = IPMI_CHASSIS_POLICY_NO_CHANGE;
|
||||||
|
else if (!strncmp(argv[1], "always-on", 9))
|
||||||
|
ctl = IPMI_CHASSIS_POLICY_ALWAYS_ON;
|
||||||
|
else if (!strncmp(argv[1], "previous", 8))
|
||||||
|
ctl = IPMI_CHASSIS_POLICY_PREVIOUS;
|
||||||
|
else if (!strncmp(argv[1], "always-off", 10))
|
||||||
|
ctl = IPMI_CHASSIS_POLICY_ALWAYS_OFF;
|
||||||
|
else {
|
||||||
|
printf("invalid chassis policy: %s\n", argv[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ipmi_chassis_power_policy(intf, ctl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "bootparam", 7)) {
|
||||||
|
if (argc < 3 || !strncmp(argv[1], "help", 4)) {
|
||||||
|
printf("bootparam get|set <option> [value ...]\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!strncmp(argv[1], "get", 3)) {
|
||||||
|
ipmi_chassis_get_bootparam(intf, argv[2]);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[1], "set", 3)) {
|
||||||
|
if (argc < 4) {
|
||||||
|
printf("bootparam set <option> [value ...]\n");
|
||||||
|
} else {
|
||||||
|
if (!strncmp(argv[2], "bootflag", 8)) {
|
||||||
|
ipmi_chassis_set_bootflag(intf, argv[3]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("bootparam set <option> [value ...]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("bootparam get|set <option> [value]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Invalid Chassis command: %s\n", argv[0]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
218
ipmitool/lib/ipmi_fru.c
Normal file
218
ipmitool/lib/ipmi_fru.c
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_fru.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static char * get_fru_area_str(unsigned char * data, int * offset)
|
||||||
|
{
|
||||||
|
char * str;
|
||||||
|
int len;
|
||||||
|
int off = *offset;
|
||||||
|
|
||||||
|
len = data[off++];
|
||||||
|
len &= 0x3f; /* bits 0:5 contain length */
|
||||||
|
|
||||||
|
str = malloc(len+1);
|
||||||
|
if (!str)
|
||||||
|
return NULL;
|
||||||
|
str[len] = '\0';
|
||||||
|
|
||||||
|
memcpy(str, &data[off], len);
|
||||||
|
|
||||||
|
off += len;
|
||||||
|
*offset = off;
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ipmi_fru_print(struct ipmi_intf * intf, unsigned char id)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char fru_data[256], msg_data[4];
|
||||||
|
int i, len, offset;
|
||||||
|
|
||||||
|
struct fru_area_chassis chassis;
|
||||||
|
struct fru_area_board board;
|
||||||
|
struct fru_area_product product;
|
||||||
|
|
||||||
|
struct fru_info fru;
|
||||||
|
struct fru_header header;
|
||||||
|
|
||||||
|
msg_data[0] = id;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_FRU_INFO;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
memcpy(&fru, rsp->data, sizeof(fru));
|
||||||
|
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("fru.size = %d bytes (accessed by %s)\n",
|
||||||
|
fru.size, fru.access ? "words" : "bytes");
|
||||||
|
|
||||||
|
msg_data[0] = id;
|
||||||
|
msg_data[1] = 0;
|
||||||
|
msg_data[2] = 0;
|
||||||
|
msg_data[3] = 8;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_FRU_DATA;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return;
|
||||||
|
memcpy(&header, rsp->data + 1, 8);
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printf("fru.header.version: 0x%x\n", header.version);
|
||||||
|
printf("fru.header.offset.internal: 0x%x\n", header.offset.internal * 8);
|
||||||
|
printf("fru.header.offset.chassis: 0x%x\n", header.offset.chassis * 8);
|
||||||
|
printf("fru.header.offset.board: 0x%x\n", header.offset.board * 8);
|
||||||
|
printf("fru.header.offset.product: 0x%x\n", header.offset.product * 8);
|
||||||
|
printf("fru.header.offset.multi: 0x%x\n", header.offset.multi * 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = 0;
|
||||||
|
memset(fru_data, 0, 256);
|
||||||
|
do {
|
||||||
|
msg_data[0] = id;
|
||||||
|
msg_data[1] = offset;
|
||||||
|
msg_data[2] = 0;
|
||||||
|
msg_data[3] = 32;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
len = rsp->data[0];
|
||||||
|
memcpy(&fru_data[offset], rsp->data + 1, len);
|
||||||
|
offset += len;
|
||||||
|
} while (offset < fru.size);
|
||||||
|
|
||||||
|
/* chassis area */
|
||||||
|
i = header.offset.chassis * 8;
|
||||||
|
chassis.area_ver = fru_data[i++];
|
||||||
|
chassis.area_len = fru_data[i++];
|
||||||
|
chassis.type = fru_data[i++];
|
||||||
|
chassis.part = get_fru_area_str(fru_data, &i);
|
||||||
|
chassis.serial = get_fru_area_str(fru_data, &i);
|
||||||
|
|
||||||
|
/* board area */
|
||||||
|
i = header.offset.board * 8;
|
||||||
|
board.area_ver = fru_data[i++];
|
||||||
|
board.area_len = fru_data[i++];
|
||||||
|
board.lang = fru_data[i++];
|
||||||
|
i += 3; /* skip mfg. date time */
|
||||||
|
board.mfg = get_fru_area_str(fru_data, &i);
|
||||||
|
board.prod = get_fru_area_str(fru_data, &i);
|
||||||
|
board.serial = get_fru_area_str(fru_data, &i);
|
||||||
|
board.part = get_fru_area_str(fru_data, &i);
|
||||||
|
|
||||||
|
/* product area */
|
||||||
|
i = header.offset.product * 8;
|
||||||
|
product.area_ver = fru_data[i++];
|
||||||
|
product.area_len = fru_data[i++];
|
||||||
|
product.lang = fru_data[i++];
|
||||||
|
product.mfg = get_fru_area_str(fru_data, &i);
|
||||||
|
product.name = get_fru_area_str(fru_data, &i);
|
||||||
|
product.part = get_fru_area_str(fru_data, &i);
|
||||||
|
product.version = get_fru_area_str(fru_data, &i);
|
||||||
|
product.serial = get_fru_area_str(fru_data, &i);
|
||||||
|
product.asset = get_fru_area_str(fru_data, &i);
|
||||||
|
|
||||||
|
printf("Chassis Type : %s\n", chassis_type_desc[chassis.type]);
|
||||||
|
printf("Chassis Part : %s\n", chassis.part);
|
||||||
|
printf("Chassis Serial : %s\n", chassis.serial);
|
||||||
|
|
||||||
|
printf("Board Mfg : %s\n", board.mfg);
|
||||||
|
printf("Board Product : %s\n", board.prod);
|
||||||
|
printf("Board Serial : %s\n", board.serial);
|
||||||
|
printf("Board Part : %s\n", board.part);
|
||||||
|
|
||||||
|
printf("Product Mfg : %s\n", product.mfg);
|
||||||
|
printf("Product Name : %s\n", product.name);
|
||||||
|
printf("Product Part : %s\n", product.part);
|
||||||
|
printf("Product Version : %s\n", product.version);
|
||||||
|
printf("Product Serial : %s\n", product.serial);
|
||||||
|
printf("Product Asset : %s\n", product.asset);
|
||||||
|
|
||||||
|
free(chassis.part);
|
||||||
|
free(chassis.serial);
|
||||||
|
|
||||||
|
free(board.mfg);
|
||||||
|
free(board.prod);
|
||||||
|
free(board.serial);
|
||||||
|
free(board.part);
|
||||||
|
|
||||||
|
free(product.mfg);
|
||||||
|
free(product.name);
|
||||||
|
free(product.part);
|
||||||
|
free(product.version);
|
||||||
|
free(product.serial);
|
||||||
|
free(product.asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (argc == 0) {
|
||||||
|
ipmi_fru_print(intf, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(argv[0], "help", 4))
|
||||||
|
printf("FRU Commands: print\n");
|
||||||
|
else if (!strncmp(argv[0], "print", 4))
|
||||||
|
ipmi_fru_print(intf, 0);
|
||||||
|
else
|
||||||
|
printf("Invalid FRU command: %s\n", argv[0]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
105
ipmitool/lib/ipmi_intf.c
Normal file
105
ipmitool/lib/ipmi_intf.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ltdl.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
/* ipmi_intf_init
|
||||||
|
* initialize dynamic plugin interface
|
||||||
|
*/
|
||||||
|
int ipmi_intf_init(void)
|
||||||
|
{
|
||||||
|
if (lt_dlinit() < 0) {
|
||||||
|
printf("ERROR: Unable to initialize ltdl\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lt_dlsetsearchpath(PLUGIN_PATH) < 0) {
|
||||||
|
printf("ERROR: Unable to set ltdl plugin path to %s\n",
|
||||||
|
PLUGIN_PATH);
|
||||||
|
lt_dlexit();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_intf_exit
|
||||||
|
* close dynamic plugin interface
|
||||||
|
*/
|
||||||
|
void ipmi_intf_exit(void)
|
||||||
|
{
|
||||||
|
if (lt_dlexit() < 0)
|
||||||
|
printf("ERROR: Unable to cleanly exit ltdl\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_intf_load
|
||||||
|
* name: interface plugin name to load
|
||||||
|
*/
|
||||||
|
struct ipmi_intf * ipmi_intf_load(char * name)
|
||||||
|
{
|
||||||
|
lt_dlhandle handle;
|
||||||
|
struct ipmi_intf * intf;
|
||||||
|
int (*intf_setup)(struct ipmi_intf ** intf);
|
||||||
|
|
||||||
|
handle = lt_dlopenext(name);
|
||||||
|
if (handle == NULL) {
|
||||||
|
printf("ERROR: Unable to find plugin '%s' in '%s'\n",
|
||||||
|
name, PLUGIN_PATH);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
intf_setup = lt_dlsym(handle, "intf_setup");
|
||||||
|
if (!intf_setup) {
|
||||||
|
printf("ERROR: Unable to find interface setup symbol in plugin %s\n", name);
|
||||||
|
lt_dlclose(handle);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intf_setup(&intf) < 0) {
|
||||||
|
printf("ERROR: Unable to run interface setup for plugin %s\n", name);
|
||||||
|
lt_dlclose(handle);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return intf;
|
||||||
|
}
|
||||||
|
|
807
ipmitool/lib/ipmi_lanp.c
Normal file
807
ipmitool/lib/ipmi_lanp.c
Normal file
@ -0,0 +1,807 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi_lanp.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
extern struct ipmi_session lan_session;
|
||||||
|
|
||||||
|
const struct valstr ipmi_privlvl_vals[] = {
|
||||||
|
{ IPMI_SESSION_PRIV_CALLBACK, "CALLBACK" },
|
||||||
|
{ IPMI_SESSION_PRIV_USER, "USER" },
|
||||||
|
{ IPMI_SESSION_PRIV_OPERATOR, "OPERATOR" },
|
||||||
|
{ IPMI_SESSION_PRIV_ADMIN, "ADMINISTRATOR" },
|
||||||
|
{ IPMI_SESSION_PRIV_OEM, "OEM" },
|
||||||
|
{ 0xF, "NO ACCESS" },
|
||||||
|
{ 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct valstr ipmi_authtype_vals[] = {
|
||||||
|
{ IPMI_SESSION_AUTHTYPE_NONE, "NONE" },
|
||||||
|
{ IPMI_SESSION_AUTHTYPE_MD2, "MD2" },
|
||||||
|
{ IPMI_SESSION_AUTHTYPE_MD5, "MD5" },
|
||||||
|
{ IPMI_SESSION_AUTHTYPE_KEY, "PASSWORD" },
|
||||||
|
{ IPMI_SESSION_AUTHTYPE_OEM, "OEM" },
|
||||||
|
{ 0, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct valstr ipmi_channel_protocol_vals[] = {
|
||||||
|
{ 0x00, "reserved" },
|
||||||
|
{ 0x01, "IPMB-1.0" },
|
||||||
|
{ 0x02, "ICMB-1.0" },
|
||||||
|
{ 0x03, "reserved" },
|
||||||
|
{ 0x04, "IPMI-SMBus" },
|
||||||
|
{ 0x05, "KCS" },
|
||||||
|
{ 0x06, "SMIC" },
|
||||||
|
{ 0x07, "BT-10" },
|
||||||
|
{ 0x08, "BT-15" },
|
||||||
|
{ 0x09, "TMode" },
|
||||||
|
{ 0x1c, "OEM 1" },
|
||||||
|
{ 0x1d, "OEM 2" },
|
||||||
|
{ 0x1e, "OEM 3" },
|
||||||
|
{ 0x1f, "OEM 4" },
|
||||||
|
{ 0x00, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct valstr ipmi_channel_medium_vals[] = {
|
||||||
|
{ 0x00, "reserved" },
|
||||||
|
{ 0x01, "IPMB (I2C)" },
|
||||||
|
{ 0x02, "ICMB v1.0" },
|
||||||
|
{ 0x03, "ICMB v0.9" },
|
||||||
|
{ 0x04, "802.3 LAN" },
|
||||||
|
{ 0x05, "Serial/Modem" },
|
||||||
|
{ 0x06, "Other LAN" },
|
||||||
|
{ 0x07, "PCI SMBus" },
|
||||||
|
{ 0x08, "SMBus v1.0/v1.1" },
|
||||||
|
{ 0x09, "SMBus v2.0" },
|
||||||
|
{ 0x0a, "USB 1.x" },
|
||||||
|
{ 0x0b, "USB 2.x" },
|
||||||
|
{ 0x0c, "System Interface" },
|
||||||
|
{ 0x00, NULL },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct lan_param *
|
||||||
|
get_lan_param(struct ipmi_intf * intf, unsigned char chan, int param)
|
||||||
|
{
|
||||||
|
struct lan_param * p;
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char msg_data[4];
|
||||||
|
|
||||||
|
p = &ipmi_lan_params[param];
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
msg_data[0] = chan;
|
||||||
|
msg_data[1] = p->cmd;
|
||||||
|
msg_data[2] = 0;
|
||||||
|
msg_data[3] = 0;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_TRANSPORT;
|
||||||
|
req.msg.cmd = IPMI_LAN_GET_CONFIG;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
p->data = rsp->data + 1;
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
set_lan_param(struct ipmi_intf * intf, unsigned char chan, int param, unsigned char * data, int len)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char msg_data[32];
|
||||||
|
|
||||||
|
if (param < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
msg_data[0] = chan;
|
||||||
|
msg_data[1] = param;
|
||||||
|
|
||||||
|
memcpy(&msg_data[2], data, len);
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_TRANSPORT;
|
||||||
|
req.msg.cmd = IPMI_LAN_SET_CONFIG;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = len+2;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ipmi_get_channel_info(struct ipmi_intf * intf, unsigned char channel)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char rqdata[2];
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x42;
|
||||||
|
req.msg.data = &channel;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Get Channel Info Command (0x%x)\n",
|
||||||
|
rsp ? rsp->ccode : 0, channel);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!verbose)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("Channel 0x%x info:\n", rsp->data[0] & 0xf);
|
||||||
|
|
||||||
|
printf(" Channel Medium Type : %s\n",
|
||||||
|
val2str(rsp->data[1] & 0x7f, ipmi_channel_medium_vals));
|
||||||
|
|
||||||
|
printf(" Channel Protocol Type : %s\n",
|
||||||
|
val2str(rsp->data[2] & 0x1f, ipmi_channel_protocol_vals));
|
||||||
|
|
||||||
|
printf(" Session Support : ");
|
||||||
|
switch (rsp->data[3] & 0xc0) {
|
||||||
|
case 0x00:
|
||||||
|
printf("session-less\n");
|
||||||
|
break;
|
||||||
|
case 0x40:
|
||||||
|
printf("single-session\n");
|
||||||
|
break;
|
||||||
|
case 0x80:
|
||||||
|
printf("multi-session\n");
|
||||||
|
break;
|
||||||
|
case 0xc0:
|
||||||
|
default:
|
||||||
|
printf("session-based\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" Active Session Count : %d\n",
|
||||||
|
rsp->data[3] & 0x3f);
|
||||||
|
printf(" Protocol Vendor ID : %d\n",
|
||||||
|
rsp->data[4] | rsp->data[5] << 8 | rsp->data[6] << 16);
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
rqdata[0] = channel & 0xf;
|
||||||
|
rqdata[1] = 0x80; /* 0x80=active, 0x40=non-volatile */
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x41;
|
||||||
|
req.msg.data = rqdata;
|
||||||
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" Alerting : %sabled\n", (rsp->data[0] & 0x20) ? "dis" : "en");
|
||||||
|
printf(" Per-message Auth : %sabled\n", (rsp->data[0] & 0x10) ? "dis" : "en");
|
||||||
|
printf(" User Level Auth : %sabled\n", (rsp->data[0] & 0x08) ? "dis" : "en");
|
||||||
|
printf(" Access Mode : ");
|
||||||
|
switch (rsp->data[0] & 0x7) {
|
||||||
|
case 0:
|
||||||
|
printf("disabled\n");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
printf("pre-boot only\n");
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
printf("always available\n");
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
printf("shared\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("unknown\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static void suspend_lan_arp(struct ipmi_intf * intf, int suspend)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char msg_data[2];
|
||||||
|
|
||||||
|
msg_data[0] = IPMI_LAN_CHANNEL_1;
|
||||||
|
msg_data[1] = suspend;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_TRANSPORT;
|
||||||
|
req.msg.cmd = IPMI_LAN_SUSPEND_ARP;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (rsp && !rsp->ccode)
|
||||||
|
printf("Suspend BMC ARP status : 0x%x\n", rsp->data[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_lan_params(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
lan_set_auth(intf);
|
||||||
|
lan_set_arp(intf);
|
||||||
|
suspend_lan_arp(intf, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
lan_set_arp_interval(struct ipmi_intf * intf, unsigned char chan, unsigned char * ival)
|
||||||
|
{
|
||||||
|
struct lan_param *lp;
|
||||||
|
unsigned char interval;
|
||||||
|
|
||||||
|
lp = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP);
|
||||||
|
if (!lp)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ival) {
|
||||||
|
interval = ((unsigned char)atoi(ival) * 2) - 1;
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_GRAT_ARP, &interval, 1);
|
||||||
|
printf("BMC-generated Gratuitous ARP interval: %.1f seconds\n",
|
||||||
|
(float)((interval + 1) / 2));
|
||||||
|
} else {
|
||||||
|
printf("BMC-generated Gratuitous ARP interval: %.1f seconds\n",
|
||||||
|
(float)((lp->data[0] + 1) / 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lan_set_arp_generate(struct ipmi_intf * intf, unsigned char chan, unsigned char ctl)
|
||||||
|
{
|
||||||
|
struct lan_param *lp;
|
||||||
|
unsigned char data;
|
||||||
|
|
||||||
|
lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
|
||||||
|
if (!lp)
|
||||||
|
return;
|
||||||
|
data = lp->data[0];
|
||||||
|
|
||||||
|
if (ctl)
|
||||||
|
data |= 0x1;
|
||||||
|
else
|
||||||
|
data &= ~0x1;
|
||||||
|
|
||||||
|
printf("BMC-generated Gratuitous ARPs %sabled\n", ctl ? "en" : "dis");
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_BMC_ARP, &data, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lan_set_arp_respond(struct ipmi_intf * intf, unsigned char chan, unsigned char ctl)
|
||||||
|
{
|
||||||
|
struct lan_param *lp;
|
||||||
|
unsigned char data;
|
||||||
|
|
||||||
|
lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
|
||||||
|
if (!lp)
|
||||||
|
return;
|
||||||
|
data = lp->data[0];
|
||||||
|
|
||||||
|
if (ctl)
|
||||||
|
data |= 0x2;
|
||||||
|
else
|
||||||
|
data &= ~0x2;
|
||||||
|
|
||||||
|
printf("BMC-generated ARP response %sabled\n", ctl ? "en" : "dis");
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_BMC_ARP, &data, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_lan_print(struct ipmi_intf * intf, unsigned char chan)
|
||||||
|
{
|
||||||
|
struct lan_param * p;
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE);
|
||||||
|
if (p) printf("%-24s: 0x%02x\n", p->desc, p->data[0]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE);
|
||||||
|
if (p) printf("%-24s: callback=0x%02x user=0x%02x operator=0x%02x admin=0x%02x oem=0x%02x\n",
|
||||||
|
p->desc, p->data[0], p->data[1], p->data[2], p->data[3], p->data[4]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC);
|
||||||
|
if (p) printf("%-24s: 0x%02x\n", p->desc, p->data[0]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR);
|
||||||
|
if (p) printf("%-24s: %d.%d.%d.%d\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_SUBNET_MASK);
|
||||||
|
if (p) printf("%-24s: %d.%d.%d.%d\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_MAC_ADDR);
|
||||||
|
if (p) printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_SNMP_STRING);
|
||||||
|
if (p) printf("%-24s: %s\n", p->desc, p->data);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_IP_HEADER);
|
||||||
|
if (p) printf("%-24s: TTL=0x%02x flags=0x%02x precedence=0x%02x TOS=0x%02x\n",
|
||||||
|
p->desc, p->data[0], p->data[1] & 0xe0, p->data[2] & 0xe0, p->data[2] & 0x1e);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP);
|
||||||
|
if (p) printf("%-24s: 0x%02x\n", p->desc, p->data[0]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP);
|
||||||
|
if (p) printf("%-24s: 0x%02x\n", p->desc, p->data[0]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP);
|
||||||
|
if (p) printf("%-24s: %d.%d.%d.%d\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC);
|
||||||
|
if (p) printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP);
|
||||||
|
if (p) printf("%-24s: %d.%d.%d.%d\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3]);
|
||||||
|
|
||||||
|
p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC);
|
||||||
|
if (p) printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc,
|
||||||
|
p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure Authentication Types */
|
||||||
|
static void
|
||||||
|
ipmi_lan_set_auth(struct ipmi_intf * intf, unsigned char chan, char * level, char * types)
|
||||||
|
{
|
||||||
|
unsigned char data[5];
|
||||||
|
unsigned char authtype = 0;
|
||||||
|
char * p;
|
||||||
|
struct lan_param * lp;
|
||||||
|
|
||||||
|
if (!level || !types)
|
||||||
|
return;
|
||||||
|
|
||||||
|
lp = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE);
|
||||||
|
if (!lp)
|
||||||
|
return;
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("%-24s: callback=0x%02x user=0x%02x operator=0x%02x admin=0x%02x oem=0x%02x\n",
|
||||||
|
lp->desc, lp->data[0], lp->data[1], lp->data[2], lp->data[3], lp->data[4]);
|
||||||
|
memset(data, 0, 5);
|
||||||
|
memcpy(data, lp->data, 5);
|
||||||
|
|
||||||
|
p = types;
|
||||||
|
while (p) {
|
||||||
|
if (!strncmp(p, "none", 4))
|
||||||
|
authtype |= 1 << IPMI_SESSION_AUTHTYPE_NONE;
|
||||||
|
else if (!strncmp(p, "md2", 3))
|
||||||
|
authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD2;
|
||||||
|
else if (!strncmp(p, "md5", 3))
|
||||||
|
authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD5;
|
||||||
|
else if (!strncmp(p, "key", 3))
|
||||||
|
authtype |= 1 << IPMI_SESSION_AUTHTYPE_KEY;
|
||||||
|
else
|
||||||
|
printf("invalid authtype: %s\n", p);
|
||||||
|
p = strchr(p, ',');
|
||||||
|
if (p)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = level;
|
||||||
|
while (p) {
|
||||||
|
if (!strncmp(p, "callback", 8))
|
||||||
|
data[0] = authtype;
|
||||||
|
else if (!strncmp(p, "user", 4))
|
||||||
|
data[1] = authtype;
|
||||||
|
else if (!strncmp(p, "operator", 8))
|
||||||
|
data[2] = authtype;
|
||||||
|
else if (!strncmp(p, "admin", 5))
|
||||||
|
data[3] = authtype;
|
||||||
|
else
|
||||||
|
printf("invalid auth level: %s\n", p);
|
||||||
|
p = strchr(p, ',');
|
||||||
|
if (p)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1)
|
||||||
|
printbuf(data, 5, "authtype data");
|
||||||
|
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE, data, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_lan_set_password(struct ipmi_intf * intf,
|
||||||
|
unsigned char userid, unsigned char * password)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char data[18];
|
||||||
|
|
||||||
|
memset(&data, 0, sizeof(data));
|
||||||
|
data[0] = userid & 0x3f;/* user ID */
|
||||||
|
data[1] = 0x02; /* set password */
|
||||||
|
memcpy(data+2, password, (strlen(password) > 16) ? 16 : strlen(password));
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x47;
|
||||||
|
req.msg.data = data;
|
||||||
|
req.msg.data_len = 18;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x setting user %d password to %s\n",
|
||||||
|
rsp ? rsp->ccode : 0, userid, password);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* adjust our session password
|
||||||
|
* or we will no longer be able to communicate with BMC
|
||||||
|
*/
|
||||||
|
lan_session.password = 1;
|
||||||
|
memset(lan_session.authcode, 0, 16);
|
||||||
|
memcpy(lan_session.authcode, password, strlen(password));
|
||||||
|
|
||||||
|
printf("Password for user %d set to %s\n", userid, lan_session.authcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipmi_set_channel_access(struct ipmi_intf * intf, unsigned char channel, unsigned char enable)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char rqdata[3];
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
rqdata[0] = channel & 0xf;
|
||||||
|
|
||||||
|
rqdata[1] = 0xa0; /* set pef disabled, per-msg auth enabled */
|
||||||
|
if (enable)
|
||||||
|
rqdata[1] |= 0x2; /* set always available if enable is set */
|
||||||
|
rqdata[2] = 0x04; /* don't change channel privilege limit */
|
||||||
|
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x40;
|
||||||
|
req.msg.data = rqdata;
|
||||||
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Set Channel Access Command (0x%x)\n",
|
||||||
|
rsp ? rsp->ccode : 0, channel);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipmi_set_user_access(struct ipmi_intf * intf, unsigned char channel, unsigned char userid)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char rqdata[4];
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
rqdata[0] = 0x90 | (channel & 0xf);
|
||||||
|
rqdata[1] = userid & 0x3f;
|
||||||
|
rqdata[2] = 0x4;
|
||||||
|
rqdata[3] = 0;
|
||||||
|
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x43;
|
||||||
|
req.msg.data = rqdata;
|
||||||
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Set User Access Command (0x%x)\n",
|
||||||
|
rsp ? rsp->ccode : 0, channel);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_cmdline_macaddr(char * arg, unsigned char * buf)
|
||||||
|
{
|
||||||
|
unsigned m1, m2, m3, m4, m5, m6;
|
||||||
|
if (sscanf(arg, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
|
&m1, &m2, &m3, &m4, &m5, &m6) != 6) {
|
||||||
|
printf("Invalid MAC address: %s\n", arg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buf[0] = m1;
|
||||||
|
buf[1] = m2;
|
||||||
|
buf[2] = m3;
|
||||||
|
buf[3] = m4;
|
||||||
|
buf[4] = m5;
|
||||||
|
buf[5] = m6;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_cmdline_ipaddr(char * arg, unsigned char * buf)
|
||||||
|
{
|
||||||
|
unsigned ip1, ip2, ip3, ip4;
|
||||||
|
if (sscanf(arg, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4) != 4) {
|
||||||
|
printf("Invalid IP address: %s\n", arg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buf[0] = ip1;
|
||||||
|
buf[1] = ip2;
|
||||||
|
buf[2] = ip3;
|
||||||
|
buf[3] = ip4;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
unsigned char data[32];
|
||||||
|
unsigned char chan;
|
||||||
|
memset(&data, 0, sizeof(data));
|
||||||
|
|
||||||
|
if (argc < 2 || !strncmp(argv[0], "help", 4)) {
|
||||||
|
printf("usage: lan set <channel> <command>\n");
|
||||||
|
printf("LAN set commands: ipaddr, netmask, macaddr, defgw, bakgw, password, auth, ipsrc, access, user, arp\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
chan = (unsigned char) strtod(argv[0], NULL);
|
||||||
|
if (chan != 0x6 && chan != 0x7) {
|
||||||
|
printf("valid LAN channels are 6 and 7\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set user access */
|
||||||
|
if (!strncmp(argv[1], "user", 4)) {
|
||||||
|
ipmi_set_user_access(intf, chan, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set channel access mode */
|
||||||
|
if (!strncmp(argv[1], "access", 6)) {
|
||||||
|
if (argc < 3 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("lan set access <on|off>\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "on", 2)) {
|
||||||
|
ipmi_set_channel_access(intf, chan, 1);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "off", 3)) {
|
||||||
|
ipmi_set_channel_access(intf, chan, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("lan set access <on|off>\n");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set ARP control */
|
||||||
|
if (!strncmp(argv[1], "arp", 3)) {
|
||||||
|
if (argc < 3 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("lan set <channel> arp respond <on|off>\n");
|
||||||
|
printf("lan set <channel> arp generate <on|off>\n");
|
||||||
|
printf("lan set <channel> arp interval <seconds>\n\n");
|
||||||
|
printf("example: lan set 7 arp gratuitous off\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "interval", 8)) {
|
||||||
|
lan_set_arp_interval(intf, chan, argv[3]);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "generate", 8)) {
|
||||||
|
if (argc < 4)
|
||||||
|
printf("lan set <channel> arp generate <on|off>\n");
|
||||||
|
else if (!strncmp(argv[3], "on", 2))
|
||||||
|
lan_set_arp_generate(intf, chan, 1);
|
||||||
|
else if (!strncmp(argv[3], "off", 3))
|
||||||
|
lan_set_arp_generate(intf, chan, 0);
|
||||||
|
else
|
||||||
|
printf("lan set <channel> arp generate <on|off>\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "respond", 7)) {
|
||||||
|
if (argc < 4)
|
||||||
|
printf("lan set <channel> arp respond <on|off>\n");
|
||||||
|
else if (!strncmp(argv[3], "on", 2))
|
||||||
|
lan_set_arp_respond(intf, chan, 1);
|
||||||
|
else if (!strncmp(argv[3], "off", 3))
|
||||||
|
lan_set_arp_respond(intf, chan, 0);
|
||||||
|
else
|
||||||
|
printf("lan set <channel> arp respond <on|off>\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("lan set <channel> arp respond <on|off>\n");
|
||||||
|
printf("lan set <channel> arp generate <on|off>\n");
|
||||||
|
printf("lan set <channel> arp interval <seconds>\n");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set authentication types */
|
||||||
|
if (!strncmp(argv[1], "auth", 4)) {
|
||||||
|
if (argc < 3 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("lan set <channel> auth <level> <type,type,...>\n");
|
||||||
|
printf(" level = callback, user, operator, admin\n");
|
||||||
|
printf(" types = none, md2, md5, key\n");
|
||||||
|
printf("example: lan set 7 auth admin key,md5\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ipmi_lan_set_auth(intf, chan, argv[2], argv[3]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* ip address source */
|
||||||
|
else if (!strncmp(argv[1], "ipsrc", 5)) {
|
||||||
|
if (argc < 3 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("lan set <channel> ipsrc <source>\n");
|
||||||
|
printf(" none = unspecified\n");
|
||||||
|
printf(" static = static address (manually configured)\n");
|
||||||
|
printf(" dhcp = address obtained by BMC running DHCP\n");
|
||||||
|
printf(" bios = address loaded by BIOS or system software\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!strncmp(argv[2], "none", 4))
|
||||||
|
data[0] = 0;
|
||||||
|
else if (!strncmp(argv[2], "static", 5))
|
||||||
|
data[0] = 1;
|
||||||
|
else if (!strncmp(argv[2], "dhcp", 4))
|
||||||
|
data[0] = 2;
|
||||||
|
else if (!strncmp(argv[2], "bios", 4))
|
||||||
|
data[0] = 3;
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC, data, 1);
|
||||||
|
}
|
||||||
|
/* session password
|
||||||
|
* not strictly a lan setting, but its used for lan connections */
|
||||||
|
else if (!strncmp(argv[1], "password", 8)) {
|
||||||
|
ipmi_lan_set_password(intf, 1, argv[2]);
|
||||||
|
}
|
||||||
|
/* ip address */
|
||||||
|
else if (!strncmp(argv[1], "ipaddr", 6) &&
|
||||||
|
!get_cmdline_ipaddr(argv[2], data)) {
|
||||||
|
printf("Setting LAN %s to %d.%d.%d.%d\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_IP_ADDR].desc,
|
||||||
|
data[0], data[1], data[2], data[3]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_IP_ADDR, data, 4);
|
||||||
|
/* also set ip address source to "static" */
|
||||||
|
data[0] = 0x1;
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC, data, 1);
|
||||||
|
}
|
||||||
|
/* network mask */
|
||||||
|
else if (!strncmp(argv[1], "netmask", 7) &&
|
||||||
|
!get_cmdline_ipaddr(argv[2], data)) {
|
||||||
|
printf("Setting LAN %s to %d.%d.%d.%d\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_SUBNET_MASK].desc,
|
||||||
|
data[0], data[1], data[2], data[3]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_SUBNET_MASK, data, 4);
|
||||||
|
}
|
||||||
|
/* mac address */
|
||||||
|
else if (!strncmp(argv[1], "macaddr", 7) &&
|
||||||
|
!get_cmdline_macaddr(argv[2], data)) {
|
||||||
|
printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_MAC_ADDR].desc,
|
||||||
|
data[0], data[1], data[2], data[3], data[4], data[5]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_MAC_ADDR, data, 6);
|
||||||
|
}
|
||||||
|
/* default gateway settings */
|
||||||
|
else if (!strncmp(argv[1], "defgw", 5)) {
|
||||||
|
if (argc < 4 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("LAN set default gateway Commands: ipaddr, mac\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "ipaddr", 5) &&
|
||||||
|
!get_cmdline_ipaddr(argv[3], data)) {
|
||||||
|
printf("Setting LAN %s to %d.%d.%d.%d\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_IP].desc,
|
||||||
|
data[0], data[1], data[2], data[3]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP, data, 4);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "macaddr", 7) &&
|
||||||
|
!get_cmdline_macaddr(argv[3], data)) {
|
||||||
|
printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_MAC].desc,
|
||||||
|
data[0], data[1], data[2], data[3], data[4], data[5]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC, data, 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* backup gateway settings */
|
||||||
|
else if (!strncmp(argv[1], "bakgw", 5)) {
|
||||||
|
if (argc < 4 || !strncmp(argv[2], "help", 4)) {
|
||||||
|
printf("LAN set backup gateway commands: ipaddr, mac\n");
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "ipaddr", 5) &&
|
||||||
|
!get_cmdline_ipaddr(argv[3], data)) {
|
||||||
|
printf("Setting LAN %s to %d.%d.%d.%d\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_IP].desc,
|
||||||
|
data[0], data[1], data[2], data[3]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP, data, 4);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[2], "macaddr", 7) &&
|
||||||
|
!get_cmdline_macaddr(argv[3], data)) {
|
||||||
|
printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
|
ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_MAC].desc,
|
||||||
|
data[0], data[1], data[2], data[3], data[4], data[5]);
|
||||||
|
set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC, data, 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc || !strncmp(argv[0], "help", 4))
|
||||||
|
printf("LAN Commands: print, set\n");
|
||||||
|
else if (!strncmp(argv[0], "printconf", 9) ||
|
||||||
|
!strncmp(argv[0], "print", 5)) {
|
||||||
|
unsigned char chan = 7;
|
||||||
|
if (argc > 1)
|
||||||
|
chan = (unsigned char) strtod(argv[1], NULL);
|
||||||
|
ipmi_lan_print(intf, chan);
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "set", 3))
|
||||||
|
ipmi_lan_set(intf, argc-1, &(argv[1]));
|
||||||
|
else
|
||||||
|
printf("Invalid LAN command: %s\n", argv[0]);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
512
ipmitool/lib/ipmi_sdr.c
Normal file
512
ipmitool/lib/ipmi_sdr.c
Normal file
@ -0,0 +1,512 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_sdr.h>
|
||||||
|
#include <ipmitool/ipmi_entity.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
/* convert unsigned value to 2's complement signed */
|
||||||
|
int utos(unsigned val, unsigned bits)
|
||||||
|
{
|
||||||
|
int x = pow(10, bits-1);
|
||||||
|
if (val & x) {
|
||||||
|
x = pow(2, bits-1);
|
||||||
|
return -((~val & (x-1))+1);
|
||||||
|
}
|
||||||
|
else return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float
|
||||||
|
sdr_convert_sensor_reading(struct sdr_record_full_sensor * sensor, unsigned char val)
|
||||||
|
{
|
||||||
|
int m, b, k1, k2;
|
||||||
|
|
||||||
|
m = __TO_M(sensor->mtol);
|
||||||
|
b = __TO_B(sensor->bacc);
|
||||||
|
k1 = __TO_B_EXP(sensor->bacc);
|
||||||
|
k2 = __TO_R_EXP(sensor->bacc);
|
||||||
|
|
||||||
|
return (float)(((m * val) + (b * pow(10, k1))) * pow(10, k2));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GET_SENSOR_READING 0x2d
|
||||||
|
#define GET_SENSOR_FACTORS 0x23
|
||||||
|
#define GET_SENSOR_THRES 0x27
|
||||||
|
#define GET_SENSOR_TYPE 0x2f
|
||||||
|
|
||||||
|
static inline struct ipmi_rs *
|
||||||
|
ipmi_sdr_get_sensor_reading(struct ipmi_intf * intf, unsigned char sensor)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_SE;
|
||||||
|
req.msg.cmd = GET_SENSOR_READING;
|
||||||
|
req.msg.data = &sensor;
|
||||||
|
req.msg.data_len = sizeof(sensor);
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return rsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ipmi_sdr_get_status(unsigned char stat)
|
||||||
|
{
|
||||||
|
/* cr = critical
|
||||||
|
* nc = non-critical
|
||||||
|
* us = unspecified
|
||||||
|
* nr = non-recoverable
|
||||||
|
* ok = ok
|
||||||
|
*/
|
||||||
|
if (stat & (SDR_SENSOR_STAT_LO_NR | SDR_SENSOR_STAT_HI_NR))
|
||||||
|
return "nr";
|
||||||
|
else if (stat & (SDR_SENSOR_STAT_LO_CR | SDR_SENSOR_STAT_HI_CR))
|
||||||
|
return "cr";
|
||||||
|
else if (stat & (SDR_SENSOR_STAT_LO_NC | SDR_SENSOR_STAT_HI_NC))
|
||||||
|
return "nc";
|
||||||
|
else
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sdr_get_rs *
|
||||||
|
ipmi_sdr_get_header(struct ipmi_intf * intf, unsigned short reserve_id, unsigned short record_id)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct sdr_get_rq sdr_rq;
|
||||||
|
static struct sdr_get_rs sdr_rs;
|
||||||
|
|
||||||
|
memset(&sdr_rq, 0, sizeof(sdr_rq));
|
||||||
|
sdr_rq.reserve_id = reserve_id;
|
||||||
|
sdr_rq.id = record_id;
|
||||||
|
sdr_rq.offset = 0;
|
||||||
|
sdr_rq.length = 5; /* only get the header */
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_SDR;
|
||||||
|
req.msg.data = (unsigned char *)&sdr_rq;
|
||||||
|
req.msg.data_len = sizeof(sdr_rq);
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || !rsp->data_len) {
|
||||||
|
printf("Error getting SDR record id 0x%04x\n", record_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("SDR Record ID : 0x%04x\n", record_id);
|
||||||
|
|
||||||
|
memcpy(&sdr_rs, rsp->data, sizeof(sdr_rs));
|
||||||
|
|
||||||
|
if (sdr_rs.length == 0) {
|
||||||
|
printf("Error in SDR record id 0x%04x: invalid length %d\n",
|
||||||
|
record_id, sdr_rs.length);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printf("SDR record type : %d\n", sdr_rs.type);
|
||||||
|
printf("SDR record next : %d\n", sdr_rs.next);
|
||||||
|
printf("SDR record bytes: %d\n", sdr_rs.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &sdr_rs;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sdr_record_compact_sensor *
|
||||||
|
ipmi_sdr_get_entry_02(struct ipmi_intf * intf, unsigned short reserve_id, unsigned short record_id, int len)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct sdr_get_rq sdr_rq;
|
||||||
|
struct sdr_record_compact_sensor * sensor;
|
||||||
|
unsigned char data[256];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(&sdr_rq, 0, sizeof(sdr_rq));
|
||||||
|
sdr_rq.reserve_id = reserve_id;
|
||||||
|
sdr_rq.id = record_id;
|
||||||
|
sdr_rq.offset = 0;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_SDR;
|
||||||
|
req.msg.data = (unsigned char *)&sdr_rq;
|
||||||
|
req.msg.data_len = sizeof(sdr_rq);
|
||||||
|
|
||||||
|
/* read SDR record with partial (30 byte) reads
|
||||||
|
* because a full read (0xff) exceeds the maximum
|
||||||
|
* transport buffer size. (completion code 0xca)
|
||||||
|
*/
|
||||||
|
memset(data, 0, sizeof(data));
|
||||||
|
for (i=0; i<len; i+=GET_SDR_MAX_LEN) {
|
||||||
|
sdr_rq.length = (len-i < GET_SDR_MAX_LEN) ? len-i : GET_SDR_MAX_LEN;
|
||||||
|
sdr_rq.offset = i+5; /* 5 header bytes */
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("getting %d bytes from SDR at offset %d\n",
|
||||||
|
sdr_rq.length, sdr_rq.offset);
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (rsp && rsp->data)
|
||||||
|
memcpy(data+i, rsp->data+2, sdr_rq.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensor = malloc(sizeof(*sensor));
|
||||||
|
memcpy(sensor, data, sizeof(*sensor));
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printbuf(data, len, "SDR Entry");
|
||||||
|
|
||||||
|
printf("keys.owner_id: 0x%x\n", sensor->keys.owner_id);
|
||||||
|
printf("keys.lun: 0x%x\n", sensor->keys.lun);
|
||||||
|
printf("keys.channel: 0x%x\n", sensor->keys.channel);
|
||||||
|
printf("keys.sensor_num: 0x%x\n", sensor->keys.sensor_num);
|
||||||
|
|
||||||
|
printf("entity: %d.%d\n", sensor->entity.id, sensor->entity.instance);
|
||||||
|
|
||||||
|
printf("entity.id: %s\n", val2str(sensor->entity.id, entity_id_vals));
|
||||||
|
printf("entity.instance: %d\n", sensor->entity.instance);
|
||||||
|
printf("entity.logical: %d\n", sensor->entity.logical);
|
||||||
|
|
||||||
|
printf("sensor unit.pct: 0x%x\n", sensor->unit.pct);
|
||||||
|
printf("sensor unit.rate: 0x%x\n", sensor->unit.rate);
|
||||||
|
printf("sensor unit.analog: 0x%x\n", sensor->unit.analog);
|
||||||
|
printf("sensor unit.modifier: 0x%x\n", sensor->unit.modifier);
|
||||||
|
printf("sensor unit.type.base: 0x%x\n", sensor->unit.type.base);
|
||||||
|
printf("sensor unit.type.modifier: 0x%x\n", sensor->unit.type.modifier);
|
||||||
|
|
||||||
|
printf("sensor.type: 0x%02x\n", sensor->sensor.type);
|
||||||
|
printf("event_type: 0x%02x\n", sensor->event_type);
|
||||||
|
|
||||||
|
printf("sensor id code: 0x%x\n", sensor->id_code);
|
||||||
|
|
||||||
|
if (sensor->id_code)
|
||||||
|
printf("sensor id: %s\n", sensor->id_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sensor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sdr_record_full_sensor *
|
||||||
|
ipmi_sdr_get_entry_01(struct ipmi_intf * intf, unsigned short reserve_id, unsigned short record_id, int len)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct sdr_get_rq sdr_rq;
|
||||||
|
struct sdr_record_full_sensor * sensor;
|
||||||
|
unsigned char data[256];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(&sdr_rq, 0, sizeof(sdr_rq));
|
||||||
|
sdr_rq.reserve_id = reserve_id;
|
||||||
|
sdr_rq.id = record_id;
|
||||||
|
sdr_rq.offset = 0;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_SDR;
|
||||||
|
req.msg.data = (unsigned char *)&sdr_rq;
|
||||||
|
req.msg.data_len = sizeof(sdr_rq);
|
||||||
|
|
||||||
|
/* read SDR record with partial (30 byte) reads
|
||||||
|
* because a full read (0xff) exceeds the maximum
|
||||||
|
* transport buffer size. (completion code 0xca)
|
||||||
|
*/
|
||||||
|
memset(data, 0, sizeof(data));
|
||||||
|
for (i=0; i<len; i+=GET_SDR_MAX_LEN) {
|
||||||
|
sdr_rq.length = (len-i < GET_SDR_MAX_LEN) ? len-i : GET_SDR_MAX_LEN;
|
||||||
|
sdr_rq.offset = i+5; /* 5 header bytes */
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("getting %d bytes from SDR at offset %d\n",
|
||||||
|
sdr_rq.length, sdr_rq.offset);
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (rsp && rsp->data)
|
||||||
|
memcpy(data+i, rsp->data+2, sdr_rq.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
sensor = malloc(sizeof(*sensor));
|
||||||
|
memcpy(sensor, data, sizeof(*sensor));
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printbuf(data, len, "SDR Entry");
|
||||||
|
|
||||||
|
printf("keys.owner_id: 0x%x\n", sensor->keys.owner_id);
|
||||||
|
printf("keys.lun: 0x%x\n", sensor->keys.lun);
|
||||||
|
printf("keys.channel: 0x%x\n", sensor->keys.channel);
|
||||||
|
printf("keys.sensor_num: 0x%x\n", sensor->keys.sensor_num);
|
||||||
|
|
||||||
|
printf("entity: %d.%d\n", sensor->entity.id, sensor->entity.instance);
|
||||||
|
|
||||||
|
printf("entity.id: %s\n", val2str(sensor->entity.id, entity_id_vals));
|
||||||
|
printf("entity.instance: %d\n", sensor->entity.instance);
|
||||||
|
printf("entity.logical: %d\n", sensor->entity.logical);
|
||||||
|
|
||||||
|
printf("sensor unit.pct: 0x%x\n", sensor->unit.pct);
|
||||||
|
printf("sensor unit.rate: 0x%x\n", sensor->unit.rate);
|
||||||
|
printf("sensor unit.analog: 0x%x\n", sensor->unit.analog);
|
||||||
|
printf("sensor unit.modifier: 0x%x\n", sensor->unit.modifier);
|
||||||
|
printf("sensor unit.type.base: 0x%x\n", sensor->unit.type.base);
|
||||||
|
printf("sensor unit.type.modifier: 0x%x\n", sensor->unit.type.modifier);
|
||||||
|
|
||||||
|
printf("sensor linearization: 0x%x\n", sensor->linearization);
|
||||||
|
|
||||||
|
printf("sensor tolerance: 0x%x\n", __TO_TOL(sensor->mtol));
|
||||||
|
printf("sensor M: 0x%x\n", __TO_M(sensor->mtol));
|
||||||
|
printf("sensor B: 0x%x\n", __TO_B(sensor->bacc));
|
||||||
|
printf("sensor B exp: %d\n", __TO_B_EXP(sensor->bacc));
|
||||||
|
printf("sensor R exp: %d\n", __TO_R_EXP(sensor->bacc));
|
||||||
|
printf("sensor accuracy: 0x%x\n", __TO_ACC(sensor->bacc));
|
||||||
|
printf("sensor accuracy exp: 0x%x\n", __TO_ACC_EXP(sensor->bacc));
|
||||||
|
|
||||||
|
printf("sensor.type: 0x%02x\n", sensor->sensor.type);
|
||||||
|
printf("event_type: 0x%02x\n", sensor->event_type);
|
||||||
|
|
||||||
|
printf("sensor min=0x%x max=0x%x\n", sensor->sensor_min, sensor->sensor_max);
|
||||||
|
printf("sensor id code: 0x%x\n", sensor->id_code);
|
||||||
|
|
||||||
|
printf("Nominal Reading : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->nominal_read));
|
||||||
|
printf("Normal Minimum Reading : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->normal_min));
|
||||||
|
printf("Normal Maximum Reading : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->normal_max));
|
||||||
|
printf("Upper non-recoverable Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_recover));
|
||||||
|
printf("Upper critical Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.upper.critical));
|
||||||
|
printf("Upper non-critical Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.upper.non_critical));
|
||||||
|
printf("Lower non-recoverable Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_recover));
|
||||||
|
printf("Lower critical Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.lower.critical));
|
||||||
|
printf("Lower non-critical Threshold : %.3f\n",
|
||||||
|
sdr_convert_sensor_reading(sensor, sensor->threshold.lower.non_critical));
|
||||||
|
|
||||||
|
if (sensor->id_code)
|
||||||
|
printf("sensor id: %s\n", sensor->id_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sensor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_sdr_print_sensors(struct ipmi_intf * intf, int do_unit)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct sdr_repo_info_rs sdr_info;
|
||||||
|
struct sdr_reserve_repo_rs sdr_reserve;
|
||||||
|
struct sdr_get_rs * header;
|
||||||
|
struct sdr_record_full_sensor * sensor;
|
||||||
|
|
||||||
|
int next = 0, i = 0, total;
|
||||||
|
unsigned short reservation;
|
||||||
|
float val;
|
||||||
|
char sval[16], unitstr[16];
|
||||||
|
char desc[17];
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("Querying SDR for sensor list\n");
|
||||||
|
|
||||||
|
/* get sdr repository info */
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_SDR_REPO_INFO;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || !rsp->data_len)
|
||||||
|
return;
|
||||||
|
memcpy(&sdr_info, rsp->data, sizeof(sdr_info));
|
||||||
|
|
||||||
|
/* byte 1 is SDR version, should be 51h */
|
||||||
|
if (sdr_info.version != 0x51) {
|
||||||
|
printf("SDR repository version mismatch!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
total = sdr_info.count;
|
||||||
|
if (verbose > 1) {
|
||||||
|
printf("SDR free space: %d\n", sdr_info.free);
|
||||||
|
printf("SDR records: %d\n", total);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* obtain reservation ID */
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = GET_SDR_RESERVE_REPO;
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || !rsp->data_len)
|
||||||
|
return;
|
||||||
|
memcpy(&sdr_reserve, rsp->data, sizeof(sdr_reserve));
|
||||||
|
reservation = sdr_reserve.reserve_id;
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("SDR reserveration ID %04x\n", reservation);
|
||||||
|
|
||||||
|
while (next < total) {
|
||||||
|
i = 0;
|
||||||
|
|
||||||
|
header = ipmi_sdr_get_header(intf, reservation, next);
|
||||||
|
if (!header)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (header->type == SDR_RECORD_TYPE_COMPACT_SENSOR) {
|
||||||
|
struct sdr_record_compact_sensor * s;
|
||||||
|
s = ipmi_sdr_get_entry_02(intf, reservation, next, header->length);
|
||||||
|
next = header->next;
|
||||||
|
free(s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header->type != SDR_RECORD_TYPE_FULL_SENSOR) {
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("Invalid SDR type 0x%02x\n", header->type);
|
||||||
|
next = header->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sensor = ipmi_sdr_get_entry_01(intf, reservation, next, header->length);
|
||||||
|
next = header->next;
|
||||||
|
|
||||||
|
/* only handle linear sensors (for now) */
|
||||||
|
if (sensor->linearization) {
|
||||||
|
printf("non-linear!\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(desc, 0, sizeof(desc));
|
||||||
|
memcpy(desc, sensor->id_string, 16);
|
||||||
|
|
||||||
|
rsp = ipmi_sdr_get_sensor_reading(intf, sensor->keys.sensor_num);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("error reading sensor\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* convert RAW reading into units */
|
||||||
|
val = rsp->data[0] ? sdr_convert_sensor_reading(sensor, rsp->data[0]) : 0;
|
||||||
|
|
||||||
|
if (do_unit) {
|
||||||
|
memset(unitstr, 0, sizeof(unitstr));
|
||||||
|
/* determine units with possible modifiers */
|
||||||
|
switch (sensor->unit.modifier) {
|
||||||
|
case 2:
|
||||||
|
i += snprintf(unitstr, sizeof(unitstr), "%s * %s",
|
||||||
|
unit_desc[sensor->unit.type.base],
|
||||||
|
unit_desc[sensor->unit.type.modifier]);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
i += snprintf(unitstr, sizeof(unitstr), "%s/%s",
|
||||||
|
unit_desc[sensor->unit.type.base],
|
||||||
|
unit_desc[sensor->unit.type.modifier]);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
i += snprintf(unitstr, sizeof(unitstr), "%s",
|
||||||
|
unit_desc[sensor->unit.type.base]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!verbose) {
|
||||||
|
/*
|
||||||
|
* print sensor name, reading, state
|
||||||
|
*/
|
||||||
|
if (csv_output)
|
||||||
|
printf("%s,",
|
||||||
|
sensor->id_code ? desc : NULL);
|
||||||
|
else
|
||||||
|
printf("%-16s | ",
|
||||||
|
sensor->id_code ? desc : NULL);
|
||||||
|
|
||||||
|
memset(sval, 0, sizeof(sval));
|
||||||
|
i += snprintf(sval, sizeof(sval), "%.*f",
|
||||||
|
(val==(int)val) ? 0 : 3, val);
|
||||||
|
printf("%s", sval);
|
||||||
|
|
||||||
|
if (do_unit)
|
||||||
|
printf(" %s", unitstr);
|
||||||
|
|
||||||
|
if (csv_output)
|
||||||
|
printf(",");
|
||||||
|
else {
|
||||||
|
for (; i<sizeof(sval); i++)
|
||||||
|
printf(" ");
|
||||||
|
printf(" | ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s", ipmi_sdr_get_status(rsp->data[2]));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Sensor | %s (0x%x)\n",
|
||||||
|
sensor->id_code ? desc : NULL,
|
||||||
|
sensor->keys.sensor_num);
|
||||||
|
printf("Entity | %d.%d (%s)\n",
|
||||||
|
sensor->entity.id, sensor->entity.instance,
|
||||||
|
val2str(sensor->entity.id, entity_id_vals));
|
||||||
|
printf("Reading | %.*f %s\n",
|
||||||
|
(val==(int)val) ? 0 : 3, val, unitstr);
|
||||||
|
printf("Status | %s\n",
|
||||||
|
ipmi_sdr_get_status(rsp->data[2]));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
free(sensor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_sdr_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc)
|
||||||
|
ipmi_sdr_print_sensors(intf, 1);
|
||||||
|
else if (!strncmp(argv[0], "help", 4))
|
||||||
|
printf("SDR Commands: list\n");
|
||||||
|
else if (!strncmp(argv[0], "list", 4))
|
||||||
|
ipmi_sdr_print_sensors(intf, 1);
|
||||||
|
else
|
||||||
|
printf("Invalid SDR command: %s\n", argv[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
449
ipmitool/lib/ipmi_sel.c
Normal file
449
ipmitool/lib/ipmi_sel.c
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_sel.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static const struct valstr event_dir_vals[] = {
|
||||||
|
{ 0, "Assertion Event" },
|
||||||
|
{ 1, "Deassertion Event" },
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipmi_get_event_class(unsigned char code)
|
||||||
|
{
|
||||||
|
if (code == 0)
|
||||||
|
return -1;
|
||||||
|
if (code == 1)
|
||||||
|
return IPMI_EVENT_CLASS_THRESHOLD;
|
||||||
|
if (code >= 0x02 && code <= 0x0b)
|
||||||
|
return IPMI_EVENT_CLASS_DISCRETE;
|
||||||
|
if (code == 0x6f)
|
||||||
|
return IPMI_EVENT_CLASS_DISCRETE;
|
||||||
|
if (code >= 0x70 && code <= 0x7f)
|
||||||
|
return IPMI_EVENT_CLASS_OEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ipmi_get_event_type(unsigned char code)
|
||||||
|
{
|
||||||
|
if (code == 0)
|
||||||
|
return "Unspecified";
|
||||||
|
if (code == 1)
|
||||||
|
return "Threshold";
|
||||||
|
if (code >= 0x02 && code <= 0x0b)
|
||||||
|
return "Generic Discrete";
|
||||||
|
if (code == 0x6f)
|
||||||
|
return "Sensor-specific Discrete";
|
||||||
|
if (code >= 0x70 && code <= 0x7f)
|
||||||
|
return "OEM";
|
||||||
|
return "Reserved";
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ipmi_get_event_desc(struct sel_event_record * rec)
|
||||||
|
{
|
||||||
|
int class;
|
||||||
|
unsigned char offset = 0;
|
||||||
|
unsigned char code = 0;
|
||||||
|
struct ipmi_event_sensor_types *evt;
|
||||||
|
|
||||||
|
class = ipmi_get_event_class(rec->event_type);
|
||||||
|
if (class < 0)
|
||||||
|
return "Invalid Class";
|
||||||
|
|
||||||
|
switch (class) {
|
||||||
|
case IPMI_EVENT_CLASS_DISCRETE:
|
||||||
|
if (rec->event_type == 0x6f)
|
||||||
|
evt = sensor_specific_types;
|
||||||
|
else
|
||||||
|
evt = generic_event_types;
|
||||||
|
code = rec->sensor_type;
|
||||||
|
break;
|
||||||
|
case IPMI_EVENT_CLASS_DIGITAL:
|
||||||
|
evt = generic_event_types;
|
||||||
|
code = rec->sensor_type;
|
||||||
|
break;
|
||||||
|
case IPMI_EVENT_CLASS_THRESHOLD:
|
||||||
|
evt = generic_event_types;
|
||||||
|
code = 0x01;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return "Unknown Class";
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = rec->event_data[0] & 0xf;
|
||||||
|
|
||||||
|
if (verbose > 2)
|
||||||
|
printf("offset: 0x%02x\n", offset);
|
||||||
|
|
||||||
|
while (evt->type) {
|
||||||
|
if (evt->code == code && evt->offset == offset)
|
||||||
|
return evt->desc;
|
||||||
|
evt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown Event";
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
ipmi_sel_get_sensor_type(unsigned char code)
|
||||||
|
{
|
||||||
|
struct ipmi_event_sensor_types *st = sensor_specific_types;
|
||||||
|
while (st->type) {
|
||||||
|
if (st->code == code)
|
||||||
|
return st->type;
|
||||||
|
st++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_sel_get_info(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x40;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error%x in Get SEL Info command\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (verbose > 2)
|
||||||
|
printbuf(rsp->data, rsp->data_len, "sel_info");
|
||||||
|
|
||||||
|
printf("SEL Information\n");
|
||||||
|
printf(" Version : %x%x\n",
|
||||||
|
(rsp->data[0] & 0xf0) >> 4, rsp->data[0] & 0xf);
|
||||||
|
printf(" Entries : %d\n",
|
||||||
|
buf2short(rsp->data + 1));
|
||||||
|
printf(" Free Space : %d\n",
|
||||||
|
buf2short(rsp->data + 3));
|
||||||
|
printf(" Last Add Time : %08lx\n",
|
||||||
|
buf2long(rsp->data + 5));
|
||||||
|
printf(" Last Del Time : %08lx\n",
|
||||||
|
buf2long(rsp->data + 9));
|
||||||
|
printf(" Overflow : %s\n",
|
||||||
|
rsp->data[13] & 0x80 ? "true" : "false");
|
||||||
|
printf(" Delete cmd : %ssupported\n",
|
||||||
|
rsp->data[13] & 0x8 ? "" : "un");
|
||||||
|
printf(" Parial add cmd : %ssupported\n",
|
||||||
|
rsp->data[13] & 0x4 ? "" : "un");
|
||||||
|
printf(" Reserve cmd : %ssupported\n",
|
||||||
|
rsp->data[13] & 0x2 ? "" : "un");
|
||||||
|
printf(" Get Alloc Info : %ssupported\n",
|
||||||
|
rsp->data[13] & 0x1 ? "" : "un");
|
||||||
|
|
||||||
|
if (rsp->data[13] & 0x1) {
|
||||||
|
/* get sel allocation info */
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x41;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("error%d in Get SEL Allocation Info command\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" # of Alloc Units : %d\n", buf2short(rsp->data));
|
||||||
|
printf(" Alloc Unit Size : %d\n", buf2short(rsp->data + 2));
|
||||||
|
printf(" # Free Units : %d\n", buf2short(rsp->data + 4));
|
||||||
|
printf(" Largest Free Blk : %d\n", buf2short(rsp->data + 6));
|
||||||
|
printf(" Max Record Size : %d\n", rsp->data[7]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct sel_event_record *
|
||||||
|
ipmi_sel_get_std_entry(struct ipmi_intf * intf, unsigned short * next_id)
|
||||||
|
{
|
||||||
|
struct ipmi_rq req;
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
unsigned char msg_data[6];
|
||||||
|
unsigned char type;
|
||||||
|
|
||||||
|
memset(msg_data, 0, 6);
|
||||||
|
msg_data[0] = 0x00; /* no reserve id, not partial get */
|
||||||
|
msg_data[1] = 0x00;
|
||||||
|
memcpy(msg_data+2, next_id, sizeof(*next_id));
|
||||||
|
msg_data[4] = 0x00; /* offset */
|
||||||
|
msg_data[5] = 0xff; /* length */
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x43;
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 6;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error%x in Get SEL Entry %x Command\n",
|
||||||
|
rsp ? rsp->ccode : 0, *next_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (verbose > 2)
|
||||||
|
printbuf(rsp->data, rsp->data_len, "SEL Entry");
|
||||||
|
|
||||||
|
*next_id = (rsp->data[1] << 8) | rsp->data[0];
|
||||||
|
|
||||||
|
if (rsp->data[4] >= 0xc0) {
|
||||||
|
printf("Not a standard SEL Entry!\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (struct sel_event_record *) &rsp->data[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ipmi_sel_timestamp(unsigned long stamp)
|
||||||
|
{
|
||||||
|
static unsigned char tbuf[40];
|
||||||
|
strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", localtime(&stamp));
|
||||||
|
return tbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ipmi_sel_timestamp_date(unsigned long stamp)
|
||||||
|
{
|
||||||
|
static unsigned char tbuf[11];
|
||||||
|
strftime(tbuf, sizeof(tbuf), "%m/%d/%Y", localtime(&stamp));
|
||||||
|
return tbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
ipmi_sel_timestamp_time(unsigned long stamp)
|
||||||
|
{
|
||||||
|
static unsigned char tbuf[9];
|
||||||
|
strftime(tbuf, sizeof(tbuf), "%H:%M:%S", localtime(&stamp));
|
||||||
|
return tbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ipmi_sel_print_std_entry(int num, struct sel_event_record * evt)
|
||||||
|
{
|
||||||
|
if (!evt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (csv_output)
|
||||||
|
printf("%d,", num);
|
||||||
|
else
|
||||||
|
printf("%4d | ", num);
|
||||||
|
|
||||||
|
if (evt->timestamp < 0x20000000) {
|
||||||
|
printf("Pre-Init Time-stamp");
|
||||||
|
if (csv_output)
|
||||||
|
printf(",");
|
||||||
|
else
|
||||||
|
printf(" | ");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("%s", ipmi_sel_timestamp_date(evt->timestamp));
|
||||||
|
if (csv_output)
|
||||||
|
printf(",");
|
||||||
|
else
|
||||||
|
printf(" | ");
|
||||||
|
|
||||||
|
printf("%s", ipmi_sel_timestamp_time(evt->timestamp));
|
||||||
|
if (csv_output)
|
||||||
|
printf(",");
|
||||||
|
else
|
||||||
|
printf(" | ");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s #0x%02x", ipmi_sel_get_sensor_type(evt->sensor_type), evt->sensor_num);
|
||||||
|
|
||||||
|
if (csv_output)
|
||||||
|
printf(",%s\n", ipmi_get_event_desc(evt));
|
||||||
|
else
|
||||||
|
printf(" | %s\n", ipmi_get_event_desc(evt));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ipmi_sel_print_std_entry_verbose(struct sel_event_record * evt)
|
||||||
|
{
|
||||||
|
if (!evt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
printf("SEL Record ID : %04x\n",
|
||||||
|
evt->record_id);
|
||||||
|
printf(" Record Type : %02x\n",
|
||||||
|
evt->record_type);
|
||||||
|
printf(" Timestamp : %s\n",
|
||||||
|
ipmi_sel_timestamp(evt->timestamp));
|
||||||
|
printf(" Generator ID : %04x\n",
|
||||||
|
evt->gen_id);
|
||||||
|
printf(" EvM Revision : %02x\n",
|
||||||
|
evt->evm_rev);
|
||||||
|
printf(" Sensor Type : %s\n",
|
||||||
|
ipmi_sel_get_sensor_type(evt->sensor_type));
|
||||||
|
printf(" Sensor Num : %02x\n",
|
||||||
|
evt->sensor_num);
|
||||||
|
printf(" Event Type : %s\n",
|
||||||
|
ipmi_get_event_type(evt->event_type));
|
||||||
|
printf(" Event Direction : %s\n",
|
||||||
|
val2str(evt->event_dir, event_dir_vals));
|
||||||
|
printf(" Event Data : %02x%02x%02x\n",
|
||||||
|
evt->event_data[0], evt->event_data[1], evt->event_data[2]);
|
||||||
|
printf(" Description : %s\n",
|
||||||
|
ipmi_get_event_desc(evt));
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_sel_list_entries(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned short reserve_id, next_id = 0;
|
||||||
|
int num = 1;
|
||||||
|
struct sel_event_record * evt;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x42; /* reserve SEL */
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x unable to reserve SEL\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
reserve_id = rsp->data[0] | rsp->data[1] << 8;
|
||||||
|
if (verbose)
|
||||||
|
printf("SEL Reservation ID: %04x\n", reserve_id);
|
||||||
|
|
||||||
|
while (next_id != 0xffff) {
|
||||||
|
if (verbose > 1)
|
||||||
|
printf("SEL Next ID: %04x\n", next_id);
|
||||||
|
/* next_id is updated by this function */
|
||||||
|
evt = ipmi_sel_get_std_entry(intf, &next_id);
|
||||||
|
if (!evt)
|
||||||
|
break;
|
||||||
|
if (verbose)
|
||||||
|
ipmi_sel_print_std_entry_verbose(evt);
|
||||||
|
else
|
||||||
|
ipmi_sel_print_std_entry(num, evt);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned short
|
||||||
|
ipmi_sel_reserve(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x42; /* reserve SEL */
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x unable to reserve SEL\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rsp->data[0] | rsp->data[1] << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ipmi_sel_clear(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned short reserve_id;
|
||||||
|
unsigned char msg_data[6];
|
||||||
|
|
||||||
|
reserve_id = ipmi_sel_reserve(intf);
|
||||||
|
if (reserve_id == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(msg_data, 0, 6);
|
||||||
|
msg_data[0] = reserve_id & 0xff;
|
||||||
|
msg_data[1] = reserve_id >> 8;
|
||||||
|
msg_data[2] = 'C';
|
||||||
|
msg_data[3] = 'L';
|
||||||
|
msg_data[4] = 'R';
|
||||||
|
msg_data[5] = 0xaa;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||||
|
req.msg.cmd = 0x47; /* clear SEL */
|
||||||
|
req.msg.data = msg_data;
|
||||||
|
req.msg.data_len = 6;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x unable to clear SEL\n", rsp ? rsp->ccode : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Clearing SEL. Please allow a few seconds to erase.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc)
|
||||||
|
ipmi_sel_get_info(intf);
|
||||||
|
else if (!strncmp(argv[0], "help", 4))
|
||||||
|
printf("SEL Commands: info clear list\n");
|
||||||
|
else if (!strncmp(argv[0], "info", 4))
|
||||||
|
ipmi_sel_get_info(intf);
|
||||||
|
else if (!strncmp(argv[0], "list", 4))
|
||||||
|
ipmi_sel_list_entries(intf);
|
||||||
|
else if (!strncmp(argv[0], "clear", 5))
|
||||||
|
ipmi_sel_clear(intf);
|
||||||
|
else
|
||||||
|
printf("Invalid SEL command: %s\n", argv[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
143
ipmitool/lib/ipmi_sol.c
Normal file
143
ipmitool/lib/ipmi_sol.c
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_sol.h>
|
||||||
|
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
static int ipmi_sol_setup(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char data[6];
|
||||||
|
|
||||||
|
/* TEST FOR AVAILABILITY */
|
||||||
|
|
||||||
|
memset(data, 0, 6);
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = SOL_ENABLE_PARAM;
|
||||||
|
data[2] = SOL_ENABLE_FLAG;
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_SOL;
|
||||||
|
req.msg.cmd = SET_SOL_CONFIG;
|
||||||
|
req.msg.data = data;
|
||||||
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp) {
|
||||||
|
printf("Error in Set SOL Config Command\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsp->ccode == 0xc1) {
|
||||||
|
printf("Serial Over Lan not supported!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (rsp->ccode) {
|
||||||
|
printf("Set Serial Over Lan Config returned %x\n", rsp->ccode);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GET SOL CONFIG */
|
||||||
|
|
||||||
|
memset(data, 0, 6);
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = SOL_AUTHENTICATION_PARAM;
|
||||||
|
data[2] = 0x00; /* block */
|
||||||
|
data[3] = 0x00; /* selector */
|
||||||
|
req.msg.cmd = GET_SOL_CONFIG;
|
||||||
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x in Get SOL Config command\n", rsp?rsp->ccode:0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1)
|
||||||
|
printbuf(rsp->data, rsp->data_len, "SOL Config");
|
||||||
|
|
||||||
|
/* SET SOL CONFIG - AUTHENTICATION */
|
||||||
|
|
||||||
|
memset(data, 0, 6);
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = SOL_AUTHENTICATION_PARAM;
|
||||||
|
data[2] = SOL_PRIVILEGE_LEVEL_USER | (rsp->data[1] & 0x80);
|
||||||
|
req.msg.cmd = SET_SOL_CONFIG;
|
||||||
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x in Set SOL Config (Authentication) command\n", rsp?rsp->ccode:0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SET SOL CONFIG - BAUD RATE */
|
||||||
|
|
||||||
|
memset(data, 0, 6);
|
||||||
|
data[0] = 0x00;
|
||||||
|
data[1] = SOL_BAUD_RATE_PARAM;
|
||||||
|
data[2] = SOL_PREFERRED_BAUD_RATE;
|
||||||
|
req.msg.cmd = SET_SOL_CONFIG;
|
||||||
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x in Set SOL Config (Baud Rate) command\n", rsp?rsp->ccode:0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
if (!argc || !strncmp(argv[0], "help", 4)) {
|
||||||
|
printf("SOL Commands: setup\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[0], "setup", 5)) {
|
||||||
|
ipmi_sol_setup(intf);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
60
ipmitool/src/Makefile.am
Normal file
60
ipmitool/src/Makefile.am
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include
|
||||||
|
SUBDIRS = plugins
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
if IPMIEVD
|
||||||
|
|
||||||
|
EXTRA_DIST = bmcautoconf.sh
|
||||||
|
bin_PROGRAMS = ipmievd ipmitool
|
||||||
|
ipmievd_SOURCES = ipmievd.c
|
||||||
|
ipmievd_LDADD = $(top_srcdir)/lib/libipmitool.la
|
||||||
|
ipmievd_LDFLAGS =
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
EXTRA_DIST = bmcautoconf.sh ipmievd.c
|
||||||
|
bin_PROGRAMS = ipmitool
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
ipmitool_SOURCES = ipmitool.c
|
||||||
|
ipmitool_LDADD = $(top_srcdir)/lib/libipmitool.la
|
||||||
|
ipmitool_LDFLAGS =
|
||||||
|
|
||||||
|
bin_SCRIPTS = bmcautoconf.sh
|
||||||
|
|
149
ipmitool/src/bmcautoconf.sh
Executable file
149
ipmitool/src/bmcautoconf.sh
Executable file
@ -0,0 +1,149 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# bmcautoconf [interface] [channel]
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
DEBUG=0
|
||||||
|
|
||||||
|
# if the wrong channel is used serious problems could occur
|
||||||
|
# Channel 6 == eth0, top interface on v60x and v65x
|
||||||
|
# Channel 6 == eth1, top interface on LX50
|
||||||
|
# Channel 7 == eth1, bottom interface on v60x and v65x
|
||||||
|
# Channel 7 == eth0, bottom interface on LX50
|
||||||
|
CHANNEL=6
|
||||||
|
IFACE=eth0
|
||||||
|
|
||||||
|
# ipmitool interface
|
||||||
|
# open = OpenIPMI kernel driver
|
||||||
|
# [ipmi_msghandler, ipmi_kcs_drv, ipmi_devintf]
|
||||||
|
# imb = Intel IMB
|
||||||
|
IPMIINTF=open
|
||||||
|
|
||||||
|
# util locations
|
||||||
|
IPMITOOL=/usr/bin/ipmitool
|
||||||
|
PING=/bin/ping
|
||||||
|
ARP=/sbin/arp
|
||||||
|
IFCONFIG=/sbin/ifconfig
|
||||||
|
ROUTE=/sbin/route
|
||||||
|
|
||||||
|
ipmitool_lan_set ()
|
||||||
|
{
|
||||||
|
[ $# -lt 1 ] && return
|
||||||
|
PARAM=$1
|
||||||
|
|
||||||
|
VALUE=
|
||||||
|
[ $# -ge 2 ] && VALUE=$2
|
||||||
|
|
||||||
|
if [ $DEBUG -gt 0 ]; then
|
||||||
|
echo "Setting LAN parameter ${PARAM} to ${VALUE}"
|
||||||
|
echo "$IPMITOOL -I $IPMIINTF lan set $CHANNEL $PARAM $VALUE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
$IPMITOOL -I $IPMIINTF lan set $CHANNEL $PARAM $VALUE
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -x $IPMITOOL ]; then
|
||||||
|
echo "Error: unable to find $IPMITOOL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -ge 1 ]; then
|
||||||
|
IFACE=$1
|
||||||
|
if ! $IFCONFIG $IFACE | grep -q "inet addr:" >/dev/null 2>&1 ; then
|
||||||
|
echo "Error: unable to find interface $IFACE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -ge 2 ]; then
|
||||||
|
CHANNEL=$2
|
||||||
|
if [ $CHANNEL -ne 6 ] && [ $CHANNEL -ne 7 ]; then
|
||||||
|
echo "Invalid channel: $CHANNEL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
[ $DEBUG -gt 0 ] && echo "Auto-configuring $IFACE (channel $CHANNEL)"
|
||||||
|
|
||||||
|
# IP Address
|
||||||
|
IP_ADDRESS=$( $IFCONFIG $IFACE | grep "inet addr:" | awk -F"[:[:space:]]+" '{ print $4 }' )
|
||||||
|
if [ X$IP_ADDRESS = X ]; then
|
||||||
|
echo "Unable to determine IP address for interface $IFACE"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Netmask
|
||||||
|
IP_NETMASK=$( $IFCONFIG $IFACE | grep "inet addr:" | awk -F"[:[:space:]]+" '{ print $8 }' )
|
||||||
|
if [ X$IP_NETMASK = X ]; then
|
||||||
|
echo "Unable to determine IP netmask for interface $IFACE"
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# MAC Address
|
||||||
|
MAC_ADDRESS=$( $IFCONFIG $IFACE | grep "HWaddr" | awk '{ print $5 }' )
|
||||||
|
if [ X$MAC_ADDRESS = X ]; then
|
||||||
|
echo "Unable to determine MAC address for interface $IFACE"
|
||||||
|
exit 4
|
||||||
|
fi
|
||||||
|
|
||||||
|
# default route IP Address
|
||||||
|
DEF_ROUTE_IP=$( $ROUTE -n | awk '/^0.0.0.0/ { print $2 }' )
|
||||||
|
if [ X$DEF_ROUTE_IP = X ]; then
|
||||||
|
echo "Unable to determine default route IP address"
|
||||||
|
exit 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Default Route MAC Address
|
||||||
|
# (ping it first to populate arp table)
|
||||||
|
$PING -q -c1 >/dev/null 2>&1
|
||||||
|
DEF_ROUTE_MAC=$( $ARP -an -i $IFACE | grep "$DEF_ROUTE_IP[^0-9]" | awk '{ print $4 }' )
|
||||||
|
if [ X$DEF_ROUTE_MAC = X ]; then
|
||||||
|
echo "Unable to determine default route MAC address"
|
||||||
|
exit 6
|
||||||
|
fi
|
||||||
|
|
||||||
|
ipmitool_lan_set "ipsrc" "static"
|
||||||
|
ipmitool_lan_set "ipaddr" $IP_ADDRESS
|
||||||
|
ipmitool_lan_set "netmask" $IP_NETMASK
|
||||||
|
ipmitool_lan_set "macaddr" $MAC_ADDRESS
|
||||||
|
ipmitool_lan_set "defgw ipaddr" $DEF_ROUTE_IP
|
||||||
|
ipmitool_lan_set "defgw macaddr" $DEF_ROUTE_MAC
|
||||||
|
ipmitool_lan_set "auth callback,user,operator,admin" "md2,md5"
|
||||||
|
ipmitool_lan_set "access" "on"
|
||||||
|
ipmitool_lan_set "user"
|
||||||
|
|
||||||
|
exit 0
|
255
ipmitool/src/ipmievd.c
Normal file
255
ipmitool/src/ipmievd.c
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
|
|
||||||
|
#include <linux/ipmi.h>
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
#include <ipmitool/ipmi_sel.h>
|
||||||
|
|
||||||
|
extern int errno;
|
||||||
|
int verbose = 0;
|
||||||
|
int csv_output = 0;
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
static int enable_event_msg_buffer(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char bmc_global_enables;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
/* we must read/modify/write bmc global enables */
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x2f; /* Get BMC Global Enables */
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("ERROR:%x Get BMC Global Enables command\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bmc_global_enables = rsp->data[0] | 0x04;
|
||||||
|
req.msg.cmd = 0x2e; /* Set BMC Global Enables */
|
||||||
|
req.msg.data = &bmc_global_enables;
|
||||||
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("ERROR:%x Set BMC Global Enables command\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("BMC Event Message Buffer enabled.\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void read_event(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_addr addr;
|
||||||
|
struct ipmi_recv recv;
|
||||||
|
unsigned char data[80];
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
recv.addr = (char *) &addr;
|
||||||
|
recv.addr_len = sizeof(addr);
|
||||||
|
recv.msg.data = data;
|
||||||
|
recv.msg.data_len = sizeof(data);
|
||||||
|
|
||||||
|
rv = ioctl(intf->fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv);
|
||||||
|
if (rv < 0) {
|
||||||
|
if (errno == EINTR)
|
||||||
|
/* abort */
|
||||||
|
return;
|
||||||
|
if (errno == EMSGSIZE) {
|
||||||
|
/* message truncated */
|
||||||
|
recv.msg.data_len = sizeof(data);
|
||||||
|
} else {
|
||||||
|
printf("ERROR: receiving IPMI message: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!recv.msg.data || recv.msg.data_len == 0) {
|
||||||
|
printf("ERROR: No data in event!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printf(" type = %d\n", recv.recv_type);
|
||||||
|
printf(" channel = 0x%x\n", addr.channel);
|
||||||
|
printf(" msgid = %ld\n", recv.msgid);
|
||||||
|
printf(" netfn = 0x%x\n", recv.msg.netfn);
|
||||||
|
printf(" cmd = 0x%x\n", recv.msg.cmd);
|
||||||
|
printf(" data_len = %d\n", recv.msg.data_len);
|
||||||
|
printbuf(recv.msg.data, recv.msg.data_len, "data");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recv.recv_type != IPMI_ASYNC_EVENT_RECV_TYPE) {
|
||||||
|
printf("ERROR: Not an event!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
ipmi_sel_print_std_entry_verbose((struct sel_event_record *)recv.msg.data);
|
||||||
|
else
|
||||||
|
ipmi_sel_print_std_entry(num++, (struct sel_event_record *)recv.msg.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_exit(struct ipmi_intf * intf, int rv)
|
||||||
|
{
|
||||||
|
if (intf)
|
||||||
|
intf->close(intf);
|
||||||
|
ipmi_intf_exit();
|
||||||
|
exit(rv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void usage(void)
|
||||||
|
{
|
||||||
|
printf("usage: ipmievd [-hv]\n");
|
||||||
|
printf("\n");
|
||||||
|
printf(" -h This help\n");
|
||||||
|
printf(" -v Verbose (can use multiple times)\n");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
struct ipmi_intf * intf;
|
||||||
|
int r, i=1, a;
|
||||||
|
struct pollfd pfd;
|
||||||
|
|
||||||
|
while ((a = getopt(argc, (char **)argv, "hv")) != -1) {
|
||||||
|
switch (a) {
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("Loading OpenIPMI interface plugin.\n");
|
||||||
|
|
||||||
|
/* init interface plugin support */
|
||||||
|
r = ipmi_intf_init();
|
||||||
|
if (r < 0) {
|
||||||
|
printf("ERROR: Unable to initialize plugin interface\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* load interface plugin */
|
||||||
|
intf = ipmi_intf_load("intf_open");
|
||||||
|
if (!intf) {
|
||||||
|
printf("ERROR: unable to load OpenIPMI interface plugin\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("Connecting to OpenIPMI device.\n");
|
||||||
|
|
||||||
|
/* open connection to openipmi device */
|
||||||
|
r = intf->open(intf, NULL, 0, NULL);
|
||||||
|
if (r < 0) {
|
||||||
|
printf("ERROR: Unable to open OpenIPMI device\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable event message buffer */
|
||||||
|
r = enable_event_msg_buffer(intf);
|
||||||
|
if (r < 0) {
|
||||||
|
printf("ERROR: Unable to enable event message buffer.\n");
|
||||||
|
do_exit(intf, EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("Enabling event receiver.\n");
|
||||||
|
|
||||||
|
/* enable OpenIPMI event receiver */
|
||||||
|
if (ioctl(intf->fd, IPMICTL_SET_GETS_EVENTS_CMD, &i)) {
|
||||||
|
perror("ERROR: Could not enable event receiver");
|
||||||
|
do_exit(intf, EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("ipmievd loaded, waiting for events...\n");
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
pfd.fd = intf->fd; /* wait on openipmi device */
|
||||||
|
pfd.events = POLLIN; /* wait for input */
|
||||||
|
r = poll(&pfd, 1, -1);
|
||||||
|
|
||||||
|
switch (r) {
|
||||||
|
case 0:
|
||||||
|
/* timeout is disabled */
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
perror("ERROR: poll operation failed");
|
||||||
|
do_exit(intf, EXIT_FAILURE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (pfd.revents && POLLIN)
|
||||||
|
read_event(intf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("Exiting.\n");
|
||||||
|
|
||||||
|
do_exit(intf, EXIT_SUCCESS);
|
||||||
|
}
|
387
ipmitool/src/ipmitool.c
Normal file
387
ipmitool/src/ipmitool.c
Normal file
@ -0,0 +1,387 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_sdr.h>
|
||||||
|
#include <ipmitool/ipmi_sel.h>
|
||||||
|
#include <ipmitool/ipmi_fru.h>
|
||||||
|
#include <ipmitool/ipmi_sol.h>
|
||||||
|
#include <ipmitool/ipmi_lanp.h>
|
||||||
|
#include <ipmitool/ipmi_chassis.h>
|
||||||
|
#include <ipmitool/ipmi_bmc.h>
|
||||||
|
|
||||||
|
struct ipmi_session lan_session;
|
||||||
|
int csv_output = 0;
|
||||||
|
int verbose = 0;
|
||||||
|
|
||||||
|
void usage(void)
|
||||||
|
{
|
||||||
|
printf("ipmitool version %s\n", VERSION);
|
||||||
|
printf("\n");
|
||||||
|
printf("usage: ipmitool [options...] <command>\n");
|
||||||
|
printf("\n");
|
||||||
|
printf(" -h This help\n");
|
||||||
|
printf(" -V Show version information\n");
|
||||||
|
printf(" -v Verbose (can use multiple times)\n");
|
||||||
|
printf(" -c CSV output suitable for parsing\n");
|
||||||
|
printf(" -g Attempt to be extra robust in LAN communications\n");
|
||||||
|
printf(" -H hostname Remote host name for LAN interface\n");
|
||||||
|
printf(" -p port Remote RMCP port (default is 623)\n");
|
||||||
|
printf(" -P password Remote administrator password\n");
|
||||||
|
printf(" -I intf Inteface to use\n");
|
||||||
|
printf("\n\n");
|
||||||
|
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_raw_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char netfn, cmd;
|
||||||
|
int i;
|
||||||
|
unsigned char data[32];
|
||||||
|
|
||||||
|
if (argc < 2 || !strncmp(argv[0], "help", 4)) {
|
||||||
|
printf("RAW Commands: raw <netfn> <cmd> [data]\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
netfn = strtod(argv[0], NULL);
|
||||||
|
cmd = strtod(argv[1], NULL);
|
||||||
|
|
||||||
|
memset(data, 0, sizeof(data));
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
req.msg.netfn = netfn;
|
||||||
|
req.msg.cmd = cmd;
|
||||||
|
req.msg.data = data;
|
||||||
|
|
||||||
|
for (i=2; i<argc; i++) {
|
||||||
|
unsigned char val = strtod(argv[i], NULL);
|
||||||
|
req.msg.data[i-2] = val;
|
||||||
|
req.msg.data_len++;
|
||||||
|
}
|
||||||
|
if (req.msg.data_len) {
|
||||||
|
for (i=0; i<req.msg.data_len; i++) {
|
||||||
|
if (((i%16) == 0) && (i != 0))
|
||||||
|
printf("\n");
|
||||||
|
printf(" %2.2x", req.msg.data[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("RAW REQ (netfn=0x%x cmd=0x%x data_len=%d)\n",
|
||||||
|
req.msg.netfn, req.msg.cmd, req.msg.data_len);
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x sending RAW command\n",
|
||||||
|
rsp ? rsp->ccode : 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("RAW RSP (%d bytes)\n", rsp->data_len);
|
||||||
|
|
||||||
|
for (i=0; i<rsp->data_len; i++) {
|
||||||
|
if (((i%16) == 0) && (i != 0))
|
||||||
|
printf("\n");
|
||||||
|
printf(" %2.2x", rsp->data[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipmi_get_user_access(struct ipmi_intf * intf, unsigned char channel, unsigned char userid)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char rqdata[2];
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
rqdata[0] = channel & 0xf;
|
||||||
|
rqdata[1] = userid & 0x3f;
|
||||||
|
|
||||||
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
|
req.msg.cmd = 0x44;
|
||||||
|
req.msg.data = rqdata;
|
||||||
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Get User Access Command (0x%x)\n",
|
||||||
|
rsp ? rsp->ccode : 0, channel);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Maximum User IDs : %d\n", rsp->data[0] & 0x3f);
|
||||||
|
printf("Enabled User IDs : %d\n", rsp->data[1] & 0x3f);
|
||||||
|
printf("Fixed Name User IDs : %d\n", rsp->data[2] & 0x3f);
|
||||||
|
printf("Access Available : %s\n", (rsp->data[3] & 0x40) ? "callback" : "call-in / callback");
|
||||||
|
printf("Link Authentication : %sabled\n", (rsp->data[3] & 0x20) ? "en" : "dis");
|
||||||
|
printf("IPMI Messaging : %sabled\n", (rsp->data[3] & 0x10) ? "en" : "dis");
|
||||||
|
// printf("Privilege Level : %s\n", val2str(rsp->data[3] & 0x0f, ipmi_privlvl_vals));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ipmi_send_platform_event(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
struct ipmi_rs * rsp;
|
||||||
|
struct ipmi_rq req;
|
||||||
|
unsigned char rqdata[8];
|
||||||
|
|
||||||
|
memset(&req, 0, sizeof(req));
|
||||||
|
memset(rqdata, 0, 8);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* System Interface */
|
||||||
|
rqdata[0] = 0x20; /* generator ID */
|
||||||
|
rqdata[1] = 0x04; /* EvMRev */
|
||||||
|
rqdata[2] = 0x01; /* Sensor Type */
|
||||||
|
rqdata[3] = 0x30; /* Sensor # */
|
||||||
|
rqdata[4] = 0x04; /* Event Dir / Event Type */
|
||||||
|
rqdata[5] = 0x00; /* Event Data 1 */
|
||||||
|
rqdata[6] = 0x00; /* Event Data 2 */
|
||||||
|
rqdata[7] = 0x00; /* Event Data 3 */
|
||||||
|
#else
|
||||||
|
/* IPMB/LAN/etc */
|
||||||
|
rqdata[0] = 0x04; /* EvMRev */
|
||||||
|
rqdata[1] = 0x01; /* Sensor Type */
|
||||||
|
rqdata[2] = 0x30; /* Sensor # */
|
||||||
|
rqdata[3] = 0x04; /* Event Dir / Event Type */
|
||||||
|
rqdata[4] = 0x00; /* Event Data 1 */
|
||||||
|
rqdata[5] = 0x00; /* Event Data 2 */
|
||||||
|
rqdata[6] = 0x00; /* Event Data 3 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
req.msg.netfn = IPMI_NETFN_SE;
|
||||||
|
req.msg.cmd = 0x02;
|
||||||
|
req.msg.data = rqdata;
|
||||||
|
#if 0
|
||||||
|
req.msg.data_len = 8;
|
||||||
|
#else
|
||||||
|
req.msg.data_len = 7;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
if (!rsp || rsp->ccode) {
|
||||||
|
printf("Error:%x Platform Event Message Command\n", rsp?rsp->ccode:0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
int (*submain)(struct ipmi_intf *, int, char **);
|
||||||
|
struct ipmi_intf * intf = NULL;
|
||||||
|
char * hostname = NULL, * password = NULL;
|
||||||
|
int argflag, i, rc=0, port = 623, pedantic = 0;
|
||||||
|
char intfname[32];
|
||||||
|
|
||||||
|
if (ipmi_intf_init() < 0)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
|
while ((argflag = getopt(argc, (char **)argv, "hVvcgI:H:P:p:")) != -1)
|
||||||
|
{
|
||||||
|
switch (argflag) {
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
printf("ipmitool version %s\n", VERSION);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
pedantic = 1;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
verbose++;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
csv_output = 1;
|
||||||
|
break;
|
||||||
|
case 'I':
|
||||||
|
memset(intfname, 0, sizeof(intfname));
|
||||||
|
i = snprintf(intfname, sizeof(intfname), "intf_%s", optarg);
|
||||||
|
intf = ipmi_intf_load(intfname);
|
||||||
|
if (!intf) {
|
||||||
|
printf("Error loading interface %s\n", optarg);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
hostname = strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'P':
|
||||||
|
password = strdup(optarg);
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
port = atoi(optarg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc-optind <= 0) {
|
||||||
|
printf("No command provided!\n");
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!intf) {
|
||||||
|
printf("No interface specified!\n");
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
|
||||||
|
intf->pedantic = pedantic;
|
||||||
|
|
||||||
|
if (!strncmp(argv[optind], "help", 4)) {
|
||||||
|
printf("Commands: chassis, fru, lan, sdr, sel\n");
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "event", 5)) {
|
||||||
|
if (intf->open(intf, hostname, port, password) < 0)
|
||||||
|
goto out_free;
|
||||||
|
ipmi_send_platform_event(intf);
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "bmc", 3)) {
|
||||||
|
submain = ipmi_bmc_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "chassis", 7)) {
|
||||||
|
submain = ipmi_chassis_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "fru", 3)) {
|
||||||
|
submain = ipmi_fru_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "lan", 3)) {
|
||||||
|
submain = ipmi_lanp_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "sdr", 3)) {
|
||||||
|
submain = ipmi_sdr_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "sel", 3)) {
|
||||||
|
submain = ipmi_sel_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "sol", 3)) {
|
||||||
|
submain = ipmi_sol_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "raw", 3)) {
|
||||||
|
submain = ipmi_raw_main;
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "userinfo", 8)) {
|
||||||
|
if (argc-optind-1 > 0) {
|
||||||
|
unsigned char c = strtod(argv[optind+1], NULL);
|
||||||
|
rc = intf->open(intf, hostname, port, password);
|
||||||
|
if (rc < 0)
|
||||||
|
goto out_free;
|
||||||
|
ipmi_get_user_access(intf, c, 1);
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("userinfo <channel>\n");
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strncmp(argv[optind], "chaninfo", 8)) {
|
||||||
|
if (argc-optind-1 > 0) {
|
||||||
|
unsigned char c = strtod(argv[optind+1], NULL);
|
||||||
|
rc = intf->open(intf, hostname, port, password);
|
||||||
|
if (rc < 0)
|
||||||
|
goto out_free;
|
||||||
|
verbose++;
|
||||||
|
ipmi_get_channel_info(intf, c);
|
||||||
|
verbose--;
|
||||||
|
goto out_close;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("chaninfo <channel>\n");
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Invalid comand: %s\n", argv[optind]);
|
||||||
|
rc = -1;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!submain)
|
||||||
|
goto out_free;
|
||||||
|
|
||||||
|
if (intf->open) {
|
||||||
|
rc = intf->open(intf, hostname, port, password);
|
||||||
|
if (rc < 0)
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = submain(intf, argc-optind-1, &(argv[optind+1]));
|
||||||
|
|
||||||
|
out_close:
|
||||||
|
if (intf->close)
|
||||||
|
intf->close(intf);
|
||||||
|
|
||||||
|
ipmi_intf_exit();
|
||||||
|
|
||||||
|
out_free:
|
||||||
|
if (hostname)
|
||||||
|
free(hostname);
|
||||||
|
if (password)
|
||||||
|
free(password);
|
||||||
|
|
||||||
|
if (rc >= 0)
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
else
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
39
ipmitool/src/plugins/Makefile.am
Normal file
39
ipmitool/src/plugins/Makefile.am
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
plugindir = $(pluginpath)
|
||||||
|
|
||||||
|
SUBDIRS = @PLUGINS@
|
44
ipmitool/src/plugins/lan/Makefile.am
Normal file
44
ipmitool/src/plugins/lan/Makefile.am
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
plugindir = $(pluginpath)
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include
|
||||||
|
|
||||||
|
intf_lan_la_LDFLAGS = -module -avoid-version
|
||||||
|
plugin_LTLIBRARIES = intf_lan.la
|
||||||
|
intf_lan_la_SOURCES = lan.c lan.h asf.h rmcp.h md5.c md5.h
|
||||||
|
|
73
ipmitool/src/plugins/lan/asf.h
Normal file
73
ipmitool/src/plugins/lan/asf.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_ASF_H
|
||||||
|
#define IPMI_ASF_H
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include "lan.h"
|
||||||
|
|
||||||
|
#define ASF_RMCP_IANA 0x000011be
|
||||||
|
|
||||||
|
#define ASF_TYPE_PING 0x80
|
||||||
|
#define ASF_TYPE_PONG 0x40
|
||||||
|
|
||||||
|
static const struct valstr asf_type_vals[] __attribute__((unused)) = {
|
||||||
|
{ 0x10, "Reset" },
|
||||||
|
{ 0x11, "Power-up" },
|
||||||
|
{ 0x12, "Unconditional Power-down" },
|
||||||
|
{ 0x13, "Power Cycle" },
|
||||||
|
{ 0x40, "Presence Pong" },
|
||||||
|
{ 0x41, "Capabilities Response" },
|
||||||
|
{ 0x42, "System State Response" },
|
||||||
|
{ 0x80, "Presence Ping" },
|
||||||
|
{ 0x81, "Capabilities Request" },
|
||||||
|
{ 0x82, "System State Request" },
|
||||||
|
{ 0x00, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ASF message header */
|
||||||
|
struct asf_hdr {
|
||||||
|
unsigned long iana;
|
||||||
|
unsigned char type;
|
||||||
|
unsigned char tag;
|
||||||
|
unsigned char __reserved;
|
||||||
|
unsigned char len;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
int handle_asf(struct ipmi_intf * intf, unsigned char * data, int data_len);
|
||||||
|
|
||||||
|
#endif /* IPMI_ASF_H */
|
1278
ipmitool/src/plugins/lan/lan.c
Normal file
1278
ipmitool/src/plugins/lan/lan.c
Normal file
File diff suppressed because it is too large
Load Diff
73
ipmitool/src/plugins/lan/lan.h
Normal file
73
ipmitool/src/plugins/lan/lan.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_LAN_H
|
||||||
|
#define IPMI_LAN_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define IPMI_LAN_CHANNEL_1 0x07
|
||||||
|
#define IPMI_LAN_CHANNEL_2 0x06
|
||||||
|
#define IPMI_LAN_CHANNEL_E 0x0e
|
||||||
|
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_NONE 0x0
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_MD2 0x1
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_MD5 0x2
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_KEY 0x4
|
||||||
|
#define IPMI_SESSION_AUTHTYPE_OEM 0x5
|
||||||
|
|
||||||
|
#define IPMI_SESSION_PRIV_CALLBACK 0x1
|
||||||
|
#define IPMI_SESSION_PRIV_USER 0x2
|
||||||
|
#define IPMI_SESSION_PRIV_OPERATOR 0x3
|
||||||
|
#define IPMI_SESSION_PRIV_ADMIN 0x4
|
||||||
|
#define IPMI_SESSION_PRIV_OEM 0x5
|
||||||
|
|
||||||
|
extern const struct valstr ipmi_privlvl_vals[];
|
||||||
|
extern const struct valstr ipmi_authtype_vals[];
|
||||||
|
|
||||||
|
extern struct ipmi_session lan_session;
|
||||||
|
unsigned char * ipmi_auth_md5(unsigned char * data, int data_len);
|
||||||
|
unsigned char ipmi_csum(unsigned char * d, int s);
|
||||||
|
|
||||||
|
struct ipmi_rs * ipmi_lan_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req);
|
||||||
|
int ipmi_lan_open(struct ipmi_intf * intf, char * hostname, int port, char * password);
|
||||||
|
void ipmi_lan_close(struct ipmi_intf * intf);
|
||||||
|
void ipmi_get_channel_info(struct ipmi_intf * intf, unsigned char channel);
|
||||||
|
int ipmi_lan_ping(struct ipmi_intf * intf);
|
||||||
|
|
||||||
|
struct ipmi_intf ipmi_lan_intf;
|
||||||
|
|
||||||
|
#endif /*IPMI_LAN_H*/
|
381
ipmitool/src/plugins/lan/md5.c
Normal file
381
ipmitool/src/plugins/lan/md5.c
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved.
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
L. Peter Deutsch
|
||||||
|
ghost@aladdin.com
|
||||||
|
|
||||||
|
*/
|
||||||
|
/* $Id: md5.c,v 1.1 2003/11/18 17:56:02 iceblink Exp $ */
|
||||||
|
/*
|
||||||
|
Independent implementation of MD5 (RFC 1321).
|
||||||
|
|
||||||
|
This code implements the MD5 Algorithm defined in RFC 1321, whose
|
||||||
|
text is available at
|
||||||
|
http://www.ietf.org/rfc/rfc1321.txt
|
||||||
|
The code is derived from the text of the RFC, including the test suite
|
||||||
|
(section A.5) but excluding the rest of Appendix A. It does not include
|
||||||
|
any code or documentation that is identified in the RFC as being
|
||||||
|
copyrighted.
|
||||||
|
|
||||||
|
The original and principal author of md5.c is L. Peter Deutsch
|
||||||
|
<ghost@aladdin.com>. Other authors are noted in the change history
|
||||||
|
that follows (in reverse chronological order):
|
||||||
|
|
||||||
|
2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
|
||||||
|
either statically or dynamically; added missing #include <string.h>
|
||||||
|
in library.
|
||||||
|
2002-03-11 lpd Corrected argument list for main(), and added int return
|
||||||
|
type, in test program and T value program.
|
||||||
|
2002-02-21 lpd Added missing #include <stdio.h> in test program.
|
||||||
|
2000-07-03 lpd Patched to eliminate warnings about "constant is
|
||||||
|
unsigned in ANSI C, signed in traditional"; made test program
|
||||||
|
self-checking.
|
||||||
|
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||||
|
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
|
||||||
|
1999-05-03 lpd Original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "md5.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */
|
||||||
|
#ifdef ARCH_IS_BIG_ENDIAN
|
||||||
|
# define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
|
||||||
|
#else
|
||||||
|
# define BYTE_ORDER 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define T_MASK ((md5_word_t)~0)
|
||||||
|
#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
|
||||||
|
#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
|
||||||
|
#define T3 0x242070db
|
||||||
|
#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
|
||||||
|
#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
|
||||||
|
#define T6 0x4787c62a
|
||||||
|
#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
|
||||||
|
#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
|
||||||
|
#define T9 0x698098d8
|
||||||
|
#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
|
||||||
|
#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
|
||||||
|
#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
|
||||||
|
#define T13 0x6b901122
|
||||||
|
#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
|
||||||
|
#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
|
||||||
|
#define T16 0x49b40821
|
||||||
|
#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
|
||||||
|
#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
|
||||||
|
#define T19 0x265e5a51
|
||||||
|
#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
|
||||||
|
#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
|
||||||
|
#define T22 0x02441453
|
||||||
|
#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
|
||||||
|
#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
|
||||||
|
#define T25 0x21e1cde6
|
||||||
|
#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
|
||||||
|
#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
|
||||||
|
#define T28 0x455a14ed
|
||||||
|
#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
|
||||||
|
#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
|
||||||
|
#define T31 0x676f02d9
|
||||||
|
#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
|
||||||
|
#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
|
||||||
|
#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
|
||||||
|
#define T35 0x6d9d6122
|
||||||
|
#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
|
||||||
|
#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
|
||||||
|
#define T38 0x4bdecfa9
|
||||||
|
#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
|
||||||
|
#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
|
||||||
|
#define T41 0x289b7ec6
|
||||||
|
#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
|
||||||
|
#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
|
||||||
|
#define T44 0x04881d05
|
||||||
|
#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
|
||||||
|
#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
|
||||||
|
#define T47 0x1fa27cf8
|
||||||
|
#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
|
||||||
|
#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
|
||||||
|
#define T50 0x432aff97
|
||||||
|
#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
|
||||||
|
#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
|
||||||
|
#define T53 0x655b59c3
|
||||||
|
#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
|
||||||
|
#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
|
||||||
|
#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
|
||||||
|
#define T57 0x6fa87e4f
|
||||||
|
#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
|
||||||
|
#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
|
||||||
|
#define T60 0x4e0811a1
|
||||||
|
#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
|
||||||
|
#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
|
||||||
|
#define T63 0x2ad7d2bb
|
||||||
|
#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
|
||||||
|
{
|
||||||
|
md5_word_t
|
||||||
|
a = pms->abcd[0], b = pms->abcd[1],
|
||||||
|
c = pms->abcd[2], d = pms->abcd[3];
|
||||||
|
md5_word_t t;
|
||||||
|
#if BYTE_ORDER > 0
|
||||||
|
/* Define storage only for big-endian CPUs. */
|
||||||
|
md5_word_t X[16];
|
||||||
|
#else
|
||||||
|
/* Define storage for little-endian or both types of CPUs. */
|
||||||
|
md5_word_t xbuf[16];
|
||||||
|
const md5_word_t *X;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
#if BYTE_ORDER == 0
|
||||||
|
/*
|
||||||
|
* Determine dynamically whether this is a big-endian or
|
||||||
|
* little-endian machine, since we can use a more efficient
|
||||||
|
* algorithm on the latter.
|
||||||
|
*/
|
||||||
|
static const int w = 1;
|
||||||
|
|
||||||
|
if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
|
||||||
|
#endif
|
||||||
|
#if BYTE_ORDER <= 0 /* little-endian */
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* On little-endian machines, we can process properly aligned
|
||||||
|
* data without copying it.
|
||||||
|
*/
|
||||||
|
if (!((data - (const md5_byte_t *)0) & 3)) {
|
||||||
|
/* data are properly aligned */
|
||||||
|
X = (const md5_word_t *)data;
|
||||||
|
} else {
|
||||||
|
/* not aligned */
|
||||||
|
memcpy(xbuf, data, 64);
|
||||||
|
X = xbuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if BYTE_ORDER == 0
|
||||||
|
else /* dynamic big-endian */
|
||||||
|
#endif
|
||||||
|
#if BYTE_ORDER >= 0 /* big-endian */
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* On big-endian machines, we must arrange the bytes in the
|
||||||
|
* right order.
|
||||||
|
*/
|
||||||
|
const md5_byte_t *xp = data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
# if BYTE_ORDER == 0
|
||||||
|
X = xbuf; /* (dynamic only) */
|
||||||
|
# else
|
||||||
|
# define xbuf X /* (static only) */
|
||||||
|
# endif
|
||||||
|
for (i = 0; i < 16; ++i, xp += 4)
|
||||||
|
xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
|
||||||
|
|
||||||
|
/* Round 1. */
|
||||||
|
/* Let [abcd k s i] denote the operation
|
||||||
|
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
|
||||||
|
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
|
||||||
|
#define SET(a, b, c, d, k, s, Ti)\
|
||||||
|
t = a + F(b,c,d) + X[k] + Ti;\
|
||||||
|
a = ROTATE_LEFT(t, s) + b
|
||||||
|
/* Do the following 16 operations. */
|
||||||
|
SET(a, b, c, d, 0, 7, T1);
|
||||||
|
SET(d, a, b, c, 1, 12, T2);
|
||||||
|
SET(c, d, a, b, 2, 17, T3);
|
||||||
|
SET(b, c, d, a, 3, 22, T4);
|
||||||
|
SET(a, b, c, d, 4, 7, T5);
|
||||||
|
SET(d, a, b, c, 5, 12, T6);
|
||||||
|
SET(c, d, a, b, 6, 17, T7);
|
||||||
|
SET(b, c, d, a, 7, 22, T8);
|
||||||
|
SET(a, b, c, d, 8, 7, T9);
|
||||||
|
SET(d, a, b, c, 9, 12, T10);
|
||||||
|
SET(c, d, a, b, 10, 17, T11);
|
||||||
|
SET(b, c, d, a, 11, 22, T12);
|
||||||
|
SET(a, b, c, d, 12, 7, T13);
|
||||||
|
SET(d, a, b, c, 13, 12, T14);
|
||||||
|
SET(c, d, a, b, 14, 17, T15);
|
||||||
|
SET(b, c, d, a, 15, 22, T16);
|
||||||
|
#undef SET
|
||||||
|
|
||||||
|
/* Round 2. */
|
||||||
|
/* Let [abcd k s i] denote the operation
|
||||||
|
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
|
||||||
|
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
|
||||||
|
#define SET(a, b, c, d, k, s, Ti)\
|
||||||
|
t = a + G(b,c,d) + X[k] + Ti;\
|
||||||
|
a = ROTATE_LEFT(t, s) + b
|
||||||
|
/* Do the following 16 operations. */
|
||||||
|
SET(a, b, c, d, 1, 5, T17);
|
||||||
|
SET(d, a, b, c, 6, 9, T18);
|
||||||
|
SET(c, d, a, b, 11, 14, T19);
|
||||||
|
SET(b, c, d, a, 0, 20, T20);
|
||||||
|
SET(a, b, c, d, 5, 5, T21);
|
||||||
|
SET(d, a, b, c, 10, 9, T22);
|
||||||
|
SET(c, d, a, b, 15, 14, T23);
|
||||||
|
SET(b, c, d, a, 4, 20, T24);
|
||||||
|
SET(a, b, c, d, 9, 5, T25);
|
||||||
|
SET(d, a, b, c, 14, 9, T26);
|
||||||
|
SET(c, d, a, b, 3, 14, T27);
|
||||||
|
SET(b, c, d, a, 8, 20, T28);
|
||||||
|
SET(a, b, c, d, 13, 5, T29);
|
||||||
|
SET(d, a, b, c, 2, 9, T30);
|
||||||
|
SET(c, d, a, b, 7, 14, T31);
|
||||||
|
SET(b, c, d, a, 12, 20, T32);
|
||||||
|
#undef SET
|
||||||
|
|
||||||
|
/* Round 3. */
|
||||||
|
/* Let [abcd k s t] denote the operation
|
||||||
|
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
|
||||||
|
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||||
|
#define SET(a, b, c, d, k, s, Ti)\
|
||||||
|
t = a + H(b,c,d) + X[k] + Ti;\
|
||||||
|
a = ROTATE_LEFT(t, s) + b
|
||||||
|
/* Do the following 16 operations. */
|
||||||
|
SET(a, b, c, d, 5, 4, T33);
|
||||||
|
SET(d, a, b, c, 8, 11, T34);
|
||||||
|
SET(c, d, a, b, 11, 16, T35);
|
||||||
|
SET(b, c, d, a, 14, 23, T36);
|
||||||
|
SET(a, b, c, d, 1, 4, T37);
|
||||||
|
SET(d, a, b, c, 4, 11, T38);
|
||||||
|
SET(c, d, a, b, 7, 16, T39);
|
||||||
|
SET(b, c, d, a, 10, 23, T40);
|
||||||
|
SET(a, b, c, d, 13, 4, T41);
|
||||||
|
SET(d, a, b, c, 0, 11, T42);
|
||||||
|
SET(c, d, a, b, 3, 16, T43);
|
||||||
|
SET(b, c, d, a, 6, 23, T44);
|
||||||
|
SET(a, b, c, d, 9, 4, T45);
|
||||||
|
SET(d, a, b, c, 12, 11, T46);
|
||||||
|
SET(c, d, a, b, 15, 16, T47);
|
||||||
|
SET(b, c, d, a, 2, 23, T48);
|
||||||
|
#undef SET
|
||||||
|
|
||||||
|
/* Round 4. */
|
||||||
|
/* Let [abcd k s t] denote the operation
|
||||||
|
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
|
||||||
|
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
|
||||||
|
#define SET(a, b, c, d, k, s, Ti)\
|
||||||
|
t = a + I(b,c,d) + X[k] + Ti;\
|
||||||
|
a = ROTATE_LEFT(t, s) + b
|
||||||
|
/* Do the following 16 operations. */
|
||||||
|
SET(a, b, c, d, 0, 6, T49);
|
||||||
|
SET(d, a, b, c, 7, 10, T50);
|
||||||
|
SET(c, d, a, b, 14, 15, T51);
|
||||||
|
SET(b, c, d, a, 5, 21, T52);
|
||||||
|
SET(a, b, c, d, 12, 6, T53);
|
||||||
|
SET(d, a, b, c, 3, 10, T54);
|
||||||
|
SET(c, d, a, b, 10, 15, T55);
|
||||||
|
SET(b, c, d, a, 1, 21, T56);
|
||||||
|
SET(a, b, c, d, 8, 6, T57);
|
||||||
|
SET(d, a, b, c, 15, 10, T58);
|
||||||
|
SET(c, d, a, b, 6, 15, T59);
|
||||||
|
SET(b, c, d, a, 13, 21, T60);
|
||||||
|
SET(a, b, c, d, 4, 6, T61);
|
||||||
|
SET(d, a, b, c, 11, 10, T62);
|
||||||
|
SET(c, d, a, b, 2, 15, T63);
|
||||||
|
SET(b, c, d, a, 9, 21, T64);
|
||||||
|
#undef SET
|
||||||
|
|
||||||
|
/* Then perform the following additions. (That is increment each
|
||||||
|
of the four registers by the value it had before this block
|
||||||
|
was started.) */
|
||||||
|
pms->abcd[0] += a;
|
||||||
|
pms->abcd[1] += b;
|
||||||
|
pms->abcd[2] += c;
|
||||||
|
pms->abcd[3] += d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
md5_init(md5_state_t *pms)
|
||||||
|
{
|
||||||
|
pms->count[0] = pms->count[1] = 0;
|
||||||
|
pms->abcd[0] = 0x67452301;
|
||||||
|
pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
|
||||||
|
pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
|
||||||
|
pms->abcd[3] = 0x10325476;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
|
||||||
|
{
|
||||||
|
const md5_byte_t *p = data;
|
||||||
|
int left = nbytes;
|
||||||
|
int offset = (pms->count[0] >> 3) & 63;
|
||||||
|
md5_word_t nbits = (md5_word_t)(nbytes << 3);
|
||||||
|
|
||||||
|
if (nbytes <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Update the message length. */
|
||||||
|
pms->count[1] += nbytes >> 29;
|
||||||
|
pms->count[0] += nbits;
|
||||||
|
if (pms->count[0] < nbits)
|
||||||
|
pms->count[1]++;
|
||||||
|
|
||||||
|
/* Process an initial partial block. */
|
||||||
|
if (offset) {
|
||||||
|
int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
|
||||||
|
|
||||||
|
memcpy(pms->buf + offset, p, copy);
|
||||||
|
if (offset + copy < 64)
|
||||||
|
return;
|
||||||
|
p += copy;
|
||||||
|
left -= copy;
|
||||||
|
md5_process(pms, pms->buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process full blocks. */
|
||||||
|
for (; left >= 64; p += 64, left -= 64)
|
||||||
|
md5_process(pms, p);
|
||||||
|
|
||||||
|
/* Process a final partial block. */
|
||||||
|
if (left)
|
||||||
|
memcpy(pms->buf, p, left);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
md5_finish(md5_state_t *pms, md5_byte_t digest[16])
|
||||||
|
{
|
||||||
|
static const md5_byte_t pad[64] = {
|
||||||
|
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
|
};
|
||||||
|
md5_byte_t data[8];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Save the length before padding. */
|
||||||
|
for (i = 0; i < 8; ++i)
|
||||||
|
data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
|
||||||
|
/* Pad to 56 bytes mod 64. */
|
||||||
|
md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
|
||||||
|
/* Append the length. */
|
||||||
|
md5_append(pms, data, 8);
|
||||||
|
for (i = 0; i < 16; ++i)
|
||||||
|
digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
|
||||||
|
}
|
91
ipmitool/src/plugins/lan/md5.h
Normal file
91
ipmitool/src/plugins/lan/md5.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved.
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
L. Peter Deutsch
|
||||||
|
ghost@aladdin.com
|
||||||
|
|
||||||
|
*/
|
||||||
|
/* $Id: md5.h,v 1.1 2003/11/18 17:56:02 iceblink Exp $ */
|
||||||
|
/*
|
||||||
|
Independent implementation of MD5 (RFC 1321).
|
||||||
|
|
||||||
|
This code implements the MD5 Algorithm defined in RFC 1321, whose
|
||||||
|
text is available at
|
||||||
|
http://www.ietf.org/rfc/rfc1321.txt
|
||||||
|
The code is derived from the text of the RFC, including the test suite
|
||||||
|
(section A.5) but excluding the rest of Appendix A. It does not include
|
||||||
|
any code or documentation that is identified in the RFC as being
|
||||||
|
copyrighted.
|
||||||
|
|
||||||
|
The original and principal author of md5.h is L. Peter Deutsch
|
||||||
|
<ghost@aladdin.com>. Other authors are noted in the change history
|
||||||
|
that follows (in reverse chronological order):
|
||||||
|
|
||||||
|
2002-04-13 lpd Removed support for non-ANSI compilers; removed
|
||||||
|
references to Ghostscript; clarified derivation from RFC 1321;
|
||||||
|
now handles byte order either statically or dynamically.
|
||||||
|
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
|
||||||
|
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
|
||||||
|
added conditionalization for C++ compilation from Martin
|
||||||
|
Purschke <purschke@bnl.gov>.
|
||||||
|
1999-05-03 lpd Original version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef md5_INCLUDED
|
||||||
|
# define md5_INCLUDED
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This package supports both compile-time and run-time determination of CPU
|
||||||
|
* byte order. If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
|
||||||
|
* compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
|
||||||
|
* defined as non-zero, the code will be compiled to run only on big-endian
|
||||||
|
* CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
|
||||||
|
* run on either big- or little-endian CPUs, but will run slightly less
|
||||||
|
* efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef unsigned char md5_byte_t; /* 8-bit byte */
|
||||||
|
typedef unsigned int md5_word_t; /* 32-bit word */
|
||||||
|
|
||||||
|
/* Define the state of the MD5 Algorithm. */
|
||||||
|
typedef struct md5_state_s {
|
||||||
|
md5_word_t count[2]; /* message length in bits, lsw first */
|
||||||
|
md5_word_t abcd[4]; /* digest buffer */
|
||||||
|
md5_byte_t buf[64]; /* accumulate block */
|
||||||
|
} md5_state_t;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialize the algorithm. */
|
||||||
|
void md5_init(md5_state_t *pms);
|
||||||
|
|
||||||
|
/* Append a string to the message. */
|
||||||
|
void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
|
||||||
|
|
||||||
|
/* Finish the message and return the digest. */
|
||||||
|
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* end extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* md5_INCLUDED */
|
80
ipmitool/src/plugins/lan/rmcp.h
Normal file
80
ipmitool/src/plugins/lan/rmcp.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_RMCP_H
|
||||||
|
#define IPMI_RMCP_H
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include "lan.h"
|
||||||
|
|
||||||
|
#define RMCP_VERSION_1 0x06
|
||||||
|
|
||||||
|
#define RMCP_UDP_PORT 0x26f /* port 623 */
|
||||||
|
#define RMCP_UDP_SECURE_PORT 0x298 /* port 664 */
|
||||||
|
|
||||||
|
#define RMCP_TYPE_MASK 0x80
|
||||||
|
#define RMCP_TYPE_NORM 0x00
|
||||||
|
#define RMCP_TYPE_ACK 0x01
|
||||||
|
|
||||||
|
static const struct valstr rmcp_type_vals[] __attribute__((unused)) = {
|
||||||
|
{ RMCP_TYPE_NORM, "Normal RMCP" },
|
||||||
|
{ RMCP_TYPE_ACK, "RMCP ACK" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RMCP_CLASS_MASK 0x1f
|
||||||
|
#define RMCP_CLASS_ASF 0x06
|
||||||
|
#define RMCP_CLASS_IPMI 0x07
|
||||||
|
#define RMCP_CLASS_OEM 0x08
|
||||||
|
|
||||||
|
static const struct valstr rmcp_class_vals[] __attribute__((unused)) = {
|
||||||
|
{ RMCP_CLASS_ASF, "ASF" },
|
||||||
|
{ RMCP_CLASS_IPMI, "IPMI" },
|
||||||
|
{ RMCP_CLASS_OEM, "OEM" },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* RMCP message header */
|
||||||
|
struct rmcp_hdr {
|
||||||
|
unsigned char ver;
|
||||||
|
unsigned char __reserved;
|
||||||
|
unsigned char seq;
|
||||||
|
unsigned char class;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
int handle_rmcp(struct ipmi_intf * intf, unsigned char * data, int data_len);
|
||||||
|
|
||||||
|
#endif /* IPMI_RMCP_H */
|
43
ipmitool/src/plugins/open/Makefile.am
Normal file
43
ipmitool/src/plugins/open/Makefile.am
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# Redistribution of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
#
|
||||||
|
# Redistribution 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.
|
||||||
|
#
|
||||||
|
# Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
# contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
#
|
||||||
|
# You acknowledge that this software is not designed or intended for use
|
||||||
|
# in the design, construction, operation or maintenance of any nuclear
|
||||||
|
# facility.
|
||||||
|
|
||||||
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
|
plugindir = $(pluginpath)
|
||||||
|
|
||||||
|
INCLUDES = -I$(top_srcdir)/include
|
||||||
|
|
||||||
|
intf_open_la_LDFLAGS = -module -avoid-version
|
||||||
|
plugin_LTLIBRARIES = intf_open.la
|
||||||
|
intf_open_la_SOURCES = open.c open.h
|
180
ipmitool/src/plugins/open/open.c
Normal file
180
ipmitool/src/plugins/open/open.c
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
|
||||||
|
#include <linux/ipmi.h>
|
||||||
|
|
||||||
|
#include "open.h"
|
||||||
|
|
||||||
|
static int curr_seq;
|
||||||
|
extern int verbose;
|
||||||
|
|
||||||
|
struct ipmi_intf ipmi_openipmi_intf = {
|
||||||
|
.open = ipmi_openipmi_open,
|
||||||
|
.close = ipmi_openipmi_close,
|
||||||
|
.sendrecv = ipmi_openipmi_send_cmd,
|
||||||
|
};
|
||||||
|
|
||||||
|
void ipmi_openipmi_close(struct ipmi_intf * intf)
|
||||||
|
{
|
||||||
|
if (intf && intf->fd >= 0)
|
||||||
|
close(intf->fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ipmi_openipmi_open(struct ipmi_intf * intf, char * dev, int __unused1, char * __unused2)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
intf->fd = open(OPENIPMI_DEV, O_RDWR);
|
||||||
|
else
|
||||||
|
intf->fd = open(dev, O_RDWR);
|
||||||
|
|
||||||
|
if (intf->fd < 0) {
|
||||||
|
perror("Could not open ipmi device");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl(intf->fd, IPMICTL_SET_GETS_EVENTS_CMD, &i)) {
|
||||||
|
perror("Could not set to get events");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
curr_seq = 0;
|
||||||
|
|
||||||
|
return intf->fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ipmi_rs * ipmi_openipmi_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req)
|
||||||
|
{
|
||||||
|
struct ipmi_recv recv;
|
||||||
|
struct ipmi_addr addr;
|
||||||
|
struct ipmi_system_interface_addr bmc_addr;
|
||||||
|
struct ipmi_req _req;
|
||||||
|
static struct ipmi_rs rsp;
|
||||||
|
fd_set rset;
|
||||||
|
|
||||||
|
if (!req)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memset(&_req, 0, sizeof(struct ipmi_req));
|
||||||
|
|
||||||
|
if (verbose > 2)
|
||||||
|
printbuf(req->msg.data, req->msg.data_len, "send_ipmi_cmd_dev");
|
||||||
|
|
||||||
|
FD_ZERO(&rset);
|
||||||
|
FD_SET(intf->fd, &rset);
|
||||||
|
|
||||||
|
bmc_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE;
|
||||||
|
bmc_addr.channel = IPMI_BMC_CHANNEL;
|
||||||
|
bmc_addr.lun = 0;
|
||||||
|
|
||||||
|
_req.addr = (char *) &bmc_addr;
|
||||||
|
_req.addr_len = sizeof(bmc_addr);
|
||||||
|
_req.msgid = curr_seq++;
|
||||||
|
|
||||||
|
_req.msg.netfn = req->msg.netfn;
|
||||||
|
_req.msg.cmd = req->msg.cmd;
|
||||||
|
_req.msg.data = req->msg.data;
|
||||||
|
_req.msg.data_len = req->msg.data_len;
|
||||||
|
|
||||||
|
if (ioctl(intf->fd, IPMICTL_SEND_COMMAND, &_req) < 0) {
|
||||||
|
printf("Error sending command: %s\n", strerror(errno));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (select(intf->fd+1, &rset, NULL, NULL, NULL) < 0) {
|
||||||
|
perror("select");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!FD_ISSET(intf->fd, &rset)) {
|
||||||
|
printf("Error no data available\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
recv.addr = (char *) &addr;
|
||||||
|
recv.addr_len = sizeof(addr);
|
||||||
|
recv.msg.data = rsp.data;
|
||||||
|
recv.msg.data_len = sizeof(rsp.data);
|
||||||
|
|
||||||
|
/* get data */
|
||||||
|
if (ioctl(intf->fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv) < 0) {
|
||||||
|
printf("Error receiving message: %s\n", strerror(errno));
|
||||||
|
if (errno != EMSGSIZE)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose > 1) {
|
||||||
|
printf("Got message:\n");
|
||||||
|
printf(" type = %d\n", recv.recv_type);
|
||||||
|
printf(" channel = 0x%x\n", addr.channel);
|
||||||
|
printf(" msgid = %ld\n", recv.msgid);
|
||||||
|
printf(" netfn = 0x%x\n", recv.msg.netfn);
|
||||||
|
printf(" cmd = 0x%x\n", recv.msg.cmd);
|
||||||
|
if (recv.msg.data && recv.msg.data_len) {
|
||||||
|
printf(" data_len = %d\n", recv.msg.data_len);
|
||||||
|
printf(" data =");
|
||||||
|
printbuf(recv.msg.data, recv.msg.data_len, "data");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rsp.ccode = recv.msg.data[0];
|
||||||
|
rsp.data_len = recv.msg.data_len - 1;
|
||||||
|
|
||||||
|
if (!rsp.ccode && rsp.data_len) {
|
||||||
|
memmove(rsp.data, rsp.data + 1, rsp.data_len);
|
||||||
|
rsp.data[recv.msg.data_len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &rsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
int intf_setup(struct ipmi_intf ** intf)
|
||||||
|
{
|
||||||
|
*intf = &ipmi_openipmi_intf;
|
||||||
|
return 0;
|
||||||
|
}
|
48
ipmitool/src/plugins/open/open.h
Normal file
48
ipmitool/src/plugins/open/open.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution 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.
|
||||||
|
*
|
||||||
|
* Neither the name of Sun Microsystems, Inc. or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* This software is provided "AS IS," without a warranty of any kind.
|
||||||
|
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||||
|
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||||
|
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||||
|
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||||
|
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||||
|
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||||
|
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||||
|
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||||
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
*
|
||||||
|
* You acknowledge that this software is not designed or intended for use
|
||||||
|
* in the design, construction, operation or maintenance of any nuclear
|
||||||
|
* facility.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef IPMI_OPENIPMI_H
|
||||||
|
#define IPMI_OPENIPMI_H
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define OPENIPMI_DEV "/dev/ipmi0"
|
||||||
|
|
||||||
|
struct ipmi_rs * ipmi_openipmi_send_cmd(struct ipmi_intf * intf, struct ipmi_rq * req);
|
||||||
|
int ipmi_openipmi_open(struct ipmi_intf * intf, char * dev, int __unused1, char * __unused2);
|
||||||
|
void ipmi_openipmi_close(struct ipmi_intf * intf);
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user