summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2017-04-03 08:10:45 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2017-04-03 08:10:45 +0200
commitef81710c7b9b7a8b0497f4d9b5750e23c48cdcd6 (patch)
tree80fc7feebf77913ed29f8e6dbf8c514d0eaf0f9c
parentde403b575d6475cc4789049c50dbe44effff71d4 (diff)
parente3a9bfc89256e939ab1c1f56f6961b6ee15aa84a (diff)
Merge tag 'upstream/3.0.3'
Upstream version 3.0.3
-rw-r--r--ChangeLog18
-rw-r--r--TODO53
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac2
-rw-r--r--debpkg/changelog12
-rw-r--r--doc/Makefile29
-rw-r--r--doc/Makefile.am1
-rw-r--r--doc/Makefile.in1
-rw-r--r--doc/UserGuide126
-rw-r--r--doc/ipmiutil.spec4
-rw-r--r--doc/iuser.8107
-rw-r--r--lib/Makefile28
-rw-r--r--lib/libipmiutil.pc2
-rw-r--r--scripts/Makefile30
-rw-r--r--scripts/Makefile.am2
-rw-r--r--scripts/Makefile.in2
-rwxr-xr-xscripts/iuser2
-rwxr-xr-xsetver2
-rw-r--r--util/Makefile.am2
-rw-r--r--util/Makefile.in7
-rw-r--r--util/ialarms.c2
-rw-r--r--util/icmd.c2
-rw-r--r--util/iconfig.c2
-rw-r--r--util/idcmi.c2
-rw-r--r--util/ievents.c2
-rw-r--r--util/ifirewall.c2
-rw-r--r--util/ifru.c2
-rw-r--r--util/ifruset.c2
-rw-r--r--util/igetevent.c2
-rw-r--r--util/ihealth.c5
-rw-r--r--util/ilan.c9765
-rw-r--r--util/ilan.c~5242
-rw-r--r--util/ipicmg.c2
-rw-r--r--util/ipmiutil.c5
-rw-r--r--util/ipmiutil.h1
-rw-r--r--util/ipmiutil.mak5
-rw-r--r--util/ipmiutil64.mak5
-rw-r--r--util/ireset.c2
-rw-r--r--util/isel.c2
-rw-r--r--util/iseltime.c55
-rw-r--r--util/isensor.c2
-rw-r--r--util/iserial.c2
-rw-r--r--util/isol.c2
-rw-r--r--util/itsol.c2
-rw-r--r--util/iuser.c298
-rw-r--r--util/iwdt.c2
-rw-r--r--util/oem_dell.c2
-rw-r--r--util/oem_hp.c13
-rw-r--r--util/oem_sun.c2
-rw-r--r--util/oem_supermicro.c2
50 files changed, 11306 insertions, 4578 deletions
diff --git a/ChangeLog b/ChangeLog
index 3285b3e..278a0cb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4242,3 +4242,21 @@ wdt.8 iwdt.8 (ipmiutil wdt)
ihpm (ipmiutil hpm) ver 1.09
idiscover(ipmiutil discover) ver 1.11
ipmi_port (ipmi_port) ver 1.4
+
+03/24/2016 ARCress ipmiutil-3.0.3 changes
+ util/ihealth.c - add more SuperMicro product strings for X11,
+ add some Lenovo and HP restrictions
+ util/iseltime.c - add get_sel_utc/set_sel_utc routines
+ util/oem_hp.c - Remove custom 0x40 Init for HP (support#22 fix)
+ util/ilan.c - added GetUserInfo routine for iuser
+ util/iuser.c - new file, user subfunctions
+ util/ilan.c - fix indenting
+ util/Makefile.am - add iuser.c
+ util/*.mak - add iuser.c
+ ipmiutil-3.0.3 contains:
+ ipmiutil (ipmiutil) ver 3.03
+ ...(various subcommands) ver 3.03
+ ifwum (ipmiutil fwum) ver 1.3
+ ihpm (ipmiutil hpm) ver 1.09
+ idiscover (ipmiutil discover) ver 1.11
+ ipmi_port (ipmi_port) ver 1.4
diff --git a/TODO b/TODO
index 1de2378..eab5ca2 100644
--- a/TODO
+++ b/TODO
@@ -2,24 +2,17 @@
IPMIUTIL PROJECT TODO LIST:
Add subcommand to consolidate user functions
- . enable, disable, list, set(priv/username/psw)
+ user list (shows max,enabled, lists all users)
+ user enable <user_id> [chan]
+ user disable <user_id>
+ user set name <user_id> <username>
+ user set password <user_id> [<password>]
+ user set priv <user_id> <priv_level> [chan]
IPV6 for IPMI LAN on Windows:
Currently support IPV6 on Linux, but need to implement for Windows also
. implement IPV6 for Windows (#ifdef WIN32 case)
-Test SuperMicro DIMM event logic (pending bad DIMM)
- PARTIAL in ipmiutil-2.9.9, revised code implemented
-
-Add support for openssl-1.1.0 for fedora
- COMPLETE in ipmiutil-3.0.1
-
-Add OEM Lenovo SEL decoding
- PARTIAL in ipmiutil-3.0.1, pending test data
-
-Add OEM Lenovo sensor decoding
- COMPLETE in ipmiutil-3.0.1
-
Thread-safe changes for IPMI LAN:
Change ipmicmd.c/ipmilan.c to be thread-safe if accessing multiple nodes.
Currently it is only conditionally safe, if threads access the same node.
@@ -31,6 +24,11 @@ Thread-safe changes for IPMI LAN:
Add an option/variant of canonical output for CSV (delimiter = ',')
The current delimiter for -c is '|'
+More automated testing
+ Started this in ipmiutil-2.6.6 with testipmi.sh, but it could be
+ more extensive and be tested on more types of IPMI firmware.
+ PARTIAL in ipmiutil-2.6.6 with testipmi.sh
+
SPD decoding:
. handle DDR4 SPD format
. expose SPD decoding from file/buffer, not just FRU
@@ -39,11 +37,12 @@ SPD decoding:
Add additional IPMI 2.0 commands from addendum:
c Get/Set System Info
- . Get/Set SEL UTC Offset (requested 4/22/13)
+ c Get/Set SEL UTC Offset (requested 4/22/13)
. Forwarded Command
PARTIAL in ipmiutil-2.8.1, adding Get/Set System Info functions
+ PARTIAL in ipmiutil-3.0.3, adding Get/Set SEL UTC Offset functions
-Add DCMI 1.5 commands for NetFn 0x2C to ipmiutil
+Add more DCMI 1.5 commands for NetFn 0x2C to ipmiutil
. Get/Set DCMI Configuration Parameters (DCMI 1.5)
. Get/Set Thermal Limit (DCMI 1.5)
@@ -58,14 +57,6 @@ Resolve MS ipmidrv.sys WBEM access memory leak:
https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/ca4df181-7fd4-4912-83a0-5896b030e3ca/latest-version-of-microsoft-ipmi-driver-ipmidrvsys?forum=wdk
OPEN - no update/fix from Microsoft
-SuperMicro Users:
- . implement an OEM cmd to set user privilege level (needs research)
-
-More automated testing
- Started this in ipmiutil-2.6.6 with testipmi.sh, but it could be
- more extensive and be tested on more types of IPMI firmware.
- PARTIAL in ipmiutil-2.6.6 with testipmi.sh
-
Remove assert() calls from lanplus code
Need to improve error handling and remove all assert() calls from
the lib/lanplus/ code: lanplus.c lanplus_crypt.c lanplus_crypt_impl.c
@@ -85,6 +76,22 @@ Add a function to send ctl-alt-del through SOL console
------------------------------------------------------------------------------
IPMIUTIL COMPLETED TODO TASKS:
+Test SuperMicro DIMM event logic (pending bad DIMM)
+ COMPLETE in ipmiutil-2.9.9, revised code implemented
+
+Add support for openssl-1.1.0 for fedora
+ COMPLETE in ipmiutil-3.0.1
+
+Add OEM Lenovo SEL decoding
+ COMPLETE in ipmiutil-3.0.1
+
+Add OEM Lenovo sensor decoding
+ COMPLETE in ipmiutil-3.0.1
+
+Add HP-UX support
+ PARTIAL in ipmiutil-2.8.4
+ COMPLETE in ipmiutil-2.9.8
+
stdout/stderr debug messages mixed
. have a variable for stderr and if -x debug, set it to stdout.
. implemented in util/subs.c lprintf() based on log level
diff --git a/configure b/configure
index 34fdca1..97c3665 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for ipmiutil 3.0.2.
+# Generated by GNU Autoconf 2.63 for ipmiutil 3.0.3.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
@@ -743,8 +743,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package.
PACKAGE_NAME='ipmiutil'
PACKAGE_TARNAME='ipmiutil'
-PACKAGE_VERSION='3.0.2'
-PACKAGE_STRING='ipmiutil 3.0.2'
+PACKAGE_VERSION='3.0.3'
+PACKAGE_STRING='ipmiutil 3.0.3'
PACKAGE_BUGREPORT=''
ac_unique_file="util/ipmiutil.c"
@@ -1503,7 +1503,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures ipmiutil 3.0.2 to adapt to many kinds of systems.
+\`configure' configures ipmiutil 3.0.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1573,7 +1573,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of ipmiutil 3.0.2:";;
+ short | recursive ) echo "Configuration of ipmiutil 3.0.3:";;
esac
cat <<\_ACEOF
@@ -1683,7 +1683,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-ipmiutil configure 3.0.2
+ipmiutil configure 3.0.3
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1697,7 +1697,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by ipmiutil $as_me 3.0.2, which was
+It was created by ipmiutil $as_me 3.0.3, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2551,7 +2551,7 @@ fi
# Define the identity of the package.
PACKAGE='ipmiutil'
- VERSION='3.0.2'
+ VERSION='3.0.3'
cat >>confdefs.h <<_ACEOF
@@ -13943,7 +13943,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by ipmiutil $as_me 3.0.2, which was
+This file was extended by ipmiutil $as_me 3.0.3, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -14006,7 +14006,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-ipmiutil config.status 3.0.2
+ipmiutil config.status 3.0.3
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff --git a/configure.ac b/configure.ac
index a1d38c5..7e21f7a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(ipmiutil,3.0.2)
+AC_INIT(ipmiutil,3.0.3)
AC_CONFIG_SRCDIR(util/ipmiutil.c)
echo "ipmiutil version ${PACKAGE_VERSION}"
AM_CONFIG_HEADER(config.h)
diff --git a/debpkg/changelog b/debpkg/changelog
index 892812f..bb882b1 100644
--- a/debpkg/changelog
+++ b/debpkg/changelog
@@ -1,3 +1,15 @@
+ipmiutil (3.0.3-1) unstable; urgency=low
+
+ * New upstream version.
+
+ -- Andy Cress <arcress@users.sourceforge.net> Thu, 23 Mar 2017 17:50:37 -0400
+
+ipmiutil (3.0.3-1) unstable; urgency=low
+
+ * New upstream version.
+
+ -- Andy Cress <arcress@users.sourceforge.net> Thu, 23 Mar 2017 17:48:10 -0400
+
ipmiutil (3.0.2-1) unstable; urgency=low
* New upstream version.
diff --git a/doc/Makefile b/doc/Makefile
index 07c0069..5f0e9ee 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -46,12 +46,12 @@ CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run aclocal-1.11
-AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run tar
+ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run aclocal-1.11
+AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run tar
AR = ar
-AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoheader
-AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run automake-1.11
+AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoconf
+AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoheader
+AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run automake-1.11
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
@@ -99,7 +99,7 @@ LIB_DIR = /usr/lib64
LIPO =
LN_S = ln -s
LTLIBOBJS =
-MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run makeinfo
+MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run makeinfo
MKDIR_P = /bin/mkdir -p
NM = /usr/bin/nm -B
NMEDIT =
@@ -113,9 +113,9 @@ OTOOL64 =
PACKAGE = ipmiutil
PACKAGE_BUGREPORT =
PACKAGE_NAME = ipmiutil
-PACKAGE_STRING = ipmiutil 3.0.2
+PACKAGE_STRING = ipmiutil 3.0.3
PACKAGE_TARNAME = ipmiutil
-PACKAGE_VERSION = 3.0.2
+PACKAGE_VERSION = 3.0.3
PATH_SEPARATOR = :
PKG_DIR = /root/rpmbuild
RANLIB = ranlib
@@ -127,11 +127,11 @@ SHR_LINK = libipmiutil.so.1
STRIP = strip
SUBDIR_S = doc scripts lib util
SYSTEMD_DIR = /usr/share/ipmiutil
-VERSION = 3.0.2
-abs_builddir = /usr/dev/ipmiutil-3.0.2/doc
-abs_srcdir = /usr/dev/ipmiutil-3.0.2/doc
-abs_top_builddir = /usr/dev/ipmiutil-3.0.2
-abs_top_srcdir = /usr/dev/ipmiutil-3.0.2
+VERSION = 3.0.3
+abs_builddir = /usr/dev/ipmiutil-3.0.3/doc
+abs_srcdir = /usr/dev/ipmiutil-3.0.3/doc
+abs_top_builddir = /usr/dev/ipmiutil-3.0.3
+abs_top_srcdir = /usr/dev/ipmiutil-3.0.3
ac_ct_CC = gcc
ac_ct_DUMPBIN =
am__include = include
@@ -159,7 +159,7 @@ host_vendor = redhat
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.2/install-sh
+install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.3/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
@@ -414,6 +414,7 @@ install:
${INSTALL_DATA_SH} idelloem.8 ${manto}
${INSTALL_DATA_SH} idcmi.8 ${manto}
${INSTALL_DATA_SH} ismcoem.8 ${manto}
+ ${INSTALL_DATA_SH} iuser.8 ${manto}
${INSTALL_DATA_SH} bmclanpet.mib ${datato}
cd ${manto}; gzip -f *.8
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 832b0d1..632cc49 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -56,6 +56,7 @@ install:
${INSTALL_DATA_SH} idelloem.8 ${manto}
${INSTALL_DATA_SH} idcmi.8 ${manto}
${INSTALL_DATA_SH} ismcoem.8 ${manto}
+ ${INSTALL_DATA_SH} iuser.8 ${manto}
${INSTALL_DATA_SH} bmclanpet.mib ${datato}
cd ${manto}; gzip -f *.8
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 7afa686..15917e8 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -414,6 +414,7 @@ install:
${INSTALL_DATA_SH} idelloem.8 ${manto}
${INSTALL_DATA_SH} idcmi.8 ${manto}
${INSTALL_DATA_SH} ismcoem.8 ${manto}
+ ${INSTALL_DATA_SH} iuser.8 ${manto}
${INSTALL_DATA_SH} bmclanpet.mib ${datato}
cd ${manto}; gzip -f *.8
diff --git a/doc/UserGuide b/doc/UserGuide
index b35739a..6c2207e 100644
--- a/doc/UserGuide
+++ b/doc/UserGuide
@@ -1,6 +1,6 @@
IPMIUTIL USER GUIDE
- VERSION 3.0.2
+ VERSION 3.0.3
An easy-to-use IPMI server management utility
@@ -42,6 +42,7 @@
3.27 IDCMI (ipmiutil dcmi)
3.28 ISMCOEM (ipmiutil smcoem)
3.29 ISELTIME (iseltime)
+ 3.30 IUSER (ipmiutil user)
4.0 Use Cases
4.1 Usage of IPMI utilities for sensor thresholds
4.2 Usage to configure a system for IPMI LAN
@@ -4585,6 +4586,129 @@ WARNINGS
See http://ipmiutil.sourceforge.net/ for the latest version of ipmiutil
and any bug fix list.
+
+--------------------------------------
+3.30 IUSER (ipmiutil user)
+
+IUSER(8) IUSER(8)
+
+
+
+NAME
+ ipmiutil_user - handle user functions
+
+
+SYNOPSIS
+ ipmiutil user [-cmsx -NUPREFTVY] <function>
+
+
+DESCRIPTION
+ This ipmiutil user subcommand handles IPMI LAN user functions sepa-
+ rately.
+ These functions can also be handled from ipmiutil lan -q, -u, -p, -v.
+
+ This utility can use either the /dev/ipmi0 driver from OpenIPMI, the
+ /dev/imb driver from Intel, the /dev/ipmikcs driver from valinux,
+ direct user-space IOs, or the IPMI LAN interface if -N.
+
+
+OPTIONS
+ Command line options are described below.
+
+ -c Canonical, delimited output format
+
+ -m 002000
+ Target a specific MC (e.g. bus 00, sa 20, lun 00). This could
+ be used for PICMG or ATCA blade systems. The trailing charac-
+ ter, if present, indicates SMI addressing if ’s’, or IPMB
+ addressing if ’i’ or not present.
+
+ -s When getting info, also get the DCMI sensor information.
+
+ -x Causes extra debug messages to be displayed.
+
+ -N nodename
+ Nodename or IP address of the remote target system. If a node-
+ name is specified, IPMI LAN interface is used. Otherwise the
+ local system management interface is used.
+
+ -U rmt_user
+ Remote username for the nodename given. The default is a null
+ username.
+
+ -P/-R rmt_pswd
+ Remote password for the nodename given. The default is a null
+ password.
+
+ -E Use the remote password from Environment variable IPMI_PASSWORD.
+
+ -F drv_t
+ Force the driver type to one of the followng: imb, va, open,
+ gnu, landesk, lan, lan2, lan2i, kcs, smb. Note that lan2i means
+ lan2 with intelplus. The default is to detect any available
+ driver type and use it.
+
+ -J Use the specified LanPlus cipher suite (0 thru 17):
+ 0=none/none/none, 1=sha1/none/none, 2=sha1/sha1/none,
+ 3=sha1/sha1/cbc128, 4=sha1/sha1/xrc4_128, 5=sha1/sha1/xrc4_40,
+ 6=md5/none/none, ... 14=md5/md5/xrc4_40. Default is 3.
+
+ -T Use a specified IPMI LAN Authentication Type: 0=None, 1=MD2,
+ 2=MD5, 4=Straight Password, 5=OEM.
+
+ -V Use a specified IPMI LAN privilege level. 1=Callback level,
+ 2=User level, 3=Operator level, 4=Administrator level (default),
+ 5=OEM level.
+
+ -Y Yes, do prompt the user for the IPMI LAN remote password.
+ Alternatives for the password are -E or -P.
+
+
+FUNCTIONS
+ list [channel]
+ List the IPMI LAN users with enabled status, privilege level,
+ and username. Optionally specify a channel number.
+
+ enable <user_num> [channel]
+ Enable the specified user number and optionally specify an IPMI
+ LAN channel number.
+
+ disable <user_num>]
+ Disable the specified user number, so that it has ’No access’.
+
+
+ set <user_num> name <username>
+ Set the username for a specified user number.
+
+
+ set <user_num> password <password>
+ Set the password for a specified user number.
+
+
+ set <user_num> priv <priv_level> [channel]
+ Set the privilege level for a specified user number, where the
+ privilege level is 4=Admin, 3=Operator, 2=User. Also optionally
+ specify a channel number.
+
+
+ help Show the help (usage) message
+
+
+EXAMPLES
+ ipmiutil user set 2 name user2
+ Sets the username for user 2 to "user2".
+
+
+
+SEE ALSO
+ ipmiutil(8) ialarms(8) iconfig(8) idiscover(8) ievents(8) ifru(8)
+ igetevent(8) ihealth(8) ilan(8) ireset(8) isel(8) isensor(8) iserial(8)
+ isol(8) iwdt(8)
+
+
+WARNINGS
+ See http://ipmiutil.sourceforge.net/ for the latest version of ipmiutil
+ and any bug fix list.
--------------------------
diff --git a/doc/ipmiutil.spec b/doc/ipmiutil.spec
index 6fab0b4..01dbbcf 100644
--- a/doc/ipmiutil.spec
+++ b/doc/ipmiutil.spec
@@ -3,7 +3,7 @@
# Copyright (c) 2012 Andy Cress
#
Name: ipmiutil
-Version: 3.0.2
+Version: 3.0.3
Release: 1%{?dist}
Summary: Easy-to-use IPMI server management utilities
License: BSD
@@ -123,6 +123,7 @@ rm -rf %{buildroot}
%{_sbindir}/ifirewall
%{_sbindir}/ifwum
%{_sbindir}/ihpm
+%{_sbindir}/iuser
%{_libdir}/libipmiutil.so.1
%{_datadir}/%{name}/ipmiutil_evt
%{_datadir}/%{name}/ipmiutil_asy
@@ -168,6 +169,7 @@ rm -rf %{buildroot}
%{_mandir}/man8/iekanalyzer.8*
%{_mandir}/man8/itsol.8*
%{_mandir}/man8/idcmi.8*
+%{_mandir}/man8/iuser.8*
%doc AUTHORS ChangeLog COPYING NEWS README TODO
%doc doc/UserGuide
diff --git a/doc/iuser.8 b/doc/iuser.8
new file mode 100644
index 0000000..653e9ec
--- /dev/null
+++ b/doc/iuser.8
@@ -0,0 +1,107 @@
+.TH IUSER 8 "Version 1.0: 23 Feb 2017"
+.SH NAME
+ipmiutil_user \- handle user functions
+
+.SH SYNOPSIS
+.B "ipmiutil user [-cmsx -NUPREFTVY] <function>
+
+.SH DESCRIPTION
+This
+.I ipmiutil user
+subcommand handles IPMI LAN user functions separately.
+These functions can also be handled from ipmiutil lan -q, -u, -p, -v.
+
+This utility can use either the /dev/ipmi0 driver from OpenIPMI,
+the /dev/imb driver from Intel, the /dev/ipmikcs driver from valinux,
+direct user-space IOs, or the IPMI LAN interface if \-N.
+
+.SH OPTIONS
+Command line options are described below.
+.IP "-c"
+Canonical, delimited output format
+.IP "-m 002000"
+Target a specific MC (e.g. bus 00, sa 20, lun 00).
+This could be used for PICMG or ATCA blade systems.
+The trailing character, if present, indicates SMI addressing if 's',
+or IPMB addressing if 'i' or not present.
+.IP "-s"
+When getting info, also get the DCMI sensor information.
+.IP "-x"
+Causes extra debug messages to be displayed.
+.IP "-N nodename"
+Nodename or IP address of the remote target system. If a nodename is
+specified, IPMI LAN interface is used. Otherwise the local system
+management interface is used.
+.IP "-U rmt_user"
+Remote username for the nodename given. The default is a null username.
+.IP "-P/-R rmt_pswd"
+Remote password for the nodename given. The default is a null password.
+.IP "-E"
+Use the remote password from Environment variable IPMI_PASSWORD.
+.IP "-F drv_t"
+Force the driver type to one of the followng:
+imb, va, open, gnu, landesk, lan, lan2, lan2i, kcs, smb.
+Note that lan2i means lan2 with intelplus.
+The default is to detect any available driver type and use it.
+.IP "-J"
+Use the specified LanPlus cipher suite (0 thru 17): 0=none/none/none,
+1=sha1/none/none, 2=sha1/sha1/none, 3=sha1/sha1/cbc128, 4=sha1/sha1/xrc4_128,
+5=sha1/sha1/xrc4_40, 6=md5/none/none, ... 14=md5/md5/xrc4_40.
+Default is 3.
+.IP "-T"
+Use a specified IPMI LAN Authentication Type: 0=None, 1=MD2, 2=MD5, 4=Straight Password, 5=OEM.
+.IP "-V"
+Use a specified IPMI LAN privilege level. 1=Callback level, 2=User level, 3=Operator level, 4=Administrator level (default), 5=OEM level.
+.IP "-Y"
+Yes, do prompt the user for the IPMI LAN remote password.
+Alternatives for the password are \-E or \-P.
+
+.SH FUNCTIONS
+
+.IP "list [channel]"
+List the IPMI LAN users with enabled status, privilege level, and username.
+Optionally specify a channel number.
+
+.IP "enable <user_num> [channel]"
+Enable the specified user number and optionally specify an IPMI LAN channel number.
+.IP "disable <user_num>]"
+Disable the specified user number, so that it has 'No access'.
+
+.IP "set <user_num> name <username>"
+Set the username for a specified user number.
+
+.IP "set <user_num> password <password>"
+Set the password for a specified user number.
+
+.IP "set <user_num> priv <priv_level> [channel]"
+Set the privilege level for a specified user number, where the privilege level is 4=Admin, 3=Operator, 2=User. Also optionally specify a channel number.
+
+.IP "help"
+Show the help (usage) message
+
+.SH "EXAMPLES"
+ipmiutil user set 2 name user2
+.br
+Sets the username for user 2 to "user2".
+
+
+.SH "SEE ALSO"
+ipmiutil(8) ialarms(8) iconfig(8) idiscover(8) ievents(8) ifru(8) igetevent(8) ihealth(8) ilan(8) ireset(8) isel(8) isensor(8) iserial(8) isol(8) iwdt(8)
+
+.SH WARNINGS
+See http://ipmiutil.sourceforge.net/ for the latest version of ipmiutil and any bug fix list.
+
+.SH COPYRIGHT
+Copyright (C) 2017 Andy Cress
+.PP
+See the file COPYING in the distribution for more details
+regarding redistribution.
+.PP
+This utility is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY.
+
+.SH AUTHOR
+.PP
+Andy Cress <arcress at users.sourceforge.net>
+.br
+
diff --git a/lib/Makefile b/lib/Makefile
index 1378ff4..7c7afca 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -47,12 +47,12 @@ CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run aclocal-1.11
-AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run tar
+ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run aclocal-1.11
+AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run tar
AR = ar
-AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoheader
-AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run automake-1.11
+AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoconf
+AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoheader
+AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run automake-1.11
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
@@ -101,7 +101,7 @@ LIB_DIR = /usr/lib64
LIPO =
LN_S = ln -s
LTLIBOBJS =
-MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run makeinfo
+MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run makeinfo
MKDIR_P = /bin/mkdir -p
NM = /usr/bin/nm -B
NMEDIT =
@@ -115,9 +115,9 @@ OTOOL64 =
PACKAGE = ipmiutil
PACKAGE_BUGREPORT =
PACKAGE_NAME = ipmiutil
-PACKAGE_STRING = ipmiutil 3.0.2
+PACKAGE_STRING = ipmiutil 3.0.3
PACKAGE_TARNAME = ipmiutil
-PACKAGE_VERSION = 3.0.2
+PACKAGE_VERSION = 3.0.3
PATH_SEPARATOR = :
PKG_DIR = /root/rpmbuild
RANLIB = ranlib
@@ -129,11 +129,11 @@ SHR_LINK = libipmiutil.so.1
STRIP = strip
SUBDIR_S = doc scripts lib util
SYSTEMD_DIR = /usr/share/ipmiutil
-VERSION = 3.0.2
-abs_builddir = /usr/dev/ipmiutil-3.0.2/lib
-abs_srcdir = /usr/dev/ipmiutil-3.0.2/lib
-abs_top_builddir = /usr/dev/ipmiutil-3.0.2
-abs_top_srcdir = /usr/dev/ipmiutil-3.0.2
+VERSION = 3.0.3
+abs_builddir = /usr/dev/ipmiutil-3.0.3/lib
+abs_srcdir = /usr/dev/ipmiutil-3.0.3/lib
+abs_top_builddir = /usr/dev/ipmiutil-3.0.3
+abs_top_srcdir = /usr/dev/ipmiutil-3.0.3
ac_ct_CC = gcc
ac_ct_DUMPBIN =
am__include = include
@@ -161,7 +161,7 @@ host_vendor = redhat
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.2/install-sh
+install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.3/install-sh
libdir = $(iprefix)/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
diff --git a/lib/libipmiutil.pc b/lib/libipmiutil.pc
index a1d97de..10acea4 100644
--- a/lib/libipmiutil.pc
+++ b/lib/libipmiutil.pc
@@ -8,6 +8,6 @@ nutuser=@RUN_AS_USER@
Name: libipmiutil
Description: Library for ipmiutil
-Version: 3.0.2
+Version: 3.0.3
Libs: -L${libdir} -lipmi_lanplus
Cflags: -I${includedir}
diff --git a/scripts/Makefile b/scripts/Makefile
index 6818ee0..1e5d70c 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -46,12 +46,12 @@ CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run aclocal-1.11
-AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run tar
+ACLOCAL = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run aclocal-1.11
+AMTAR = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run tar
AR = ar
-AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoconf
-AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run autoheader
-AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run automake-1.11
+AUTOCONF = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoconf
+AUTOHEADER = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run autoheader
+AUTOMAKE = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run automake-1.11
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
@@ -99,7 +99,7 @@ LIB_DIR = /usr/lib64
LIPO =
LN_S = ln -s
LTLIBOBJS =
-MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.2/missing --run makeinfo
+MAKEINFO = ${SHELL} /usr/dev/ipmiutil-3.0.3/missing --run makeinfo
MKDIR_P = /bin/mkdir -p
NM = /usr/bin/nm -B
NMEDIT =
@@ -113,9 +113,9 @@ OTOOL64 =
PACKAGE = ipmiutil
PACKAGE_BUGREPORT =
PACKAGE_NAME = ipmiutil
-PACKAGE_STRING = ipmiutil 3.0.2
+PACKAGE_STRING = ipmiutil 3.0.3
PACKAGE_TARNAME = ipmiutil
-PACKAGE_VERSION = 3.0.2
+PACKAGE_VERSION = 3.0.3
PATH_SEPARATOR = :
PKG_DIR = /root/rpmbuild
RANLIB = ranlib
@@ -127,11 +127,11 @@ SHR_LINK = libipmiutil.so.1
STRIP = strip
SUBDIR_S = doc scripts lib util
SYSTEMD_DIR = /usr/share/ipmiutil
-VERSION = 3.0.2
-abs_builddir = /usr/dev/ipmiutil-3.0.2/scripts
-abs_srcdir = /usr/dev/ipmiutil-3.0.2/scripts
-abs_top_builddir = /usr/dev/ipmiutil-3.0.2
-abs_top_srcdir = /usr/dev/ipmiutil-3.0.2
+VERSION = 3.0.3
+abs_builddir = /usr/dev/ipmiutil-3.0.3/scripts
+abs_srcdir = /usr/dev/ipmiutil-3.0.3/scripts
+abs_top_builddir = /usr/dev/ipmiutil-3.0.3
+abs_top_srcdir = /usr/dev/ipmiutil-3.0.3
ac_ct_CC = gcc
ac_ct_DUMPBIN =
am__include = include
@@ -159,7 +159,7 @@ host_vendor = redhat
htmldir = ${docdir}
includedir = ${prefix}/include
infodir = ${datarootdir}/info
-install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.2/install-sh
+install_sh = ${SHELL} /usr/dev/ipmiutil-3.0.3/install-sh
libdir = ${exec_prefix}/lib
libexecdir = ${exec_prefix}/libexec
localedir = ${datarootdir}/locale
@@ -197,7 +197,7 @@ varto = ${DESTDIR}/var/lib/ipmiutil
initto = ${DESTDIR}/etc//rc.d/init.d
sysdto = ${DESTDIR}/usr/share/ipmiutil
sysvinit = ${datato}
-sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm
+sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm iuser
all: all-am
.SUFFIXES:
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index b693a58..0c7779b 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -19,7 +19,7 @@ varto = ${DESTDIR}/var/lib/ipmiutil
initto = ${DESTDIR}@INIT_DIR@
sysdto = ${DESTDIR}@SYSTEMD_DIR@
sysvinit = ${datato}
-sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm
+sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm iuser
all:
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
index 6fe9fe9..9e05d9e 100644
--- a/scripts/Makefile.in
+++ b/scripts/Makefile.in
@@ -197,7 +197,7 @@ varto = ${DESTDIR}/var/lib/ipmiutil
initto = ${DESTDIR}@INIT_DIR@
sysdto = ${DESTDIR}@SYSTEMD_DIR@
sysvinit = ${datato}
-sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm
+sbinfls = ialarms ihealth ifru igetevent ireset icmd isol ilan isensor isel iserial iwdt iconfig ipicmg ifirewall ifwum ihpm iuser
all: all-am
.SUFFIXES:
diff --git a/scripts/iuser b/scripts/iuser
new file mode 100755
index 0000000..f86644f
--- /dev/null
+++ b/scripts/iuser
@@ -0,0 +1,2 @@
+#!/bin/sh
+ipmiutil user $*
diff --git a/setver b/setver
index feb5459..5b69562 100755
--- a/setver
+++ b/setver
@@ -200,7 +200,7 @@ fi
cmdc="ialarms.c icmd.c iconfig.c ievents.c ifru.c igetevent.c ihealth.c
ilan.c ireset.c isel.c isensor.c iserial.c isol.c iwdt.c
ifruset.c oem_sun.c ipicmg.c ifirewall.c oem_dell.c itsol.c
- idcmi.c iseltime.c oem_supermicro.c
+ idcmi.c iseltime.c iuser.c oem_supermicro.c
ifwum.c ihpm.c iekanalyzer.c idiscover.c"
if [ $skipinc -ne 1 ]
diff --git a/util/Makefile.am b/util/Makefile.am
index 3293943..f8f0bab 100644
--- a/util/Makefile.am
+++ b/util/Makefile.am
@@ -27,7 +27,7 @@ OEMMOD = oem_kontron.c oem_fujitsu.c oem_intel.c oem_sun.c oem_supermicro.c oem_
L2OBJ = @SAM2OBJ@
AM_CPPFLAGS += -I. -I.. -DMETACOMMAND
-METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c $(OEMMOD) $(CMDMOD)
+METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c iuser.c $(OEMMOD) $(CMDMOD)
LDADD += -lpthread
# The LanDesk library is proprietary, so it is incompatible with ALLOW_GPL.
diff --git a/util/Makefile.in b/util/Makefile.in
index 30be248..08c6ba2 100644
--- a/util/Makefile.in
+++ b/util/Makefile.in
@@ -87,8 +87,8 @@ am__objects_3 = ipmiutil.$(OBJEXT) ialarms.$(OBJEXT) ihealth.$(OBJEXT) \
iserial.$(OBJEXT) iwdt.$(OBJEXT) isol.$(OBJEXT) \
idiscover.$(OBJEXT) iconfig.$(OBJEXT) ipicmg.$(OBJEXT) \
ifirewall.$(OBJEXT) ifwum.$(OBJEXT) ihpm.$(OBJEXT) \
- itsol.$(OBJEXT) idcmi.$(OBJEXT) $(am__objects_1) \
- $(am__objects_2)
+ itsol.$(OBJEXT) idcmi.$(OBJEXT) iuser.$(OBJEXT) \
+ $(am__objects_1) $(am__objects_2)
am_ipmiutil_OBJECTS = $(am__objects_3)
ipmiutil_OBJECTS = $(am_ipmiutil_OBJECTS)
ipmiutil_LDADD = $(LDADD)
@@ -297,7 +297,7 @@ CMDMOD = ipmicmd.c mem_if.c ipmidir.c imbapi.c ipmimv.c ipmild.c \
LIBOBJ = ipmicmd.o mem_if.o ipmidir.o imbapi.o ipmimv.o ipmild.o ipmibmc.o ipmilipmi.o subs.o md5.o md2.o $(tmpobj)/ipmilan.o $(tmpobj)/ipmilanplus.o @LIBSENSORS@
OEMMOD = oem_kontron.c oem_fujitsu.c oem_intel.c oem_sun.c oem_supermicro.c oem_dell.c oem_quanta.c oem_hp.c oem_newisys.c oem_lenovo.c oem_asus.c iekanalyzer.c
L2OBJ = @SAM2OBJ@
-METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c $(OEMMOD) $(CMDMOD)
+METASOURCE = ipmiutil.c ialarms.c ihealth.c ievents.c ifru.c ifru_picmg.c igetevent.c ireset.c icmd.c ilan.c isensor.c isel.c iserial.c iwdt.c isol.c idiscover.c iconfig.c ipicmg.c ifirewall.c ifwum.c ihpm.c itsol.c idcmi.c iuser.c $(OEMMOD) $(CMDMOD)
LANPLUS_OBJ = $(shell ar t @LANPLUS_LIB@ 2>/dev/null)
DEV_LIB = libipmiutil.a
# SHRLINK is libipmiutil.so.1 if OS supports it
@@ -476,6 +476,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iserial.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/isol.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/itsol.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iuser.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iwdt.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
diff --git a/util/ialarms.c b/util/ialarms.c
index 3fa821b..3b73885 100644
--- a/util/ialarms.c
+++ b/util/ialarms.c
@@ -75,7 +75,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "ialarms";
static char fdebug = 0;
static char fbmctam = 0;
diff --git a/util/icmd.c b/util/icmd.c
index d2f7508..2f62b00 100644
--- a/util/icmd.c
+++ b/util/icmd.c
@@ -78,7 +78,7 @@ extern void ipmi_lan_set_timeout(int ipmito, int tries, int pingto);
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "icmd";
static char fdebug = 0;
static char fquiet = 0;
diff --git a/util/iconfig.c b/util/iconfig.c
index dd43225..d29dd8f 100644
--- a/util/iconfig.c
+++ b/util/iconfig.c
@@ -172,7 +172,7 @@ typedef struct
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "iconfig";
static char fdebug = 0;
static char fipmilan = 0;
diff --git a/util/idcmi.c b/util/idcmi.c
index fcadbac..9382aa7 100644
--- a/util/idcmi.c
+++ b/util/idcmi.c
@@ -62,7 +62,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "idcmi.h"
static char * progname = "idcmi";
-static char * progver = "3.02";
+static char * progver = "3.03";
extern char fdebug; /*from ipmicmd.c*/
static uchar g_bus = PUBLIC_BUS;
static uchar g_sa = BMC_SA;
diff --git a/util/ievents.c b/util/ievents.c
index 284343b..dc49508 100644
--- a/util/ievents.c
+++ b/util/ievents.c
@@ -76,7 +76,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SELprintf printf
#define SMS_SA 0x41
#define SMI_SA 0x21
-static char *progver = "3.02";
+static char *progver = "3.03";
static char *progname = "ievents";
static char fsensdesc = 0; /* 1= get extended sensor descriptions*/
static char fcanonical = 0; /* 1= show canonical, delimited output*/
diff --git a/util/ifirewall.c b/util/ifirewall.c
index 25954e5..e3e7626 100644
--- a/util/ifirewall.c
+++ b/util/ifirewall.c
@@ -64,7 +64,7 @@
/* global variables */
static char * progname = "ifirewall";
-static char * progver = "3.02";
+static char * progver = "3.03";
static char fdebug = 0;
static uchar g_bus = PUBLIC_BUS;
static uchar g_sa = BMC_SA;
diff --git a/util/ifru.c b/util/ifru.c
index 9ddfd8b..6c3573c 100644
--- a/util/ifru.c
+++ b/util/ifru.c
@@ -116,7 +116,7 @@ extern int ipmi_kontronoem_main(void * intf, int argc, char ** argv);
#endif
static char *progname = "ifru";
-static char *progver = "3.02";
+static char *progver = "3.03";
static int vend_id = 0;
static int prod_id = 0;
static char fdebug = 0;
diff --git a/util/ifruset.c b/util/ifruset.c
index b29800d..b62d885 100644
--- a/util/ifruset.c
+++ b/util/ifruset.c
@@ -106,7 +106,7 @@ extern void fmt_time(time_t etime, char *buf, int bufsz); /*see ievents.c*/
#define IPROD_OEM 7
static char *progname = "ifruset";
-static char *progver = "3.02";
+static char *progver = "3.03";
static char fdebug = 0;
static char fpicmg = 0;
static char fonlybase = 0;
diff --git a/util/igetevent.c b/util/igetevent.c
index 49476bd..9f8a2c0 100644
--- a/util/igetevent.c
+++ b/util/igetevent.c
@@ -169,7 +169,7 @@ extern void free_sdr_cache(uchar *pret); /*see isensor.c*/
* Global variables
*/
static char * progname = "igetevent";
-static char * progver = "3.02";
+static char * progver = "3.03";
static char fdebug = 0;
static char fipmilan = 0;
static char frunonce = 0;
diff --git a/util/ihealth.c b/util/ihealth.c
index 2ff5ba8..be5c57a 100644
--- a/util/ihealth.c
+++ b/util/ihealth.c
@@ -82,7 +82,7 @@ extern int oem_supermicro_get_firmware_str(char *pstr, int sz); /*oem_supermicro
* Global variables
*/
static char * progname = "ihealth";
-static char * progver = "3.02";
+static char * progver = "3.03";
static char fdebug = 0;
static char fipmilan = 0;
static char fcanonical = 0;
@@ -732,6 +732,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec)
break;
}
do_powerstate = 0; /*HP does not support get_power_state cmd*/
+ if (!fipmilan) lan_ch_restrict = 1; /*fw bug, gets 0xcc locally*/
break;
case VENDOR_DELL: /*=0x0002A2*/
switch(prod) { /* show product names for some */
@@ -766,6 +767,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec)
case 2097: prodstr = "(X10DRL)"; /*0x0831*/
do_powerstate = 0; break;
case 2137: prodstr = "(X10DRH)"; break; /*0x0859*/
+ case 2203: prodstr = "(X11SSW-F)"; break; /*0x089b*/
case 4520: prodstr = "(H8DGU)"; break;
case 43025: prodstr = "(H8DGU-F)"; break;
case 43707: prodstr = "(X8DTH)"; break;
@@ -784,6 +786,7 @@ void show_devid_all(int dtype, uchar *devrec, int sdevrec)
case VENDOR_LENOVO2:
if (prod == 0x143) prodstr = "(x3650 M4)";
else prodstr = "";
+ do_powerstate = 0;
break;
case VENDOR_IBM: /*=0x0002*/
switch(prod) { /* show product names for some */
diff --git a/util/ilan.c b/util/ilan.c
index 6f4d448..6451ba8 100644
--- a/util/ilan.c
+++ b/util/ilan.c
@@ -88,7 +88,7 @@
* fix -L with lan_ch_parm. mods to GetBmcEthDevice
* 03/18/05 Andy Cress v1.39 fix GetBmcEthDevice for invalid MAC compares
* 06/03/05 Andy Cress v1.40 For my MAC in BMC, check user-specified, then
- check existing BMC MAC, then check OS MAC.
+ * check existing BMC MAC, then check OS MAC.
* 06/10/05 Andy Cress v1.41 Display multiple Alert Destinations,
* handle fSOL20 commands
* 07/07/05 Andy Cress v1.42 Fix GetBmcEthDevice for TIGI2U to skip GCM ch 3
@@ -127,13 +127,13 @@ Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
a.. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
+ this list of conditions and the following disclaimer.
b.. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
c.. Neither the name of Kontron nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -161,7 +161,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <stdlib.h>
#include <string.h>
#include "getopt.h"
-#else
+#else
/* Linux or similar */
#include <stdio.h>
#include <stdlib.h>
@@ -177,9 +177,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <getopt.h>
#endif
#include <string.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <net/if.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
#include <errno.h>
#endif
#ifdef LINUX
@@ -193,32 +193,32 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#elif defined(BSD)
#include <sys/sockio.h>
#define SIOCGIFHWADDR SIOCGIFMAC
-#define ifr_netmask ifr_ifru.ifru_addr
+#define ifr_netmask ifr_ifru.ifru_addr
// #define ifr_hwaddr.sa_data ifr_ifru.ifru_addr
#elif defined(MACOS)
#include <sys/sockio.h>
-#define ifr_netmask ifr_ifru.ifru_addr
+#define ifr_netmask ifr_ifru.ifru_addr
#endif
-#include "ipmicmd.h"
-#include "oem_intel.h"
-#include "oem_supermicro.h"
-
+#include "ipmicmd.h"
+#include "oem_intel.h"
+#include "oem_supermicro.h"
+
#define SELprintf printf
-#define RTF_UP 0x0001 /* route usable */
+#define RTF_UP 0x0001 /* route usable */
#define SOL_ENABLE_FLAG 0x01
#define SOL_DISABLE_FLAG 0x00
#define SOL_PRIVILEGE_LEVEL_USER 0x02
#define SOL_PRIVILEGE_LEVEL_OPERATOR 0x03
#define SOL_PRIVILEGE_LEVEL_ADMIN 0x04
-#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k*/
+#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k */
/* For IPMI 1.5, use Intel SOL commands & subfunctions */
#define SOL_ENABLE_PARAM 0x01
#define SOL_AUTHENTICATION_PARAM 0x02
#define SOL_ACC_INTERVAL_PARAM 0x03
#define SOL_RETRY_PARAM 0x04
-#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile*/
-#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile*/
+#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile */
+#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile */
/* For IPMI 2.0, use IPMI SOL commands & subfunctions */
#define SOL_ENABLE_PARAM2 0x08
#define SOL_AUTHENTICATION_PARAM2 0x09
@@ -230,12 +230,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define GET_PAYLOAD_SUPPORT 0x4E
/* Channel Access values */
-#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled*/
-#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */
-#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail*/
+#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled */
+#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */
+#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail */
/* special channel access values for ia64 */
-#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */
-#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */
+#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */
+#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */
#define OS_LINUX 1
#define OS_WINDOWS 2
#define OS_SOLARIS 3
@@ -245,19 +245,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/* TSRLT2 Channels: 0=IPMB, 1=Serial/EMP, 6=LAN2, 7=LAN1 */
/* S5000 Channels: 0=IPMB, 1=LAN1, 2=LAN2, 3=RMM2, 4=Serial, 6=pci, 7=sys */
/* For TIGPT1U/mBMC: 1=LAN channel, no serial */
-#define LAN_CH 1
+#define LAN_CH 1
#define SER_CH 4
-#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan*/
-#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice()*/
-#define MAC_LEN 6 /*length of MAC Address*/
-#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h*/
+#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan */
+#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice() */
+#define MAC_LEN 6 /*length of MAC Address */
+#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h */
/* Note: The optional IPMI 2.0 20-byte passwords are not supported here,
* due to back-compatibility issues. */
/* IP address source values */
#define SRC_STATIC 0x01
-#define SRC_DHCP 0x02 /* BMC running DHCP */
-#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */
+#define SRC_DHCP 0x02 /* BMC running DHCP */
+#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */
#define SRC_OTHER 0x04
/* PEF event severities */
@@ -268,206 +268,209 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define PEF_SEV_WARN 0x08
#define PEF_SEV_CRIT 0x10
#define PEF_SEV_NORECOV 0x20
-#define FLAG_INIT 99 /*initial value of char flag, beyond scope*/
+#define FLAG_INIT 99 /*initial value of char flag, beyond scope */
#define PARM_INIT 0xff
typedef struct
-{ /* See IPMI Table 15-2 */
- uchar rec_id;
- uchar fconfig;
- uchar action;
- uchar policy;
- uchar severity;
- uchar genid1;
- uchar genid2;
- uchar sensor_type;
- uchar sensor_no;
- uchar event_trigger;
- uchar data1;
- uchar mask1;
- uchar res[9];
-} PEF_RECORD;
+{ /* See IPMI Table 15-2 */
+ uchar rec_id;
+ uchar fconfig;
+ uchar action;
+ uchar policy;
+ uchar severity;
+ uchar genid1;
+ uchar genid2;
+ uchar sensor_type;
+ uchar sensor_no;
+ uchar event_trigger;
+ uchar data1;
+ uchar mask1;
+ uchar res[9];
+} PEF_RECORD;
typedef struct
-{ /* See IPMI Table 19-3 */
- uchar data[36];
-} LAN_RECORD; /*LanRecord*/
+{ /* See IPMI Table 19-3 */
+ uchar data[36];
+} LAN_RECORD; /*LanRecord */
#ifdef METACOMMAND
-extern int get_lan_stats(uchar chan); /*see bmchealth.c */
-extern char *get_sensor_type_desc(uchar stype); /*from ievents.c*/
+extern int get_lan_stats (uchar chan); /*see bmchealth.c */
+extern char *get_sensor_type_desc (uchar stype); /*from ievents.c */
#endif
#define MYIP 0x01
#define GWYIP 0x02
#define DESTIP 0x04
-#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */
+#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */
/*
* Global variables
*/
-static char * progver = "3.02";
-static char * progname = "ilan";
-static char fdebug = 0;
-static char fipmilan = 0;
-static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */
-static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */
-static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */
-static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */
-static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */
-static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value*/
-static char freadonly = 1; /* =1 to only read LAN & PEF parameters */
-static char fcanonical = 0; /* =1 to show only canonical output */
-static char flansecure = 0; /* =1 set lan security: no null, cipher0 off*/
-static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output*/
-static char ftestonly = 0;
-static char fprivset = 0;
-static char flanstats = 0; /* =1 to show the IPMI LAN statistics */
-static char foptmsg = 0; /* =1 to show the option warning msg */
-static char fshowchan = 0; /* =1 to show the IPMI channels */
-static char nopts = 0; /* number of pefconfig options specified*/
-static int nerrs = 0; /* number of errors during processing */
-static int ngood = 0; /* number of good results */
-static int lasterr = 0; /* value of the last error */
-static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */
-static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */
-static char fdisable = 0;
-static char fenable = 0; /* =1 to config BMC LAN and PEF */
-static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified*/
-static char fdisableSOL = 0;
-static char fgetser = 0;
-static char fsetifn = 0; /* =1 if user specified ifname[] with -i */
-static char fethfound = 0; /* =1 if FindEthNum successful */
-static char fset_ip = 0; /* !=0 if options used to specify an IP addr*/
-static char fpassword = 0; /* =1 user-specified a password, so set it. */
-static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */
-static uchar fiBMC = 0; /* =1 Intel iBMC */
-static uchar fRomley = 0; /* =1 Intel Romley BMC */
-static uchar fGrantley = 0;
-static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */
-static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */
-static char alertnum = 1; /* alert dest num (usu 1 thru 4) */
-static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */
-static char pefnum = 12; /* 11 pre-defined entries, adding 12th */
-static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */
-static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */
-static char *myuser = NULL; /* username to set, specified by -u */
-static uchar usernum = 0; /* set non-zero to specify user number */
-static uchar rgmyip[4] = {0,0,0,0};
-static uchar rggwyip[4] = {0,0,0,0};
-static uchar rggwy2ip[4] = {0,0,0,0};
-static uchar rgdestip[4] = {0,0,0,0};
-static uchar rgsubnet[4] = {0,0,0,0};
-static uchar bmcsubnet[4] = {255,255,255,0}; /* default subnet */
-static uchar ossubnet[4] = {0,0,0,0};
-static uchar osmyip[4] = {0,0,0,0};
-static uchar bmcmyip[4] = {0,0,0,0};
-static uchar bmcdestip[4] = {0,0,0,0};
-static uchar bmcdestmac[6]= {0xff,0,0,0,0,0};
-static uchar bmcgwyip[4] = {0,0,0,0};
-static uchar bmcgwymac[6]= {0xff,0,0,0,0,0};
-static uchar bmcmymac[6] = {0xff,0,0,0,0,0};
-static uchar rgmymac[6] = {0xff,0,0,0,0,0};
-static uchar osmymac[6] = {0xff,0,0,0,0,0};
-static uchar rggwymac[6] = {0xff,0,0,0,0,0};
-static uchar rggwy2mac[6] = {0xff,0,0,0,0,0};
-static uchar rgdestmac[6] = {0xff,0,0,0,0,0};
-static uchar rgdhcpmac[6] = {0xff,0,0,0,0,0};
-static int nciphers = 16;
-static int ncipher0 = 0;
-static uchar rgciphers[16] = {0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-static char rghostname[32] = {'\0'};
-static uchar custPEF[20]; /* max used = 18 bytes */
-static char rgcommunity[19] = "public"; /* default community */
-static char fsetcommunity = 0; /* =1 if user-specified community */
-static char passwordData[PSW_MAX+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */
-static uchar bAuth = 0x16; /*exclude auth=None for security*/
-static uchar lan_access = 0x04; /* usu 4=Admin, 3=Operator, 2=User */
-static uchar lan_user = 0x02; /* if -u specified, use user 2 for lan */
-static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */
-static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both*/
-static uchar fsetarp = 0; /* 1=user-specified arp_ctl */
+static char *progver = "3.03";
+static char *progname = "ilan";
+static char fdebug = 0;
+static char fipmilan = 0;
+static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */
+static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */
+static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */
+static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */
+static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */
+static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value */
+static char freadonly = 1; /* =1 to only read LAN & PEF parameters */
+static char fcanonical = 0; /* =1 to show only canonical output */
+static char flansecure = 0; /* =1 set lan security: no null, cipher0 off */
+static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output */
+static char ftestonly = 0;
+static char fprivset = 0;
+static char flanstats = 0; /* =1 to show the IPMI LAN statistics */
+static char foptmsg = 0; /* =1 to show the option warning msg */
+static char fshowchan = 0; /* =1 to show the IPMI channels */
+static char nopts = 0; /* number of pefconfig options specified */
+static int nerrs = 0; /* number of errors during processing */
+static int ngood = 0; /* number of good results */
+static int lasterr = 0; /* value of the last error */
+static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */
+static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */
+static char fdisable = 0;
+static char fenable = 0; /* =1 to config BMC LAN and PEF */
+static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified */
+static char fdisableSOL = 0;
+static char fgetser = 0;
+static char fsetifn = 0; /* =1 if user specified ifname[] with -i */
+static char fethfound = 0; /* =1 if FindEthNum successful */
+static char fset_ip = 0; /* !=0 if options used to specify an IP addr */
+static char fpassword = 0; /* =1 user-specified a password, so set it. */
+static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */
+static uchar fiBMC = 0; /* =1 Intel iBMC */
+static uchar fRomley = 0; /* =1 Intel Romley BMC */
+static uchar fGrantley = 0;
+static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */
+static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */
+static char alertnum = 1; /* alert dest num (usu 1 thru 4) */
+static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */
+static char pefnum = 12; /* 11 pre-defined entries, adding 12th */
+static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */
+static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */
+static char *myuser = NULL; /* username to set, specified by -u */
+static uchar usernum = 0; /* set non-zero to specify user number */
+static uchar rgmyip[4] = { 0, 0, 0, 0 };
+static uchar rggwyip[4] = { 0, 0, 0, 0 };
+static uchar rggwy2ip[4] = { 0, 0, 0, 0 };
+static uchar rgdestip[4] = { 0, 0, 0, 0 };
+static uchar rgsubnet[4] = { 0, 0, 0, 0 };
+static uchar bmcsubnet[4] = { 255, 255, 255, 0 }; /* default subnet */
+static uchar ossubnet[4] = { 0, 0, 0, 0 };
+static uchar osmyip[4] = { 0, 0, 0, 0 };
+static uchar bmcmyip[4] = { 0, 0, 0, 0 };
+static uchar bmcdestip[4] = { 0, 0, 0, 0 };
+static uchar bmcdestmac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar bmcgwyip[4] = { 0, 0, 0, 0 };
+static uchar bmcgwymac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar bmcmymac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar rgmymac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar osmymac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar rggwymac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar rggwy2mac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar rgdestmac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static uchar rgdhcpmac[6] = { 0xff, 0, 0, 0, 0, 0 };
+static int nciphers = 16;
+static int ncipher0 = 0;
+static uchar rgciphers[16] =
+ { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+static char rghostname[32] = { '\0' };
+static uchar custPEF[20]; /* max used = 18 bytes */
+static char rgcommunity[19] = "public"; /* default community */
+static char fsetcommunity = 0; /* =1 if user-specified community */
+static char passwordData[PSW_MAX + 1] =
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */
+static uchar bAuth = 0x16; /*exclude auth=None for security */
+static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */
+static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both */
+static uchar fsetarp = 0; /* 1=user-specified arp_ctl */
#ifdef WIN32
-static uchar ostype = OS_WINDOWS; /*windows*/
-static char ifname[64] = "Local Area Connection "; /* interface name */
-static char ifpattn[25] = "Local Area Connection ";
+static uchar ostype = OS_WINDOWS; /*windows */
+static char ifname[64] = "Local Area Connection "; /* interface name */
+static char ifpattn[25] = "Local Area Connection ";
#elif SOLARIS
/* for i86pc use "e1000g0", but for sun4u(sparc) this might be "eri0" */
-static uchar ostype = OS_SOLARIS;
+static uchar ostype = OS_SOLARIS;
#ifdef __SPARC__
-static char ifname[16] = "eri0"; /* SPARC interface name */
-static char ifname0[16] = "eri0";
-static char ifpattn[14] = "eri";
+static char ifname[16] = "eri0"; /* SPARC interface name */
+static char ifname0[16] = "eri0";
+static char ifpattn[14] = "eri";
#else
-static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */
-static char ifname0[16] = "e1000g0";
-static char ifpattn[14] = "e1000g";
+static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */
+static char ifname0[16] = "e1000g0";
+static char ifpattn[14] = "e1000g";
#endif
#elif defined(BSD)
-static uchar ostype = OS_BSD;
-static char ifname[16] = "em0"; /* interface name */
-static char ifname0[16] = "em0";
-static char ifpattn[14] = "em";
+static uchar ostype = OS_BSD;
+static char ifname[16] = "em0"; /* interface name */
+static char ifname0[16] = "em0";
+static char ifpattn[14] = "em";
#elif defined(HPUX)
-static uchar ostype = OS_HPUX;
-static char ifname[16] = "lan0"; /* interface name */
-static char ifname0[16] = "lan0";
-static char ifpattn[14] = "lan";
+static uchar ostype = OS_HPUX;
+static char ifname[16] = "lan0"; /* interface name */
+static char ifname0[16] = "lan0";
+static char ifpattn[14] = "lan";
#else
-static uchar ostype = OS_LINUX;
-static char ifname[16] = "eth0"; /* interface name */
-static char ifname0[16] = "eth0";
-static char ifpattn[14] = "eth";
+static uchar ostype = OS_LINUX;
+static char ifname[16] = "eth0"; /* interface name */
+static char ifname0[16] = "eth0";
+static char ifpattn[14] = "eth";
#endif
-static char *pspace1 = "\t"; /*used for fcanonical output*/
-static char *pspace2 = "\t\t";
-static char *pspace3 = "\t\t\t";
-static char *pspace4 = "\t\t\t\t";
-static int vend_id;
-static int prod_id;
-static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/
-static uchar ser_ch = SER_CH;
-static uchar lan_ch = LAN_CH;
-static uchar lan_ch_parm = PARM_INIT;
-static uchar gcm_ch = PARM_INIT;
-static uchar vlan_enable = PARM_INIT;
-static uchar failover_enable = PARM_INIT;
-static uchar vlan_prio = 0; /*default = 0*/
-static ushort vlan_id = 0; /*max 12 bits used*/
-static uchar max_users = 5; /* set in GetUser(1); */
-static uchar enabled_users = 0; /* set in GetUser(1); */
-static uchar show_users = 5; /* default, adjusted based on DeviceID */
-static uchar fnewbaud = 0; /* =1 if user specified baud */
-static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default*/
-static uchar sol_accum[2] = { 0x04, 0x32 };
-static uchar sol_retry[2] = { 0x06, 0x14 };
-static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */
-static uchar chan_pefon = CHAN_ACC_PEFON;
-static uchar chan_pefoff = CHAN_ACC_PEFOFF;
-static uchar SessInfo[18]; /* Session Info data */
+static char *pspace1 = "\t"; /*used for fcanonical output */
+static char *pspace2 = "\t\t";
+static char *pspace3 = "\t\t\t";
+static char *pspace4 = "\t\t\t\t";
+static int vend_id;
+static int prod_id;
+static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/
+static uchar ser_ch = SER_CH;
+static uchar gcm_ch = PARM_INIT;
+static uchar failover_enable = PARM_INIT;
+static uchar vlan_enable = PARM_INIT;
+static uchar vlan_prio = 0; /*default = 0 */
+static ushort vlan_id = 0; /*max 12 bits used */
+static uchar lan_access = 0x04; /* -v usu 4=Admin, 3=Operator, 2=User */
+static uchar lan_user = 0x02; /* -u if specified, default to user 2 */
+static uchar lan_ch_parm = PARM_INIT; /* -L to set, unused if PARM_INIT */
+static uchar lan_ch = LAN_CH; /* default=LAN_CH=1 */
+static uchar max_users = 5; /* set in GetUser(1); */
+static uchar enabled_users = 0; /* set in GetUser(1); */
+static uchar show_users = 5; /* default, adjusted based on DeviceID */
+static uchar fnewbaud = 0; /* =1 if user specified baud */
+static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default */
+static uchar sol_accum[2] = { 0x04, 0x32 };
+static uchar sol_retry[2] = { 0x06, 0x14 };
+static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */
+static uchar chan_pefon = CHAN_ACC_PEFON;
+static uchar chan_pefoff = CHAN_ACC_PEFOFF;
+static uchar SessInfo[18]; /* Session Info data */
// static uchar bparm7[3] = {0x00, 0x00, 0x00}; /*ipv4 header before*/
-static uchar iparm7[3] = {0x1E, 0x00, 0x00}; /*intel ipv4 TTL,Flags,Service*/
-static uchar oparm7[3] = {0x40, 0x40, 0x10}; /*other ipv4 TTL,Flags,Service*/
+static uchar iparm7[3] = { 0x1E, 0x00, 0x00 }; /*intel ipv4 TTL,Flags,Service */
+static uchar oparm7[3] = { 0x40, 0x40, 0x10 }; /*other ipv4 TTL,Flags,Service */
static uchar *parm7 = &oparm7[0];
#define MAX_PEFPARAMS 14 /* max pef params = 14 */
-uchar peflen[MAX_PEFPARAMS] = {0,1,1,1,1,1,21,2,1,4,17,1,3,18}; /*for ShowPef*/
-uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */
- /* sizeof(PEF_RECORD) = 21 */
-uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */
-{0x01,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x01,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Temp*/
-{0x02,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x02,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Volt*/
-{0x03,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x04,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Fan*/
-{0x04,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x05,0x05,0x03,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*Chass*/
-{0x05,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x08,0xff,0x6f,0x06,0x00,0,0,0,0,0,0,0,0,0}, /*PS*/
-{0x06,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x0c,0x08,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0}, /*ECC*/
-{0x07,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x0f,0x06,0x6f,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*FRB*/
-{0x08,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x07,0xff,0x6f,0x1c,0x00,0,0,0,0,0,0,0,0,0}, /*POST*/
-{0x09,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x13,0xff,0x6f,0x3e,0x03,0,0,0,0,0,0,0,0,0}, /*NMI*/
-{0x0a,0x80,1,1,PEF_SEV_INFO,0xff,0xff,0x23,0x03,0x6f,0x0e,0x00,0,0,0,0,0,0,0,0,0}, /*WDT*/
-{0x0b,0x80,1,1,PEF_SEV_MON,0xff,0xff,0x12,0xff,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0} };/*Restart*/
+uchar peflen[MAX_PEFPARAMS] = { 0, 1, 1, 1, 1, 1, 21, 2, 1, 4, 17, 1, 3, 18 }; /*for ShowPef */
+uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */
+ /* sizeof(PEF_RECORD) = 21 */
+uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */
+ {0x01, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x01, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Temp */
+ {0x02, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x02, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Volt */
+ {0x03, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x04, 0xff, 0x01, 0x95, 0x0a, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Fan */
+ {0x04, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x05, 0x05, 0x03, 0x01, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*Chass */
+ {0x05, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x08, 0xff, 0x6f, 0x06, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*PS*/
+ {0x06, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x0c, 0x08, 0x6f, 0x02, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*ECC*/
+ {0x07, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x0f, 0x06, 0x6f, 0x01, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*FRB*/
+ {0x08, 0x80, 1, 1, PEF_SEV_WARN, 0xff, 0xff, 0x07, 0xff, 0x6f, 0x1c, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*POST*/
+ {0x09, 0x80, 1, 1, PEF_SEV_CRIT, 0xff, 0xff, 0x13, 0xff, 0x6f, 0x3e, 0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*NMI*/
+ {0x0a, 0x80, 1, 1, PEF_SEV_INFO, 0xff, 0xff, 0x23, 0x03, 0x6f, 0x0e, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /*WDT*/
+ {0x0b, 0x80, 1, 1, PEF_SEV_MON, 0xff, 0xff, 0x12, 0xff, 0x6f, 0x02, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0} /*Restart */
+};
char **pefdesc;
-char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */
+char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */
/* 0 0x00 */ "",
/* 1 0x01 */ "Temperature Sensor",
/* 2 0x02 */ "Voltage Sensor",
@@ -498,12 +501,14 @@ char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */
/*27 */ "reserved",
/*28 */ "reserved",
/*29 */ "unused",
-/*30 */ "unused" };
+/*30 */ "unused"
+};
-char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */
+char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */
/* 0 */ "",
/* 1 0x02*/ "Voltage Sensor Assert",
-/* 2 0x23*/ "Watchdog FRB Timeout", /* was "Proc FRB Thermal", */
+ /* 2 0x23*/ "Watchdog FRB Timeout",
+ /* was "Proc FRB Thermal", */
/* 3 0x02*/ "Voltage Sensor Deassert",
/* 4 0x07*/ "Proc1 IERR",
/* 5 0xff*/ "Digital Sensor OK",
@@ -531,1143 +536,1308 @@ char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */
/*27 0x0f*/ "POST Code Error",
/*28 0x02*/ "Voltage Failure",
/*29 0x04*/ "Fan Failure",
-/*30 0x01*/ "Temperature Failure"};
+/*30 0x01*/ "Temperature Failure"
+};
#define NLAN 39
-char canon_param[NLAN] = { 0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,0,1,
- 0,0,0,0,0,0,1,1,1,1};
+char canon_param[NLAN] = { 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 };
struct {
int cmd;
int sz;
char desc[28];
-} lanparams[NLAN] = { /* see IPMI Table 19-4 */
- /* 0 */ { 0, 1, "Set in progress"},
- /* 1 */ { 1, 1, "Auth type support"},
- /* 2 */ { 2, 5, "Auth type enables"},
- /* 3 */ { 3, 4, "IP address"},
- /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */
- /* 5 */ { 5, 6, "MAC addr"},
- /* 6 */ { 6, 4, "Subnet mask"},
- /* 7 */ { 7, 3, "IPv4 header"},
- /* 8 */ { 8, 2, "Prim RMCP port"},
- /* 9 */ { 9, 2, "Sec RMCP port"},
- /* 10 */ {10, 1, "BMC grat ARP"},
- /* 11 */ {11, 1, "grat ARP interval"},
- /* 12 */ {12, 4, "Def gateway IP"},
- /* 13 */ {13, 6, "Def gateway MAC"},
- /* 14 */ {14, 4, "Sec gateway IP"},
- /* 15 */ {15, 6, "Sec gateway MAC"},
- /* 16 */ {16,18, "Community string"},
- /* 17 */ {17, 1, "Num dest"},
- /* 18 */ {18, 5, "Dest type"},
- /* 19 */ {19, 13, "Dest address"},
- /* 20 */ {20, 2, "VLAN ID"},
- /* 21 */ {21, 1, "VLAN Priority"},
- /* 22 */ {22, 1, "Cipher Suite Support"},
- /* 23 */ {23,17, "Cipher Suites "},
- /* 24 */ {24, 9, "Cipher Suite Priv"},
- /* 25 */ {25, 4, "VLAN Dest Tag"},
- /* 26 */ {96, 28, "OEM Alert String"},
- /* 27 */ {97, 1, "Alert Retry Algorithm"},
- /* 28 */ {98, 3, "UTC Offset"},
- /* 29 */ {102, 1, "IPv6 Enable"},
- /* 30 */ {103, 1, "IPv6 Addr Source"},
- /* 31 */ {104,16, "IPv6 Address"},
- /* 32 */ {105, 1, "IPv6 Prefix Len"},
- /* 33 */ {106,16, "IPv6 Default Gateway"},
- /* 34 */ {108,17, "IPv6 Dest address"},
- /* 35 */ {192, 4, "DHCP Server IP"},
- /* 36 */ {193, 6, "DHCP MAC Address"},
- /* 37 */ {194, 1, "DHCP Enable"},
- /* 38 */ {201, 2, "Channel Access Mode(Lan)"}
+} lanparams[NLAN] = { /* see IPMI Table 19-4 */
+ /* 0 */ { 0, 1, "Set in progress"},
+ /* 1 */ { 1, 1, "Auth type support"},
+ /* 2 */ { 2, 5, "Auth type enables"},
+ /* 3 */ { 3, 4, "IP address"},
+ /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */
+ /* 5 */ { 5, 6, "MAC addr"},
+ /* 6 */ { 6, 4, "Subnet mask"},
+ /* 7 */ { 7, 3, "IPv4 header"},
+ /* 8 */ { 8, 2, "Prim RMCP port"},
+ /* 9 */ { 9, 2, "Sec RMCP port"},
+ /* 10 */ { 10, 1, "BMC grat ARP"},
+ /* 11 */ { 11, 1, "grat ARP interval"},
+ /* 12 */ { 12, 4, "Def gateway IP"},
+ /* 13 */ { 13, 6, "Def gateway MAC"},
+ /* 14 */ { 14, 4, "Sec gateway IP"},
+ /* 15 */ { 15, 6, "Sec gateway MAC"},
+ /* 16 */ { 16, 18, "Community string"},
+ /* 17 */ { 17, 1, "Num dest"},
+ /* 18 */ { 18, 5, "Dest type"},
+ /* 19 */ { 19, 13, "Dest address"},
+ /* 20 */ { 20, 2, "VLAN ID"},
+ /* 21 */ { 21, 1, "VLAN Priority"},
+ /* 22 */ { 22, 1, "Cipher Suite Support"},
+ /* 23 */ { 23, 17, "Cipher Suites "},
+ /* 24 */ { 24, 9, "Cipher Suite Priv"},
+ /* 25 */ { 25, 4, "VLAN Dest Tag"},
+ /* 26 */ { 96, 28, "OEM Alert String"},
+ /* 27 */ { 97, 1, "Alert Retry Algorithm"},
+ /* 28 */ { 98, 3, "UTC Offset"},
+ /* 29 */ { 102, 1, "IPv6 Enable"},
+ /* 30 */ { 103, 1, "IPv6 Addr Source"},
+ /* 31 */ { 104, 16, "IPv6 Address"},
+ /* 32 */ { 105, 1, "IPv6 Prefix Len"},
+ /* 33 */ { 106, 16, "IPv6 Default Gateway"},
+ /* 34 */ { 108, 17, "IPv6 Dest address"},
+ /* 35 */ { 192, 4, "DHCP Server IP"},
+ /* 36 */ { 193, 6, "DHCP MAC Address"},
+ /* 37 */ { 194, 1, "DHCP Enable"},
+ /* 38 */ { 201, 2, "Channel Access Mode(Lan)"}
};
-#define NSER 22 /* max=32 */
+#define NSER 22 /* max=32 */
struct {
int cmd;
int sz;
char desc[28];
-} serparams[NSER] = { /* see IPMI Table 20-4 */
- /* 0 */ { 0, 1, "Set in progress"},
- /* 1 */ { 1, 1, "Auth type support"},
- /* 2 */ { 2, 5, "Auth type enables"},
- /* 3 */ { 3, 1, "Connection Mode"},
- /* 4 */ { 4, 1, "Sess Inactiv Timeout"},
- /* 5 */ { 5, 5, "Channel Callback"},
- /* 6 */ { 6, 1, "Session Termination"},
- /* 7 */ { 7, 2, "IPMI Msg Comm"},
- /* 8 */ { 8, 2, "Mux Switch"},
- /* 9 */ { 9, 2, "Modem Ring Time"},
- /* 10 */ {10,17, "Modem Init String"},
- /* 11 */ {11, 5, "Modem Escape Seq"},
- /* 12 */ {12, 8, "Modem Hangup Seq"},
- /* 13 */ {13, 8, "Modem Dial Command"},
- /* 14 */ {14, 1, "Page Blackout Interval"},
- /* 15 */ {15,18, "Community String"},
- /* 16 */ {16, 1, "Num of Alert Dest"},
- /* 17 */ {17, 5, "Destination Info"},
- /* 18 */ {18, 1, "Call Retry Interval"},
- /* 19 */ {19, 3, "Destination Comm Settings"},
- /* 20 */ {29, 2, "Terminal Mode Config"},
- /* 21 */ {201, 2,"Channel Access Mode (Ser)"}
+} serparams[NSER] = { /* see IPMI Table 20-4 */
+ /* 0 */ { 0, 1, "Set in progress"},
+ /* 1 */ { 1, 1, "Auth type support"},
+ /* 2 */ { 2, 5, "Auth type enables"},
+ /* 3 */ { 3, 1, "Connection Mode"},
+ /* 4 */ { 4, 1, "Sess Inactiv Timeout"},
+ /* 5 */ { 5, 5, "Channel Callback"},
+ /* 6 */ { 6, 1, "Session Termination"},
+ /* 7 */ { 7, 2, "IPMI Msg Comm"},
+ /* 8 */ { 8, 2, "Mux Switch"},
+ /* 9 */ { 9, 2, "Modem Ring Time"},
+ /* 10 */ { 10, 17, "Modem Init String"},
+ /* 11 */ { 11, 5, "Modem Escape Seq"},
+ /* 12 */ { 12, 8, "Modem Hangup Seq"},
+ /* 13 */ { 13, 8, "Modem Dial Command"},
+ /* 14 */ { 14, 1, "Page Blackout Interval"},
+ /* 15 */ { 15, 18, "Community String"},
+ /* 16 */ { 16, 1, "Num of Alert Dest"},
+ /* 17 */ { 17, 5, "Destination Info"},
+ /* 18 */ { 18, 1, "Call Retry Interval"},
+ /* 19 */ { 19, 3, "Destination Comm Settings"},
+ /* 20 */ { 29, 2, "Terminal Mode Config"},
+ /* 21 */ { 201, 2, "Channel Access Mode (Ser)"}
};
-static void getauthstr(uchar auth, char *s)
+static void
+getauthstr (uchar auth, char *s)
{
- if (s == NULL) return;
- s[0] = 0;
- if (auth & 0x01) strcat(s,"None ");
- if (auth & 0x02) strcat(s,"MD2 ");
- if (auth & 0x04) strcat(s,"MD5 ");
- if (auth & 0x10) strcat(s,"Pswd ");
- if (auth & 0x20) strcat(s,"OEM ");
- return;
+ if (s == NULL)
+ return;
+ s[0] = 0;
+ if (auth & 0x01)
+ strcat (s, "None ");
+ if (auth & 0x02)
+ strcat (s, "MD2 ");
+ if (auth & 0x04)
+ strcat (s, "MD5 ");
+ if (auth & 0x10)
+ strcat (s, "Pswd ");
+ if (auth & 0x20)
+ strcat (s, "OEM ");
+ return;
}
-static int GetDeviceID(LAN_RECORD *pLanRecord)
-{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar inputData[24];
- uchar completionCode;
-
- if (pLanRecord == NULL) return(-1);
-
- status = ipmi_cmd(GET_DEVICE_ID, inputData, 0, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- SELprintf("GetDeviceID: completion code=%x\n",
- completionCode);
- status = completionCode;
- } else {
- memcpy(pLanRecord,&responseData[0],responseLength);
- set_mfgid(&responseData[0],responseLength);
- return(0); // successful, done
- }
- } /* endif */
- /* if get here, error */
- return(status);
-} /*end GetDeviceID() */
+static int
+GetDeviceID (LAN_RECORD * pLanRecord)
+{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (pLanRecord == NULL)
+ return (-1);
+
+ status = ipmi_cmd (GET_DEVICE_ID, inputData, 0, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ SELprintf ("GetDeviceID: completion code=%x\n", completionCode);
+ status = completionCode;
+ }
+ else {
+ memcpy (pLanRecord, &responseData[0], responseLength);
+ set_mfgid (&responseData[0], responseLength);
+ return (0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return (status);
+} /*end GetDeviceID() */
-static int GetChanAcc(uchar chan, uchar parm, LAN_RECORD *pLanRecord)
+static int
+GetChanAcc (uchar chan, uchar parm, LAN_RECORD * pLanRecord)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar inputData[24];
- uchar completionCode;
-
- if (pLanRecord == NULL) return(-1);
- responseLength = 3;
- inputData[0] = chan;
- inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */
- responseLength = sizeof(responseData);
- status = ipmi_cmd(GET_CHANNEL_ACC, inputData, 2, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- SELprintf("GetChanAcc: completion code=%x\n",
- completionCode);
- status = completionCode;
- } else {
- // dont copy first byte (Parameter revision, usu 0x11)
- memcpy(pLanRecord,&responseData[0],responseLength);
- return(0); // successful, done
- }
- } /* endif */
- /* if get here, error */
- return(status);
-} /*GetChanAcc()*/
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (pLanRecord == NULL)
+ return (-1);
+ responseLength = 3;
+ inputData[0] = chan;
+ inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_CHANNEL_ACC, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ SELprintf ("GetChanAcc: completion code=%x\n", completionCode);
+ status = completionCode;
+ }
+ else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ memcpy (pLanRecord, &responseData[0], responseLength);
+ return (0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return (status);
+} /*GetChanAcc() */
-static int SetChanAcc(uchar chan, uchar parm, uchar val)
+static int
+SetChanAcc (uchar chan, uchar parm, uchar val)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar inputData[24];
- uchar completionCode;
-
- if (fmBMC) return(0); /* mBMC doesn't support this */
- /* parm: 0x80 = active, 0x40 = set non-vol*/
- responseLength = 1;
- inputData[0] = chan; /* channel */
- inputData[1] = (parm & 0xc0) | (val & 0x3F);
- inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */
-
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_CHANNEL_ACC, inputData, 3, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- SELprintf("SetChanAcc: completion code=%x\n",
- completionCode);
- status = completionCode;
- } else {
- return(0); // successful, done
- }
- } /* endif */
- /* if get here, error */
- return(status);
-} /*SetChanAcc()*/
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (fmBMC)
+ return (0); /* mBMC doesn't support this */
+ /* parm: 0x80 = active, 0x40 = set non-vol */
+ responseLength = 1;
+ inputData[0] = chan; /* channel */
+ inputData[1] = (parm & 0xc0) | (val & 0x3F);
+ inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */
+
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_CHANNEL_ACC, inputData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ SELprintf ("SetChanAcc: completion code=%x\n", completionCode);
+ status = completionCode;
+ }
+ else {
+ return (0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return (status);
+} /*SetChanAcc() */
int
-SetPasswd(int unum, char *uname, char *upswd)
+SetPasswd (int unum, char *uname, char *upswd, uchar chan, uchar priv)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status, i, psw_len;
- uchar completionCode;
- uchar inputData[24];
- int ret = 0;
-
- inputData[0] = (uchar)unum; /*user 1 = null user */
- responseLength = sizeof(responseData);
- status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData,
- &responseLength, &completionCode, fdebug);
- SELprintf("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n",
- responseData[0],responseData[1],responseData[2],
- status,completionCode);
- if (fdebug) {
- char aname[17];
- printf("User %d: ",unum);
- for (i = 0; i < responseLength; i++) {
- printf("%02x ",responseData[i]);
- if (responseData[i] < 0x20) aname[i] = '.';
- else aname[i] = responseData[i];
- }
- aname[16] = 0;
- printf(" %s\n",aname);
- }
-
- if (unum != 1)
- { /* user specified a lan username */
- if (fiBMC && (unum == 2)) {
- /* cannot set user 2 name */
- if (uname != NULL) {
- if (strcmp(uname,"root") != 0)
- printf("SETUSERNAME - user2 name %s must be root\n",uname);
- }
- } else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX ||
- vend_id == VENDOR_SUPERMICRO) ) {
- /* cannot set user 2 name */
- if (uname != NULL) {
- if (strcmp(uname,"ADMIN") != 0)
- printf("SETUSERNAME - user2 name %s must be ADMIN\n",uname);
- }
- } else {
- inputData[0] = (uchar)unum;
- memset(&inputData[1],0,16);
- if (uname != NULL)
- memcpy(&inputData[1],uname,strlen(uname));
- status = ipmi_cmd(SET_USER_NAME, inputData, 17, responseData,
- &responseLength, &completionCode, fdebug);
- if (completionCode == 0xCC)
- status = 0; /*setting username to previous gives 0xCC, ok*/
- else {
- SELprintf("SETUSERNAME - %x %x %x status = %x, ccode=%x\n",
- inputData[0],inputData[1],inputData[2],
- status,completionCode);
- if (status == 0) status = completionCode;
- if (status != 0) ret = status;
- }
- }
- }
-
- if ((unum != 1) && (uname == NULL)) {
- ; /* if no username, do not enable user */
- } else {
- inputData[0] = (uchar)unum;
- inputData[1] = 0x01; /*enable user*/
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2, responseData,
- &responseLength, &completionCode, fdebug);
- printf("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n",
- inputData[0],inputData[1],inputData[2],
- status,completionCode);
- if (status == 0) status = completionCode;
- if (status != 0) ret = status;
- }
-
- inputData[0] = (uchar)unum;
- inputData[1] = 0x02; /*set password*/
- psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */
- memset(&inputData[2],0,psw_len);
- if (upswd != NULL)
- strcpy((char *)&inputData[2],upswd);
- if (fdebug) {
- char apsw[PSW_MAX+1];
- char c;
- printf("Pswd %d: ",unum);
- for (i = 0; i < psw_len; i++) {
- c = inputData[i+2];
- printf("%02x ",(unsigned char)c);
- if (c < 0x20) apsw[i] = '.';
- else apsw[i] = c;
- }
- apsw[psw_len] = 0;
- printf(" %s\n",apsw);
- }
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len,
- responseData,&responseLength, &completionCode,fdebug);
- SELprintf("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
- inputData[0],inputData[1],inputData[2],
- status,completionCode);
- if (status == 0) status = completionCode;
- if (status != 0) ret = status;
-
- inputData[0] = (uchar)unum; /*user 1 = null user */
- inputData[1] = 0x03; /*test password*/
- memset(&inputData[2],0,psw_len);
- if (upswd != NULL)
- strcpy((char *)&inputData[2],upswd);
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len,
- responseData,&responseLength, &completionCode,fdebug);
- SELprintf("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
- inputData[0],inputData[1],inputData[2],
- status,completionCode);
-
- if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2*/
- if (fdebug)
- printf("skipping SETUSER_ACCESS on iBMC for user %d\n",unum);
- } else {
- inputData[0] = 0x90 | lan_ch; /* = 0x97 */
- inputData[1] = (uchar)unum; /* user num */
- inputData[2] = lan_access; /* usu admin */
- inputData[3] = 0x00; /* User Session Limit, 0=not limited*/
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData,
- &responseLength, &completionCode, fdebug);
- printf("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n",
- (uchar)inputData[0],inputData[1],inputData[2],
- status,completionCode);
- if (status == 0) status = completionCode;
- if (status != 0) ret = status;
- }
-
- return(ret);
-} /*end SetPswd()*/
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status, i, psw_len;
+ uchar completionCode;
+ uchar inputData[24];
+ int ret = 0;
+
+ inputData[0] = (uchar) unum; /*user 1 = null user */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ SELprintf ("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n",
+ responseData[0], responseData[1], responseData[2],
+ status, completionCode);
+ if (fdebug) {
+ char aname[17];
+ printf ("User %d: ", unum);
+ for (i = 0; i < responseLength; i++) {
+ printf ("%02x ", responseData[i]);
+ if (responseData[i] < 0x20)
+ aname[i] = '.';
+ else
+ aname[i] = responseData[i];
+ }
+ aname[16] = 0;
+ printf (" %s\n", aname);
+ }
+
+ if (unum != 1) { /* user specified a lan username */
+ if (fiBMC && (unum == 2)) {
+ /* cannot set user 2 name */
+ if (uname != NULL) {
+ if (strcmp (uname, "root") != 0)
+ printf ("SETUSERNAME - user2 name %s must be root\n", uname);
+ }
+ }
+ else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX ||
+ vend_id == VENDOR_SUPERMICRO)) {
+ /* cannot set user 2 name */
+ if (uname != NULL) {
+ if (strcmp (uname, "ADMIN") != 0)
+ printf ("SETUSERNAME - user2 name %s must be ADMIN\n", uname);
+ }
+ }
+ else if (uname != NULL) {
+ inputData[0] = (uchar) unum;
+ memset (&inputData[1], 0, 16);
+ memcpy (&inputData[1], uname, strlen (uname));
+ status = ipmi_cmd (SET_USER_NAME, inputData, 17, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (completionCode == 0xCC)
+ status = 0; /*setting username to previous gives 0xCC, ok */
+ else {
+ SELprintf ("SETUSERNAME - %x %x %x status = %x, ccode=%x\n",
+ inputData[0], inputData[1], inputData[2],
+ status, completionCode);
+ if (status == 0)
+ status = completionCode;
+ if (status != 0)
+ ret = status;
+ }
+ }
+ }
+
+ if ((unum != 1) && (uname == NULL)) {
+ ; /* if no username, do not enable user */
+ }
+ else {
+ inputData[0] = (uchar) unum;
+ inputData[1] = 0x01; /*enable user */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ printf ("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0], inputData[1], inputData[2], status, completionCode);
+ if (status == 0)
+ status = completionCode;
+ if (status != 0)
+ ret = status;
+ }
+
+ if (upswd != NULL) {
+ inputData[0] = (uchar) unum;
+ inputData[1] = 0x02; /*set password */
+ psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */
+ memset (&inputData[2], 0, psw_len);
+ strcpy ((char *) &inputData[2], upswd);
+ if (fdebug) {
+ char apsw[PSW_MAX + 1];
+ char c;
+ printf ("Pswd %d: ", unum);
+ for (i = 0; i < psw_len; i++) {
+ c = inputData[i + 2];
+ printf ("%02x ", (unsigned char) c);
+ if (c < 0x20)
+ apsw[i] = '.';
+ else
+ apsw[i] = c;
+ }
+ apsw[psw_len] = 0;
+ printf (" %s\n", apsw);
+ }
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2 + psw_len,
+ responseData, &responseLength, &completionCode,
+ fdebug);
+ SELprintf ("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0], inputData[1], inputData[2], status,
+ completionCode);
+ if (status == 0)
+ status = completionCode;
+ if (status != 0)
+ ret = status;
+
+ inputData[0] = (uchar) unum; /*user 1 = null user */
+ inputData[1] = 0x03; /*test password */
+ memset (&inputData[2], 0, psw_len);
+ if (upswd != NULL)
+ strcpy ((char *) &inputData[2], upswd);
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_USER_PASSWORD, inputData, 2 + psw_len,
+ responseData, &responseLength, &completionCode,
+ fdebug);
+ SELprintf ("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0], inputData[1], inputData[2], status,
+ completionCode);
+ }
+
+ if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2 */
+ if (fdebug)
+ printf ("skipping SETUSER_ACCESS on iBMC for user %d\n", unum);
+ }
+ else {
+ inputData[0] = 0x90 | chan; /* = 0x97 for chan=lan_ch=7 */
+ inputData[1] = (uchar) unum; /* user num */
+ inputData[2] = priv; /* usu priv=lan_access is admin */
+ inputData[3] = 0x00; /* User Session Limit, 0=not limited */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_USER_ACCESS, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ printf ("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n",
+ (uchar) inputData[0], inputData[1], inputData[2],
+ status, completionCode);
+ if (status == 0)
+ status = completionCode;
+ if (status != 0)
+ ret = status;
+ }
+
+ return (ret);
+} /*end SetPswd() */
-int SetUser(int unum, char *uname, char *passwd)
+int
+SetUser (int unum, char *uname, char *passwd, uchar chan)
{
- int ret = 0;
- /* if the user specified a username or password, set it. */
- if ((fpassword) || (uname != NULL)) {
- ret = SetPasswd(unum, uname,passwd); /*set username and password*/
- }
- return(ret);
-} /*end SetUser()*/
+ int ret = 0;
+ /* if the user specified a username or password, set it. */
+ if ((fpassword) || (uname != NULL)) {
+ /* set username and password */
+ ret = SetPasswd (unum, uname, passwd, chan, lan_access);
+ }
+ return (ret);
+} /*end SetUser() */
int
-DisableUser(int unum)
+DisableUser (int unum, uchar chan)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar completionCode;
- uchar inputData[24];
-
- inputData[0] = 0x80 | lan_ch; /* = 0x87, no IPMI */
- inputData[1] = (uchar)unum; /* user 1 */
- inputData[2] = 0x0F; /* No access */
- inputData[3] = 0x00; /* User Session Limit, 0=not limited*/
- responseLength = sizeof(responseData);
- status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData,
- &responseLength, &completionCode, fdebug);
- if (status == 0) status = completionCode;
- return(status);
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar inputData[24];
+
+ inputData[0] = 0x80 | chan; /* = 0x87, no IPMI */
+ inputData[1] = (uchar) unum; /* user 1 */
+ inputData[2] = 0x0F; /* No access */
+ inputData[3] = 0x00; /* User Session Limit, 0=not limited */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (SET_USER_ACCESS, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == 0)
+ status = completionCode;
+ return (status);
}
-static char *parse_priv(uchar c)
+char * parse_priv (uchar c)
{
- char *p;
- c = (c & 0x0f);
- switch(c) {
- case 1: p = "Callback"; break;
- case 2: p = "User "; break;
- case 3: p = "Operator"; break;
- case 4: p = "Admin "; break;
- case 5: p = "OEM "; break;
- case 0x0f: p = "No access"; break;
- default: p = "Reserved"; /*usually =0*/
- }
- return(p);
+ char *p;
+ c = (c & 0x0f);
+ switch (c) {
+ case 1: p = "Callback"; break;
+ case 2: p = "User "; break;
+ case 3: p = "Operator"; break;
+ case 4: p = "Admin "; break;
+ case 5: p = "OEM "; break;
+ case 0x0f: p = "No access"; break;
+ default: p = "Reserved"; /*usually =0 */
+ }
+ return (p);
}
-static void show_priv(uchar c)
+static void
+show_priv (uchar c)
{
- char *privstr;
- privstr = parse_priv(c);
- printf("%s",privstr);
+ char *privstr;
+ privstr = parse_priv (c);
+ printf ("%s", privstr);
}
-static int valid_priv(int c)
+static int
+valid_priv (int c)
{
- int rv;
- switch(c) {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 0x0f:
- rv = 1;
- break;
- default:
- rv = 0;
- break;
- }
- return rv;
+ int rv;
+ switch (c) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 0x0f:
+ rv = 1;
+ break;
+ default:
+ rv = 0;
+ break;
+ }
+ return rv;
}
-int GetUser(uchar user_num)
-{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar completionCode;
- uchar inputData[24];
-
- inputData[0] = lan_ch;
- inputData[1] = user_num; /* usually = 1 for BMC LAN */
- responseLength = sizeof(responseData);
- status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData,
- &responseLength, &completionCode, fdebug);
- if (status == 0 && completionCode == 0) {
- uchar c;
- if (user_num == 1) { /*get max_users and enabled_users*/
- max_users = responseData[0] & 0x3f;
- enabled_users = responseData[1] & 0x3f;
- if (enabled_users > show_users) show_users = enabled_users;
- if (show_users > max_users) show_users = max_users;
- if (!fcanonical)
- SELprintf("Users: showing %d of max %d users (%d enabled)\n",
- show_users,max_users,enabled_users);
- }
- if (fcanonical)
- SELprintf("Channel %d User %d Access %s%c ", lan_ch, user_num,
- pspace2,bdelim);
- else
- SELprintf("User Access(chan%d,user%d): %02x %02x %02x %02x : ",
- lan_ch, user_num, (uchar)responseData[0],
- responseData[1],responseData[2], responseData[3]);
- c = responseData[3];
- inputData[0] = user_num; /* usually = 1 for BMC LAN */
- responseLength = sizeof(responseData);
- status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData,
- &responseLength, &completionCode, fdebug);
- if (status != 0 || completionCode != 0)
- responseData[0] = 0;
- if (c & 0x10) printf("IPMI, ");
- show_priv(c);
- printf(" (%s)\n",responseData); /*show user name */
- } else
- SELprintf("Get User Access(%d,%d), status=%x, ccode=%x\n",
- lan_ch, user_num, status, completionCode);
- return(status);
-} /*end GetUser()*/
-
-static int GetSerEntry(uchar subfunc, LAN_RECORD *pLanRecord)
+/* GetUserINfo - get user configuration info for user subfunction */
+int
+GetUserInfo (uchar unum, uchar chan, uchar * enab, uchar * priv, char *uname,
+ char fdbg)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- uchar inputData[24];
- int status;
- uchar completionCode;
- uchar chan; uchar bset;
-
- if (pLanRecord == NULL)
- {
- if (fdebug)
- printf("GetSerEntry(%d): error, output buffer is NULL\n",subfunc);
- return (-1);
- }
-
- chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */
- bset = 0;
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status, rv;
+ uchar completionCode;
+ uchar inputData[24];
+ uchar upriv;
+
+ if (fdbg) fdebug = 1;
+ if (enab == NULL || priv == NULL)
+ return (-2);
+ inputData[0] = chan; /*lan_ch */
+ inputData[1] = unum; /* user number for IPMI LAN */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_USER_ACCESS, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ rv = status;
+ if (status == 0 && completionCode != 0)
+ rv = completionCode;
+ if (rv == 0) {
+ if (unum == 1) { /*get max_users and enabled_users */
+ max_users = responseData[0] & 0x3f;
+ enabled_users = responseData[1] & 0x3f;
+ }
+ upriv = responseData[3];
+ if ((responseData[1] & 0x80) != 0) *enab = 0;
+ else *enab = 1;
+ inputData[0] = unum; /* usually = 1 for BMC LAN */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != 0 || completionCode != 0)
+ responseData[0] = 0; /*empty user name */
+ responseData[PSW_MAX - 1] = 0; /*for safety */
+ *priv = upriv;
+ if (uname != NULL)
+ strcpy (uname, responseData);
+ }
+ return (rv);
+}
- inputData[0] = chan; // flags, channel 3:0 (1=EMP)
- inputData[1] = subfunc; // Param selector
- inputData[2] = bset; // Set selector
- inputData[3] = 0; // Block selector
- if (subfunc == 10) {
- inputData[2] = 0;
- inputData[3] = 1;
- }
-
- status = ipmi_cmd(GET_SER_CONFIG, inputData, 4, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- if (fdebug)
- SELprintf("GetSerEntry(%d,%d): completion code=%x\n",
- chan,subfunc,completionCode);
- } else {
- // dont copy first byte (Parameter revision, usu 0x11)
- memcpy(pLanRecord,&responseData[1],responseLength-1);
- pLanRecord->data[responseLength-1] = 0;
- //successful, done
- return(0);
- }
- }
+/* GetUser - get and show user configuration */
+int
+GetUser (uchar user_num, uchar chan)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar inputData[24];
+
+ inputData[0] = chan; /*lan_ch */
+ inputData[1] = user_num; /* usually = 1 for BMC LAN */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_USER_ACCESS, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == 0 && completionCode == 0) {
+ uchar c;
+ if (user_num == 1) { /*get max_users and enabled_users */
+ max_users = responseData[0] & 0x3f;
+ enabled_users = responseData[1] & 0x3f;
+ if (enabled_users > show_users)
+ show_users = enabled_users;
+ if (show_users > max_users)
+ show_users = max_users;
+ if (!fcanonical)
+ SELprintf ("Users: showing %d of max %d users (%d enabled)\n",
+ show_users, max_users, enabled_users);
+ }
+ if (fcanonical)
+ SELprintf ("Channel %d User %d Access %s%c ", chan, user_num,
+ pspace2, bdelim);
+ else
+ SELprintf ("User Access(chan%d,user%d): %02x %02x %02x %02x : ",
+ chan, user_num, (uchar) responseData[0],
+ responseData[1], responseData[2], responseData[3]);
+ c = responseData[3];
+ inputData[0] = user_num; /* usually = 1 for BMC LAN */
+ responseLength = sizeof (responseData);
+ status = ipmi_cmd (GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != 0 || completionCode != 0)
+ responseData[0] = 0;
+ if (c & 0x10)
+ printf ("IPMI, ");
+ show_priv (c);
+ printf (" (%s)\n", responseData); /*show user name */
+ }
+ else
+ SELprintf ("Get User Access(%d,%d), status=%x, ccode=%x\n",
+ chan, user_num, status, completionCode);
+ return (status);
+} /*end ShowUser() */
+
+static int
+GetSerEntry (uchar subfunc, LAN_RECORD * pLanRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status;
+ uchar completionCode;
+ uchar chan;
+ uchar bset;
+
+ if (pLanRecord == NULL) {
+ if (fdebug)
+ printf ("GetSerEntry(%d): error, output buffer is NULL\n", subfunc);
+ return (-1);
+ }
+
+ chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */
+ bset = 0;
+
+ inputData[0] = chan; // flags, channel 3:0 (1=EMP)
+ inputData[1] = subfunc; // Param selector
+ inputData[2] = bset; // Set selector
+ inputData[3] = 0; // Block selector
+ if (subfunc == 10) {
+ inputData[2] = 0;
+ inputData[3] = 1;
+ }
+
+ status = ipmi_cmd (GET_SER_CONFIG, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ if (fdebug)
+ SELprintf ("GetSerEntry(%d,%d): completion code=%x\n",
+ chan, subfunc, completionCode);
+ }
+ else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ memcpy (pLanRecord, &responseData[1], responseLength - 1);
+ pLanRecord->data[responseLength - 1] = 0;
+ //successful, done
+ return (0);
+ }
+ }
- // we are here because completionCode is not COMPLETION_CODE_OK
- if (fdebug)
- SELprintf("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n",
- chan,subfunc,status,completionCode);
- return -1;
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf ("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n",
+ chan, subfunc, status, completionCode);
+ return -1;
}
-static int GetLanEntry(uchar subfunc, uchar bset, LAN_RECORD *pLanRecord)
+static int
+GetLanEntry (uchar subfunc, uchar bset, LAN_RECORD * pLanRecord)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- uchar inputData[24];
- int status, n;
- uchar completionCode;
- uchar chan;
-
- if (pLanRecord == NULL)
- {
- if (fdebug)
- printf("GetLanEntry: error, output buffer is NULL\n");
- return (-1);
- }
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status, n;
+ uchar completionCode;
+ uchar chan;
+
+ if (pLanRecord == NULL) {
+ if (fdebug)
+ printf ("GetLanEntry: error, output buffer is NULL\n");
+ return (-1);
+ }
- chan = lan_ch; /* LAN 1 = 7 */
-
- inputData[0] = chan; // flags, channel 3:0 (LAN 1)
- inputData[1] = subfunc; // Param selector (3 = ip addr)
- inputData[2] = bset; // Set selector
- inputData[3] = 0; // Block selector
-
- status = ipmi_cmd(GET_LAN_CONFIG, inputData, 4, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- if (fdebug)
- SELprintf("GetLanEntry: completion code=%x\n",
- completionCode);
- status = completionCode;
- } else {
- // dont copy first byte (Parameter revision, usu 0x11)
- if (responseLength > 0) {
- n = responseLength-1;
- memcpy(pLanRecord,&responseData[1],n);
- } else n = 0;
- pLanRecord->data[n] = 0;
- //successful, done
- return(0);
- }
- }
+ chan = lan_ch; /* LAN 1 = 7 */
- // we are here because completionCode is not COMPLETION_CODE_OK
- if (fdebug)
- SELprintf("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n",
- status,completionCode);
- return status;
-} /* end GetLanEntry() */
+ inputData[0] = chan; // flags, channel 3:0 (LAN 1)
+ inputData[1] = subfunc; // Param selector (3 = ip addr)
+ inputData[2] = bset; // Set selector
+ inputData[3] = 0; // Block selector
-static int SetLanEntry(uchar subfunc, LAN_RECORD *pLanRecord, int reqlen)
-{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- uchar inputData[24];
- int status;
- uchar completionCode;
+ status = ipmi_cmd (GET_LAN_CONFIG, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
- if (pLanRecord == NULL)
- {
- if (fdebug)
- printf("SetLanEntry(%d): error, input buffer is NULL\n",subfunc);
- return (-1);
- }
- if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
- /* SUPERMICRO cannot set grat arp or grat arp interval */
- if (subfunc == 10 || subfunc == 11) return(0);
- }
-
- inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1)
- inputData[1] = subfunc; // Param selector (3 = ip addr)
- memcpy(&inputData[2],pLanRecord,reqlen);
-
- status = ipmi_cmd(SET_LAN_CONFIG, inputData, (uchar)(reqlen+2),
- responseData, &responseLength,&completionCode,fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- if (fdebug)
- SELprintf("SetLanEntry(%d): completion code=%x\n",
- subfunc,completionCode); // responseData[0]);
- return(completionCode);
- } else {
- //successful, done
- return(0);
- }
- }
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ if (fdebug)
+ SELprintf ("GetLanEntry: completion code=%x\n", completionCode);
+ status = completionCode;
+ }
+ else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ if (responseLength > 0) {
+ n = responseLength - 1;
+ memcpy (pLanRecord, &responseData[1], n);
+ }
+ else
+ n = 0;
+ pLanRecord->data[n] = 0;
+ //successful, done
+ return (0);
+ }
+ }
- // we are here because completionCode is not COMPLETION_CODE_OK
- if (fdebug)
- SELprintf("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n",
- subfunc,status,completionCode);
- return status;
-} /* end SetLanEntry() */
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf ("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n",
+ status, completionCode);
+ return status;
+} /* end GetLanEntry() */
-int GetPefEntry(uchar subfunc, ushort rec_id, PEF_RECORD *pPefRecord)
+static int
+SetLanEntry (uchar subfunc, LAN_RECORD * pLanRecord, int reqlen)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- uchar inputData[24]; /* only use 3 bytes for input */
- int status, n;
- uchar completionCode;
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status;
+ uchar completionCode;
- if (pPefRecord == NULL)
- {
- if (fdebug)
- printf("GetPefEntry(%d): error, output buffer is NULL\n",subfunc);
- return (-1);
- }
+ if (pLanRecord == NULL) {
+ if (fdebug)
+ printf ("SetLanEntry(%d): error, input buffer is NULL\n", subfunc);
+ return (-1);
+ }
+ if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
+ /* SUPERMICRO cannot set grat arp or grat arp interval */
+ if (subfunc == 10 || subfunc == 11)
+ return (0);
+ }
+
+ inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1)
+ inputData[1] = subfunc; // Param selector (3 = ip addr)
+ memcpy (&inputData[2], pLanRecord, reqlen);
+
+ status = ipmi_cmd (SET_LAN_CONFIG, inputData, (uchar) (reqlen + 2),
+ responseData, &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ if (fdebug)
+ SELprintf ("SetLanEntry(%d): completion code=%x\n", subfunc, completionCode); // responseData[0]);
+ return (completionCode);
+ }
+ else {
+ //successful, done
+ return (0);
+ }
+ }
- inputData[0] = subfunc; // Parameter = Evt Filter Table
- inputData[1] = (uchar)rec_id;
- inputData[2] = 0;
-
- status = ipmi_cmd(GET_PEF_CONFIG, inputData, 3, responseData,
- &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- if (fdebug)
- SELprintf("GetPefEntry(%d/%d): completion code=%x\n",
- subfunc,rec_id,completionCode);
- status = completionCode;
- } else {
- /* expect PEF record to be >=21 bytes */
- if (responseLength > 1) n = responseLength-1;
- else n = 0;
- if (n > 21) n = 21; /*only use 21 bytes*/
- if ((subfunc == 6) && (n < 21)) {
- if (fdebug)
- printf("GetPefEntry(%d/%d): length %d too short\n",
- subfunc,rec_id,responseLength);
- }
- // dont copy first byte (Parameter revision, usu 0x11)
- if (n == 0) memset(pPefRecord,0,21);
- else memcpy(pPefRecord,&responseData[1],n);
- //successful, done
- return(0);
- }
- }
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf ("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n",
+ subfunc, status, completionCode);
+ return status;
+} /* end SetLanEntry() */
+
+int
+GetPefEntry (uchar subfunc, ushort rec_id, PEF_RECORD * pPefRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24]; /* only use 3 bytes for input */
+ int status, n;
+ uchar completionCode;
+
+ if (pPefRecord == NULL) {
+ if (fdebug)
+ printf ("GetPefEntry(%d): error, output buffer is NULL\n", subfunc);
+ return (-1);
+ }
+
+ inputData[0] = subfunc; // Parameter = Evt Filter Table
+ inputData[1] = (uchar) rec_id;
+ inputData[2] = 0;
+
+ status = ipmi_cmd (GET_PEF_CONFIG, inputData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ if (fdebug)
+ SELprintf ("GetPefEntry(%d/%d): completion code=%x\n",
+ subfunc, rec_id, completionCode);
+ status = completionCode;
+ }
+ else {
+ /* expect PEF record to be >=21 bytes */
+ if (responseLength > 1)
+ n = responseLength - 1;
+ else
+ n = 0;
+ if (n > 21)
+ n = 21; /*only use 21 bytes */
+ if ((subfunc == 6) && (n < 21)) {
+ if (fdebug)
+ printf ("GetPefEntry(%d/%d): length %d too short\n",
+ subfunc, rec_id, responseLength);
+ }
+ // dont copy first byte (Parameter revision, usu 0x11)
+ if (n == 0)
+ memset (pPefRecord, 0, 21);
+ else
+ memcpy (pPefRecord, &responseData[1], n);
+ //successful, done
+ return (0);
+ }
+ }
- // we are here because completionCode is not COMPLETION_CODE_OK
- if (fdebug)
- SELprintf("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n",
- status, completionCode);
- return status;
-} /* end GetPefEntry() */
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf ("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n",
+ status, completionCode);
+ return status;
+} /* end GetPefEntry() */
-int SetPefEntry(PEF_RECORD *pPefRecord)
+int
+SetPefEntry (PEF_RECORD * pPefRecord)
{
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */
- int status;
- uchar completionCode;
- uchar subfunc;
-
- subfunc = 0x06; // Parameter = Evt Filter Table
-
- if (pPefRecord == NULL) {
- if (fdebug)
- printf("SetPefEntry: error, output buffer is NULL\n");
- return (-1);
- }
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ int status;
+ uchar completionCode;
+ uchar subfunc;
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
- // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00
- // memset(&inputData[0],0,requestData.dataLength);
- inputData[0] = subfunc;
- memcpy(&inputData[1],pPefRecord,sizeof(PEF_RECORD));
-
- status = ipmi_cmd(SET_PEF_CONFIG, inputData, sizeof(PEF_RECORD)+1,
- responseData, &responseLength, &completionCode, fdebug);
-
- if (status == ACCESS_OK) {
- if( completionCode ) {
- if (fdebug)
- SELprintf("SetPefEntry: completion code=%x\n",
- completionCode); // responseData[0]);
- status = completionCode;
- } else {
- //successful, done
- return(0);
- }
+ subfunc = 0x06; // Parameter = Evt Filter Table
- }
+ if (pPefRecord == NULL) {
+ if (fdebug)
+ printf ("SetPefEntry: error, output buffer is NULL\n");
+ return (-1);
+ }
+
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
+ // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00
+ // memset(&inputData[0],0,requestData.dataLength);
+ inputData[0] = subfunc;
+ memcpy (&inputData[1], pPefRecord, sizeof (PEF_RECORD));
+
+ status = ipmi_cmd (SET_PEF_CONFIG, inputData, sizeof (PEF_RECORD) + 1,
+ responseData, &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ if (fdebug)
+ SELprintf ("SetPefEntry: completion code=%x\n", completionCode); // responseData[0]);
+ status = completionCode;
+ }
+ else {
+ //successful, done
+ return (0);
+ }
- // we are here because completionCode is not COMPLETION_CODE_OK
- if (fdebug)
- SELprintf("SetPefEntry: ipmi_cmd status=%d completion code=%x\n",
- status,completionCode);
- return(status);
-
-} /* end SetPefEntry() */
+ }
-int DisablePef(int anum)
-{
- uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
- uchar rData[MAX_BUFFER_SIZE];
- int rLength = MAX_BUFFER_SIZE;
- uchar cc;
- int status;
-
- if (fmBMC) {
- SELprintf("mini-BMC does not support disabling BMC LAN\n");
- return(-1);
- } else {
- status = SetChanAcc(lan_ch, 0x80, CHAN_ACC_DISABLE);
- if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status);
- status = SetChanAcc(lan_ch, 0x40, CHAN_ACC_DISABLE);
- SELprintf("SetChanAcc(lan), ret = %d\n",status);
- if (status != 0) return(status);
- }
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf ("SetPefEntry: ipmi_cmd status=%d completion code=%x\n",
+ status, completionCode);
+ return (status);
- iData[0] = 0x01; /* PEF Control Param */
- iData[1] = 0x00; /* PEF disable */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
- &cc, fdebug);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc);
- return(-1);
- }
+} /* end SetPefEntry() */
- if (anum != 0) {
- iData[0] = 0x09; /* PEF Alert Policy Table */
- iData[1] = (uchar)anum; /* Policy number (default 0x01) */
- iData[2] = 0x10; /* PEF LAN, policy disable */
- iData[3] = 0x00; /* LAN_CH=00, default dest=00 */
- iData[4] = 0x00; /* No alert string */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength,
- &cc, fdebug);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc);
- return(-1);
- }
- }
- return(status);
+int
+DisablePef (int anum)
+{
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status;
+
+ if (fmBMC) {
+ SELprintf ("mini-BMC does not support disabling BMC LAN\n");
+ return (-1);
+ }
+ else {
+ status = SetChanAcc (lan_ch, 0x80, CHAN_ACC_DISABLE);
+ if (fdebug)
+ SELprintf ("SetChanAcc(lan/active), ret = %d\n", status);
+ status = SetChanAcc (lan_ch, 0x40, CHAN_ACC_DISABLE);
+ SELprintf ("SetChanAcc(lan), ret = %d\n", status);
+ if (status != 0)
+ return (status);
+ }
+
+ iData[0] = 0x01; /* PEF Control Param */
+ iData[1] = 0x00; /* PEF disable */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength, &cc, fdebug);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("DisablePef[%d]: completion code=%x\n", iData[0], cc);
+ return (-1);
+ }
+
+ if (anum != 0) {
+ iData[0] = 0x09; /* PEF Alert Policy Table */
+ iData[1] = (uchar) anum; /* Policy number (default 0x01) */
+ iData[2] = 0x10; /* PEF LAN, policy disable */
+ iData[3] = 0x00; /* LAN_CH=00, default dest=00 */
+ iData[4] = 0x00; /* No alert string */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("DisablePef[%d]: completion code=%x\n", iData[0], cc);
+ return (-1);
+ }
+ }
+ return (status);
}
-int ShowPef(void)
+int
+ShowPef (void)
{
- uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
- uchar rData[MAX_BUFFER_SIZE];
- int rLength = MAX_BUFFER_SIZE;
- uchar cc;
- int status, i,j;
-
- for (j = 1; j < MAX_PEFPARAMS; j++) {
- if (j == 4 && fmBMC) {
- /* fmBMC gets cc=0x80 for param 4, so skip it. */
- continue;
- }
- iData[0] = (uchar)j; /* PEF Control Param */
- if (j == 6 || j == 7 || j == 9) iData[1] = 1;
- else iData[1] = 0x00; /* PEF Set Selector */
- if (j == 13) iData[2] = 1;
- else iData[2] = 0x00; /* PEF Block Selector */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
- &cc, fdebug);
- if (status == 0 && cc == 0) {
- SELprintf("PefParam[%d]: ",iData[0]);
- if (rLength > 0)
- for (i=0;i<peflen[j];i++) SELprintf("%02x ", rData[1+i]);
- SELprintf("\n");
- } else
- SELprintf("PefParam[%d]: GET_PEF status=%d cc=%x\n",
- iData[0],status,cc);
- }
- return(status);
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status, i, j;
+
+ for (j = 1; j < MAX_PEFPARAMS; j++) {
+ if (j == 4 && fmBMC) {
+ /* fmBMC gets cc=0x80 for param 4, so skip it. */
+ continue;
+ }
+ iData[0] = (uchar) j; /* PEF Control Param */
+ if (j == 6 || j == 7 || j == 9)
+ iData[1] = 1;
+ else
+ iData[1] = 0x00; /* PEF Set Selector */
+ if (j == 13)
+ iData[2] = 1;
+ else
+ iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (status == 0 && cc == 0) {
+ SELprintf ("PefParam[%d]: ", iData[0]);
+ if (rLength > 0)
+ for (i = 0; i < peflen[j]; i++)
+ SELprintf ("%02x ", rData[1 + i]);
+ SELprintf ("\n");
+ }
+ else
+ SELprintf ("PefParam[%d]: GET_PEF status=%d cc=%x\n",
+ iData[0], status, cc);
+ }
+ return (status);
}
-int EnablePef(int anum)
+int
+EnablePef (int anum)
{
- uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
- uchar rData[MAX_BUFFER_SIZE];
- int rLength = MAX_BUFFER_SIZE;
- uchar cc;
- int status;
- uchar sdelay;
-
- status = SetChanAcc(lan_ch, 0x80, chan_pefon);
- if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status);
- status = SetChanAcc(lan_ch, 0x40, chan_pefon);
- SELprintf("SetChanAcc(lan), ret = %d\n",status);
- if (status != 0) return(status);
-
- {
- iData[0] = 0x01; /* PEF Control Param */
- iData[1] = 0x00; /* PEF Set Selector */
- iData[2] = 0x00; /* PEF Block Selector */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
- &cc, fdebug);
- if (status != 0 || cc != 0) sdelay = 0;
- else sdelay = rData[1];
- if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, control=%02x\n",
- iData[0],cc,sdelay);
- iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */
- iData[1] = 0x01; /* PEF enable, & no startup delay */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
- &cc, fdebug);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
- return(-1);
- }
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status;
+ uchar sdelay;
+
+ status = SetChanAcc (lan_ch, 0x80, chan_pefon);
+ if (fdebug)
+ SELprintf ("SetChanAcc(lan/active), ret = %d\n", status);
+ status = SetChanAcc (lan_ch, 0x40, chan_pefon);
+ SELprintf ("SetChanAcc(lan), ret = %d\n", status);
+ if (status != 0)
+ return (status);
+
+ {
+ iData[0] = 0x01; /* PEF Control Param */
+ iData[1] = 0x00; /* PEF Set Selector */
+ iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0 || cc != 0)
+ sdelay = 0;
+ else
+ sdelay = rData[1];
+ if (fdebug)
+ SELprintf ("EnablePef[%d]: get cc=%x, control=%02x\n",
+ iData[0], cc, sdelay);
+ iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */
+ iData[1] = 0x01; /* PEF enable, & no startup delay */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc);
+ return (-1);
+ }
#ifdef TEST
- iData[0] = 0x01; /* Serial Channel */
- iData[1] = 0x13; /* Dest Com settings = 19. */
- iData[2] = 0x01; /* POL Default Dest */
- iData[3] = 0x60;
- iData[4] = 0x07;
- status = ipmi_cmd(SET_SER_CONFIG, iData, 5, rData, &rLength,
- &cc, fdebug);
+ iData[0] = 0x01; /* Serial Channel */
+ iData[1] = 0x13; /* Dest Com settings = 19. */
+ iData[2] = 0x01; /* POL Default Dest */
+ iData[3] = 0x60;
+ iData[4] = 0x07;
+ status = ipmi_cmd (SET_SER_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
#endif
- iData[0] = 0x02; /* PEF Action Param */
- iData[1] = 0x00; /* PEF Set Selector */
- iData[2] = 0x00; /* PEF Block Selector */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
- &cc, fdebug);
- if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, val=%02x\n",
- iData[0],cc,rData[1]);
- iData[0] = 0x02; /* PEF Action Param */
- if (vend_id == VENDOR_INTEL)
- iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag*/
- else
- iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
- &cc, fdebug);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
- return(-1);
- }
+ iData[0] = 0x02; /* PEF Action Param */
+ iData[1] = 0x00; /* PEF Set Selector */
+ iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug)
+ SELprintf ("EnablePef[%d]: get cc=%x, val=%02x\n",
+ iData[0], cc, rData[1]);
+ iData[0] = 0x02; /* PEF Action Param */
+ if (vend_id == VENDOR_INTEL)
+ iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag */
+ else
+ iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc);
+ return (-1);
+ }
- if ((sdelay & 0x04) != 0) { /* startup delay is supported */
- iData[0] = 0x03; /* PEF Startup Delay Param */
- iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
- &cc, fdebug);
- if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
- iData[0],iData[1],cc);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
- // return(-1);
- }
- iData[0] = 0x04; /* PEF Alert Startup Delay Param */
- iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
- &cc, fdebug);
- if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
- iData[0],iData[1],cc);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
- // return(-1);
- }
- } /*endif sdelay*/
-
- iData[0] = 0x09; /* PEF Alert Policy Table */
- iData[1] = (uchar)anum; /* Policy number (default 0x01) */
- iData[2] = 0x18; /* PEF LAN, always alert, policy enable */
- iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */
- iData[4] = 0x00; /* No alert string */
- rLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength,
- &cc, fdebug);
- if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
- iData[0],iData[1],cc);
- if (status != 0) return(status);
- if( cc ) {
- SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
- return(-1);
- }
- } /*endif IPMI 1.5 */
+ if ((sdelay & 0x04) != 0) { /* startup delay is supported */
+ iData[0] = 0x03; /* PEF Startup Delay Param */
+ iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug)
+ SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0], iData[1], cc);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc);
+ // return(-1);
+ }
+ iData[0] = 0x04; /* PEF Alert Startup Delay Param */
+ iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug)
+ SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0], iData[1], cc);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc);
+ // return(-1);
+ }
+ } /*endif sdelay */
+
+ iData[0] = 0x09; /* PEF Alert Policy Table */
+ iData[1] = (uchar) anum; /* Policy number (default 0x01) */
+ iData[2] = 0x18; /* PEF LAN, always alert, policy enable */
+ iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */
+ iData[4] = 0x00; /* No alert string */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (SET_PEF_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug)
+ SELprintf ("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0], iData[1], cc);
+ if (status != 0)
+ return (status);
+ if (cc) {
+ SELprintf ("EnablePef[%d]: completion code=%x\n", iData[0], cc);
+ return (-1);
+ }
+ } /*endif IPMI 1.5 */
- return(status);
-} /* end EnablePef */
+ return (status);
+} /* end EnablePef */
#define NBAUDS 10
-static struct {
- unsigned char val;
- char str[8];
- } mapbaud[NBAUDS] = {
- { 6, "9600" },
- { 6, "9.6K" },
- { 7, "19.2K" },
- { 7, "19200" },
- { 8, "38.4K" },
- { 8, "38400" },
- { 9, "57.6K" },
- { 9, "57600" },
- { 10, "115.2K" },
- { 10, "115200" }
- };
-
-static unsigned char Str2Baud(char * str)
+static struct
+{
+ unsigned char val;
+ char str[8];
+} mapbaud[NBAUDS] = {
+ {
+ 6, "9600"}, {
+ 6, "9.6K"}, {
+ 7, "19.2K"}, {
+ 7, "19200"}, {
+ 8, "38.4K"}, {
+ 8, "38400"}, {
+ 9, "57.6K"}, {
+ 9, "57600"}, {
+ 10, "115.2K"}, {
+ 10, "115200"}
+};
+
+static unsigned char
+Str2Baud (char *str)
{
- unsigned char baud = 0;
- int i, n, len;
- len = strlen_(str);
- for (i = 0; i < len; i++) /*toupper*/
- if (str[i] >= 'a' && str[i] <= 'z') str[i] &= 0x5F;
- for (i = 0; i < NBAUDS; i++) {
- n = strlen_(mapbaud[i].str);
- if (strncmp(str,mapbaud[i].str,n) == 0) {
- baud = mapbaud[i].val;
- break;
- }
- }
- if (i == NBAUDS || baud == 0) {
- printf("Invalid -B parameter value (%s), using 19.2K.\n",str);
- i = 1; /* default is 19.2K */
- baud = mapbaud[i].val; /* =7 */
- }
- if (fdebug) printf("new baud = %02x (%s)\n",baud,mapbaud[i].str);
- return(baud);
+ unsigned char baud = 0;
+ int i, n, len;
+ len = strlen_ (str);
+ for (i = 0; i < len; i++) /*toupper */
+ if (str[i] >= 'a' && str[i] <= 'z')
+ str[i] &= 0x5F;
+ for (i = 0; i < NBAUDS; i++) {
+ n = strlen_ (mapbaud[i].str);
+ if (strncmp (str, mapbaud[i].str, n) == 0) {
+ baud = mapbaud[i].val;
+ break;
+ }
+ }
+ if (i == NBAUDS || baud == 0) {
+ printf ("Invalid -B parameter value (%s), using 19.2K.\n", str);
+ i = 1; /* default is 19.2K */
+ baud = mapbaud[i].val; /* =7 */
+ }
+ if (fdebug)
+ printf ("new baud = %02x (%s)\n", baud, mapbaud[i].str);
+ return (baud);
}
-static char *Baud2Str(unsigned char bin)
+static char *
+Baud2Str (unsigned char bin)
{
- char *baudstr;
- unsigned char b;
- b = bin & 0x0f;
- switch(b) {
- case 6: baudstr = "9600 "; break;
- case 7: baudstr = "19.2k"; break;
- case 8: baudstr = "38.4k"; break;
- case 9: baudstr = "57.6k"; break;
- case 10: baudstr = "115.2k"; break;
- default: baudstr = "nobaud";
- }
- return(baudstr);
+ char *baudstr;
+ unsigned char b;
+ b = bin & 0x0f;
+ switch (b) {
+ case 6:
+ baudstr = "9600 ";
+ break;
+ case 7:
+ baudstr = "19.2k";
+ break;
+ case 8:
+ baudstr = "38.4k";
+ break;
+ case 9:
+ baudstr = "57.6k";
+ break;
+ case 10:
+ baudstr = "115.2k";
+ break;
+ default:
+ baudstr = "nobaud";
+ }
+ return (baudstr);
}
-static int BaudValid(unsigned char b)
+static int
+BaudValid (unsigned char b)
{
- int val = 0;
- switch(b) {
- case 6: val = 1; break;
- case 7: val = 1; break;
- case 8: val = 1; break;
- case 9: val = 1; break;
- case 10: val = 1; break;
- default: val = 0; break;
- }
- return(val);
+ int val = 0;
+ switch (b) {
+ case 6:
+ val = 1;
+ break;
+ case 7:
+ val = 1;
+ break;
+ case 8:
+ val = 1;
+ break;
+ case 9:
+ val = 1;
+ break;
+ case 10:
+ val = 1;
+ break;
+ default:
+ val = 0;
+ break;
+ }
+ return (val);
}
/*
* atomac - converts ASCII string to binary MAC address (array).
* Accepts input formatted as 11:22:33:44:55:66 or 11-22-33-44-55-66.
*/
-void atomac(uchar *array, char *instr)
+void
+atomac (uchar * array, char *instr)
{
- int i,j,n;
- char *pi;
- j = 0;
- pi = instr;
- n = strlen_(instr);
- for (i = 0; i <= n; i++) {
- if (instr[i] == ':') {
- array[j++] = htoi(pi);
- pi = &instr[i+1];
- } else if (instr[i] == '-') {
- array[j++] = htoi(pi);
- pi = &instr[i+1];
- } else if (instr[i] == 0) {
- array[j++] = htoi(pi);
- }
- if (j >= MAC_LEN) break; /*safety valve*/
- }
- if (fdebug)
- printf("atomac: %02x %02x %02x %02x %02x %02x\n",
- array[0],array[1],array[2],array[3], array[4],array[5]);
-} /*end atomac()*/
+ int i, j, n;
+ char *pi;
+ j = 0;
+ pi = instr;
+ n = strlen_ (instr);
+ for (i = 0; i <= n; i++) {
+ if (instr[i] == ':') {
+ array[j++] = htoi (pi);
+ pi = &instr[i + 1];
+ }
+ else if (instr[i] == '-') {
+ array[j++] = htoi (pi);
+ pi = &instr[i + 1];
+ }
+ else if (instr[i] == 0) {
+ array[j++] = htoi (pi);
+ }
+ if (j >= MAC_LEN)
+ break; /*safety valve */
+ }
+ if (fdebug)
+ printf ("atomac: %02x %02x %02x %02x %02x %02x\n",
+ array[0], array[1], array[2], array[3], array[4], array[5]);
+} /*end atomac() */
/* extern void atoip(uchar *array,char *instr); *from subs.c*/
-void MacSetInvalid(uchar *mac)
+void
+MacSetInvalid (uchar * mac)
{
- int i;
- if (mac == NULL) return;
- for (i = 0; i < MAC_LEN; i++) {
- if (i == 0) mac[i] = 0xFF;
- else mac[i] = 0x00;
- }
+ int i;
+ if (mac == NULL)
+ return;
+ for (i = 0; i < MAC_LEN; i++) {
+ if (i == 0)
+ mac[i] = 0xFF;
+ else
+ mac[i] = 0x00;
+ }
}
-int MacIsValid(uchar *mac)
+int
+MacIsValid (uchar * mac)
{
- int fvalid = 0;
- int i;
- /* check for initial invalid value of FF:00:... */
- if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */
- return(fvalid);
- /* check for all zeros */
- for (i = 0; i < MAC_LEN; i++)
- if (mac[i] != 0) { /* not all zeros */
- fvalid = 1;
- break;
- }
- return(fvalid);
+ int fvalid = 0;
+ int i;
+ /* check for initial invalid value of FF:00:... */
+ if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */
+ return (fvalid);
+ /* check for all zeros */
+ for (i = 0; i < MAC_LEN; i++)
+ if (mac[i] != 0) { /* not all zeros */
+ fvalid = 1;
+ break;
+ }
+ return (fvalid);
}
-int IpIsValid(uchar *ipadr)
+int
+IpIsValid (uchar * ipadr)
{
- int fvalid = 1;
- if (ipadr[0] == 0) fvalid = 0;
- return(fvalid);
+ int fvalid = 1;
+ if (ipadr[0] == 0)
+ fvalid = 0;
+ return (fvalid);
}
-int SubnetIsValid(uchar *subnet)
+int
+SubnetIsValid (uchar * subnet)
{
- int fvalid = 0;
- /* if masking off at least one bit, say valid */
- if (subnet[0] != 0) fvalid = 1;
- return(fvalid);
+ int fvalid = 0;
+ /* if masking off at least one bit, say valid */
+ if (subnet[0] != 0)
+ fvalid = 1;
+ return (fvalid);
}
-int SubnetIsSame(uchar *ip1, uchar *ip2, uchar *subnet)
+int
+SubnetIsSame (uchar * ip1, uchar * ip2, uchar * subnet)
{
- int i;
- uchar c1, c2;
- for (i = 0; i < 4; i ++) {
- c1 = ip1[i] & subnet[i];
- c2 = ip2[i] & subnet[i];
- if (c1 != c2) return 0;
- }
- return 1; /*same, return true*/
+ int i;
+ uchar c1, c2;
+ for (i = 0; i < 4; i++) {
+ c1 = ip1[i] & subnet[i];
+ c2 = ip2[i] & subnet[i];
+ if (c1 != c2)
+ return 0;
+ }
+ return 1; /*same, return true */
}
#ifdef WIN32
/*
* Obtain network adapter information (Windows).
*/
-PIP_ADAPTER_ADDRESSES GetAdapters() {
- PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
- ULONG OutBufferLength = 0;
- ULONG RetVal = 0, i;
-
- // The size of the buffer can be different
- // between consecutive API calls.
- // In most cases, i < 2 is sufficient;
- // One call to get the size and one call to get the actual parameters.
- // But if one more interface is added or addresses are added,
- // the call again fails with BUFFER_OVERFLOW.
- // So the number is picked slightly greater than 2.
- // We use i <5 in the example
- for (i = 0; i < 5; i++) {
- RetVal = GetAdaptersAddresses(
- AF_INET, 0, NULL,
- AdapterAddresses,
- &OutBufferLength);
-
- if (RetVal != ERROR_BUFFER_OVERFLOW) {
- break;
- }
-
- if (AdapterAddresses != NULL) {
- free(AdapterAddresses);
- }
-
- AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc(OutBufferLength);
- if (AdapterAddresses == NULL) {
- RetVal = GetLastError();
- break;
- }
- }
- if (RetVal == NO_ERROR) {
- // If successful, return pointer to structure
- return AdapterAddresses;
- }
- else {
- LPVOID MsgBuf;
-
- printf("Call to GetAdaptersAddresses failed.\n");
- if (FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- RetVal,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &MsgBuf,
- 0,
- NULL )) {
- printf("\tError: %s", MsgBuf);
- }
- LocalFree(MsgBuf);
- }
- return NULL;
+PIP_ADAPTER_ADDRESSES
+GetAdapters ()
+{
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ ULONG OutBufferLength = 0;
+ ULONG RetVal = 0, i;
+
+ // The size of the buffer can be different
+ // between consecutive API calls.
+ // In most cases, i < 2 is sufficient;
+ // One call to get the size and one call to get the actual parameters.
+ // But if one more interface is added or addresses are added,
+ // the call again fails with BUFFER_OVERFLOW.
+ // So the number is picked slightly greater than 2.
+ // We use i <5 in the example
+ for (i = 0; i < 5; i++) {
+ RetVal = GetAdaptersAddresses (AF_INET, 0, NULL,
+ AdapterAddresses, &OutBufferLength);
+
+ if (RetVal != ERROR_BUFFER_OVERFLOW) {
+ break;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free (AdapterAddresses);
+ }
+
+ AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc (OutBufferLength);
+ if (AdapterAddresses == NULL) {
+ RetVal = GetLastError ();
+ break;
+ }
+ }
+ if (RetVal == NO_ERROR) {
+ // If successful, return pointer to structure
+ return AdapterAddresses;
+ }
+ else {
+ LPVOID MsgBuf;
+
+ printf ("Call to GetAdaptersAddresses failed.\n");
+ if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, RetVal, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) & MsgBuf, 0, NULL)) {
+ printf ("\tError: %s", MsgBuf);
+ }
+ LocalFree (MsgBuf);
+ }
+ return NULL;
}
/*
* Set BMC MAC corresponding to current BMC IP address (Windows).
*/
-int GetLocalMACByIP() {
- PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
- PIP_ADAPTER_ADDRESSES AdapterList;
- int result = 0;
-
- struct sockaddr_in *si;
-
- AdapterAddresses = GetAdapters();
- AdapterList = AdapterAddresses;
-
- while (AdapterList) {
- PIP_ADAPTER_UNICAST_ADDRESS addr;
- addr = AdapterList->FirstUnicastAddress;
- if (addr == NULL) si = NULL;
- else si = (struct sockaddr_in*)addr->Address.lpSockaddr;
- if (si != NULL) {
- if(memcmp(&si->sin_addr.s_addr, rgmyip, 4) == 0) {
- if (!MacIsValid(rgmymac))
- memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
- memcpy(osmyip, &si->sin_addr.s_addr, 4);
- memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
- wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname));
- result = 1;
- break;
- }
- }
- AdapterList = AdapterList->Next;
- }
+int
+GetLocalMACByIP ()
+{
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
- if (AdapterAddresses != NULL) {
- free(AdapterAddresses);
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters ();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ addr = AdapterList->FirstUnicastAddress;
+ if (addr == NULL)
+ si = NULL;
+ else
+ si = (struct sockaddr_in *) addr->Address.lpSockaddr;
+ if (si != NULL) {
+ if (memcmp (&si->sin_addr.s_addr, rgmyip, 4) == 0) {
+ if (!MacIsValid (rgmymac))
+ memcpy (rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ memcpy (osmyip, &si->sin_addr.s_addr, 4);
+ memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ wcstombs (ifname, AdapterList->FriendlyName, sizeof (ifname));
+ result = 1;
+ break;
+ }
}
- return result;
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free (AdapterAddresses);
+ }
+ return result;
}
/*
@@ -1675,170 +1845,182 @@ int GetLocalMACByIP() {
* ipaddr is 4 bytes, macaddr is 6 bytes, ipname can be 64 bytes.
* (called by idiscover.c)
*/
-int GetFirstIP(uchar *ipaddr, uchar *macadr, char *ipname, char fdbg)
+int
+GetFirstIP (uchar * ipaddr, uchar * macadr, char *ipname, char fdbg)
{
- PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
- PIP_ADAPTER_ADDRESSES AdapterList;
- struct sockaddr_in *si;
- uchar *psaddr;
- int result = -1;
-
- AdapterAddresses = GetAdapters();
- AdapterList = AdapterAddresses;
-
- while (AdapterList) {
- PIP_ADAPTER_UNICAST_ADDRESS addr;
-
- addr = AdapterList->FirstUnicastAddress;
- si = (struct sockaddr_in*)addr->Address.lpSockaddr;
- psaddr = (uchar *)&si->sin_addr.s_addr;
- if ((psaddr[0] != 0) && (psaddr[0] != 169)) {
- if (fdbg) printf("found IP: s_addr=%d.%d.%d.%d\n",
- psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
- if (ipaddr != NULL)
- memcpy(ipaddr, &si->sin_addr.s_addr, 4);
- if (macadr != NULL) {
- memcpy(macadr, AdapterList->PhysicalAddress, MAC_LEN);
- if (fdbg) printf("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
- macadr[0], macadr[1], macadr[2], macadr[3],
- macadr[4], macadr[5]);
- }
- if (ipname != NULL) {
- wcstombs(ipname,AdapterList->FriendlyName, sizeof(ifname));
- if (fdbg) printf("found Adapter: %d\n",ipname);
- }
- result = 0;
- break;
- }
- AdapterList = AdapterList->Next;
- }
-
- if (AdapterAddresses != NULL) {
- free(AdapterAddresses);
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ struct sockaddr_in *si;
+ uchar *psaddr;
+ int result = -1;
+
+ AdapterAddresses = GetAdapters ();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+
+ addr = AdapterList->FirstUnicastAddress;
+ si = (struct sockaddr_in *) addr->Address.lpSockaddr;
+ psaddr = (uchar *) & si->sin_addr.s_addr;
+ if ((psaddr[0] != 0) && (psaddr[0] != 169)) {
+ if (fdbg)
+ printf ("found IP: s_addr=%d.%d.%d.%d\n",
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
+ if (ipaddr != NULL)
+ memcpy (ipaddr, &si->sin_addr.s_addr, 4);
+ if (macadr != NULL) {
+ memcpy (macadr, AdapterList->PhysicalAddress, MAC_LEN);
+ if (fdbg)
+ printf ("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ macadr[0], macadr[1], macadr[2], macadr[3],
+ macadr[4], macadr[5]);
+ }
+ if (ipname != NULL) {
+ wcstombs (ipname, AdapterList->FriendlyName, sizeof (ifname));
+ if (fdbg)
+ printf ("found Adapter: %d\n", ipname);
+ }
+ result = 0;
+ break;
}
- return result;
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free (AdapterAddresses);
+ }
+ return result;
}
/*
* Set BMC MAC corresponding to current BMC IP address (Windows).
*/
-int GetLocalIPByMAC(uchar *macadr) {
- PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
- PIP_ADAPTER_ADDRESSES AdapterList;
- int result = 0;
-
- struct sockaddr_in *si;
-
- AdapterAddresses = GetAdapters();
- AdapterList = AdapterAddresses;
-
- while (AdapterList) {
- PIP_ADAPTER_UNICAST_ADDRESS addr;
- if(memcmp(AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) {
- addr = AdapterList->FirstUnicastAddress;
-
- si = (struct sockaddr_in*)addr->Address.lpSockaddr;
- if (fdebug) {
- uchar *psaddr;
- psaddr = (uchar *)&si->sin_addr.s_addr;
- printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n",
- rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
- psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
- }
- if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/
- memcpy(rgmyip, &si->sin_addr.s_addr, 4);
- memcpy(osmyip, &si->sin_addr.s_addr, 4);
- memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
- wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname));
- result = 1;
- break;
- }
- AdapterList = AdapterList->Next;
- }
-
- if (AdapterAddresses != NULL) {
- free(AdapterAddresses);
+int
+GetLocalIPByMAC (uchar * macadr)
+{
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
+
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters ();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ if (memcmp (AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) {
+ addr = AdapterList->FirstUnicastAddress;
+
+ si = (struct sockaddr_in *) addr->Address.lpSockaddr;
+ if (fdebug) {
+ uchar *psaddr;
+ psaddr = (uchar *) & si->sin_addr.s_addr;
+ printf ("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n",
+ rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
+ }
+ if (!IpIsValid (rgmyip) && (fsharedMAC == 1)) /*not specified, shared */
+ memcpy (rgmyip, &si->sin_addr.s_addr, 4);
+ memcpy (osmyip, &si->sin_addr.s_addr, 4);
+ memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ wcstombs (ifname, AdapterList->FriendlyName, sizeof (ifname));
+ result = 1;
+ break;
}
- return result;
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free (AdapterAddresses);
+ }
+ return result;
}
+
/*
* Set MAC and IP address from given interface name (Windows).
*/
-int GetLocalDataByIface() {
- PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
- PIP_ADAPTER_ADDRESSES AdapterList;
- int result = 0;
-
- size_t origsize, newsize, convertedChars;
- wchar_t* wcstring;
- struct sockaddr_in *si;
-
- AdapterAddresses = GetAdapters();
- AdapterList = AdapterAddresses;
-
- origsize = strlen(ifname) + 1;
- newsize = origsize;
- convertedChars = 0;
- wcstring = (wchar_t*) malloc(sizeof(wchar_t) * newsize) ;
- if (wcstring == NULL) AdapterList = NULL; /*skip loop, do free*/
- else mbstowcs(wcstring, ifname, origsize );
-
- while (AdapterList) {
- PIP_ADAPTER_UNICAST_ADDRESS addr;
- if(wcsstr(AdapterList->FriendlyName, wcstring)) {
- printf("Using interface: %S\n", AdapterList->FriendlyName);
- printf("\t%S\n", AdapterList->Description);
- addr = AdapterList->FirstUnicastAddress;
-
- si = (struct sockaddr_in*)addr->Address.lpSockaddr;
- if (fdebug) {
- uchar *psaddr;
- psaddr = (uchar *)&si->sin_addr.s_addr;
- printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d "
- "fsharedMAC=%d\n",
- rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
- psaddr[0], psaddr[1], psaddr[2], psaddr[3],
- fsharedMAC);
- }
- if (!IpIsValid(rgmyip)) { /*IP not specified*/
- memcpy(rgmyip, &si->sin_addr.s_addr, 4);
- memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
- }
- memcpy(osmyip, &si->sin_addr.s_addr, 4);
- memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
- /* FriendlyName == ifname already */
- result = 1;
- break;
- }
- AdapterList = AdapterList->Next;
- }
-
- if (AdapterAddresses != NULL) {
- free(AdapterAddresses);
+int
+GetLocalDataByIface ()
+{
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
+
+ size_t origsize, newsize, convertedChars;
+ wchar_t *wcstring;
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters ();
+ AdapterList = AdapterAddresses;
+
+ origsize = strlen (ifname) + 1;
+ newsize = origsize;
+ convertedChars = 0;
+ wcstring = (wchar_t *) malloc (sizeof (wchar_t) * newsize);
+ if (wcstring == NULL)
+ AdapterList = NULL; /*skip loop, do free */
+ else
+ mbstowcs (wcstring, ifname, origsize);
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ if (wcsstr (AdapterList->FriendlyName, wcstring)) {
+ printf ("Using interface: %S\n", AdapterList->FriendlyName);
+ printf ("\t%S\n", AdapterList->Description);
+ addr = AdapterList->FirstUnicastAddress;
+
+ si = (struct sockaddr_in *) addr->Address.lpSockaddr;
+ if (fdebug) {
+ uchar *psaddr;
+ psaddr = (uchar *) & si->sin_addr.s_addr;
+ printf ("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d "
+ "fsharedMAC=%d\n",
+ rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3], fsharedMAC);
+ }
+ if (!IpIsValid (rgmyip)) { /*IP not specified */
+ memcpy (rgmyip, &si->sin_addr.s_addr, 4);
+ memcpy (rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ }
+ memcpy (osmyip, &si->sin_addr.s_addr, 4);
+ memcpy (osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ /* FriendlyName == ifname already */
+ result = 1;
+ break;
}
- return result;
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free (AdapterAddresses);
+ }
+ return result;
}
-int FindEthNum(uchar *macadrin)
+int
+FindEthNum (uchar * macadrin)
{
- int i;
- uchar macadr[MAC_LEN];
- memcpy(macadr,macadrin,MAC_LEN);
- if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
- /* Intel factory assigns them this way, so use that to compare */
- macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/
- }
- i = GetLocalIPByMAC(macadr);
- if (i == 1) fethfound = 1;
- if (fdebug) /* show the local OS eth if and MAC */
- printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
- ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3],
- osmymac[0], osmymac[1], osmymac[2], osmymac[3],
- osmymac[4], osmymac[5]);
- /* The actual Windows ethernet interface is determined
- * in Get_IPMac_Addr using ipconfig, so
- * init eth interface number as eth0 for Windows. */
- return(0);
+ int i;
+ uchar macadr[MAC_LEN];
+ memcpy (macadr, macadrin, MAC_LEN);
+ if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
+ /* Intel factory assigns them this way, so use that to compare */
+ macadr[MAC_LEN - 1] -= 2; /*OS MAC = BMC MAC - 2 */
+ }
+ i = GetLocalIPByMAC (macadr);
+ if (i == 1)
+ fethfound = 1;
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf
+ ("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], osmymac[0],
+ osmymac[1], osmymac[2], osmymac[3], osmymac[4], osmymac[5]);
+ /* The actual Windows ethernet interface is determined
+ * in Get_IPMac_Addr using ipconfig, so
+ * init eth interface number as eth0 for Windows. */
+ return (0);
}
#elif defined(HPUX)
#define INSAP 22
@@ -1864,301 +2046,329 @@ int FindEthNum(uchar *macadrin)
#define GOT_ERR 128
static u_long ctl_area[AREA_SZ];
static u_long dat_area[AREA_SZ];
-static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area};
-static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area};
-static char *dlpi_dev[] = {"/dev/dlpi", ""};
+static struct strbuf ctl = { AREA_SZ, 0, (char *) ctl_area };
+static struct strbuf dat = { AREA_SZ, 0, (char *) dat_area };
+static char *dlpi_dev[] = { "/dev/dlpi", "" };
/*=* get a message from a stream; return type of message *=*/
-static int get_msg(int fd)
+static int
+get_msg (int fd)
{
- int flags = 0;
- int res, ret;
- ctl_area[0] = 0;
- dat_area[0] = 0;
- ret = 0;
- res = getmsg(fd, &ctl, &dat, &flags);
- if(res < 0) {
- if(errno == EINTR) {
- return(GOT_INTR);
- } else {
- return(GOT_ERR);
- }
- }
- if(ctl.len > 0) {
- ret |= GOT_CTRL;
- }
- if(dat.len > 0) {
- ret |= GOT_DATA;
- }
- return(ret);
+ int flags = 0;
+ int res, ret;
+ ctl_area[0] = 0;
+ dat_area[0] = 0;
+ ret = 0;
+ res = getmsg (fd, &ctl, &dat, &flags);
+ if (res < 0) {
+ if (errno == EINTR) {
+ return (GOT_INTR);
+ }
+ else {
+ return (GOT_ERR);
+ }
+ }
+ if (ctl.len > 0) {
+ ret |= GOT_CTRL;
+ }
+ if (dat.len > 0) {
+ ret |= GOT_DATA;
+ }
+ return (ret);
}
/*=* verify that dl_primitive in ctl_area = prim *=*/
-static int check_ctrl(int prim)
+static int
+check_ctrl (int prim)
{
- dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area;
- if(err_ack->dl_primitive != prim) {
- return GOT_ERR;
- }
- return 0;
+ dl_error_ack_t *err_ack = (dl_error_ack_t *) ctl_area;
+ if (err_ack->dl_primitive != prim) {
+ return GOT_ERR;
+ }
+ return 0;
}
/*=* put a control message on a stream *=*/
-static int put_ctrl(int fd, int len, int pri)
+static int
+put_ctrl (int fd, int len, int pri)
{
- ctl.len = len;
- if(putmsg(fd, &ctl, 0, pri) < 0) {
- return GOT_ERR;
- }
- return 0;
+ ctl.len = len;
+ if (putmsg (fd, &ctl, 0, pri) < 0) {
+ return GOT_ERR;
+ }
+ return 0;
}
/*=* put a control + data message on a stream *=*/
-static int put_both(int fd, int clen, int dlen, int pri)
+static int
+put_both (int fd, int clen, int dlen, int pri)
{
- ctl.len = clen;
- dat.len = dlen;
- if(putmsg(fd, &ctl, &dat, pri) < 0) {
- return GOT_ERR;
- }
- return 0;
+ ctl.len = clen;
+ dat.len = dlen;
+ if (putmsg (fd, &ctl, &dat, pri) < 0) {
+ return GOT_ERR;
+ }
+ return 0;
}
/*=* open file descriptor and attach *=*/
-static int dl_open(const char *dev, int ppa, int *fd)
+static int
+dl_open (const char *dev, int ppa, int *fd)
{
- dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area;
- if((*fd = open(dev, O_RDWR)) == -1) {
- return GOT_ERR;
- }
- attach_req->dl_primitive = DL_ATTACH_REQ;
- attach_req->dl_ppa = ppa;
- put_ctrl(*fd, sizeof(dl_attach_req_t), 0);
- get_msg(*fd);
- return check_ctrl(DL_OK_ACK);
+ dl_attach_req_t *attach_req = (dl_attach_req_t *) ctl_area;
+ if ((*fd = open (dev, O_RDWR)) == -1) {
+ return GOT_ERR;
+ }
+ attach_req->dl_primitive = DL_ATTACH_REQ;
+ attach_req->dl_ppa = ppa;
+ put_ctrl (*fd, sizeof (dl_attach_req_t), 0);
+ get_msg (*fd);
+ return check_ctrl (DL_OK_ACK);
}
/*=* send DL_BIND_REQ *=*/
-static int dl_bind(int fd, int sap, u_char *addr)
+static int
+dl_bind (int fd, int sap, u_char * addr)
{
- dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area;
- dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area;
- bind_req->dl_primitive = DL_BIND_REQ;
- bind_req->dl_sap = sap;
- bind_req->dl_max_conind = 1;
- bind_req->dl_service_mode = DL_CLDLS;
- bind_req->dl_conn_mgmt = 0;
- bind_req->dl_xidtest_flg = 0;
- put_ctrl(fd, sizeof(dl_bind_req_t), 0);
- get_msg(fd);
- if (GOT_ERR == check_ctrl(DL_BIND_ACK)) {
- return GOT_ERR;
- }
- bcopy((u_char *)bind_ack + bind_ack->dl_addr_offset, addr,
- bind_ack->dl_addr_length);
- return 0;
+ dl_bind_req_t *bind_req = (dl_bind_req_t *) ctl_area;
+ dl_bind_ack_t *bind_ack = (dl_bind_ack_t *) ctl_area;
+ bind_req->dl_primitive = DL_BIND_REQ;
+ bind_req->dl_sap = sap;
+ bind_req->dl_max_conind = 1;
+ bind_req->dl_service_mode = DL_CLDLS;
+ bind_req->dl_conn_mgmt = 0;
+ bind_req->dl_xidtest_flg = 0;
+ put_ctrl (fd, sizeof (dl_bind_req_t), 0);
+ get_msg (fd);
+ if (GOT_ERR == check_ctrl (DL_BIND_ACK)) {
+ return GOT_ERR;
+ }
+ bcopy ((u_char *) bind_ack + bind_ack->dl_addr_offset, addr,
+ bind_ack->dl_addr_length);
+ return 0;
}
-int FindEthNum(uchar *addr)
-{ /* Need to use DLPI for HPUX */
- /*See http://cplus.kompf.de/artikel/macaddr.html */
- int fd;
- int ppa;
- u_char mac_addr[25];
- char **dev;
- int i = 0;
-
- for (dev = dlpi_dev; **dev != ''; ++dev) {
- for (ppa=0; ppa<10; ++ppa) {
- if (GOT_ERR != dl_open(*dev, ppa, &fd)) {
- if (GOT_ERR != dl_bind(fd, INSAP, mac_addr)) {
- // bcopy( mac_addr, addr, 6);
- i = ppa;
- if (memcmp(mac_addr,addr,MAC_LEN) == 0) {
- memcpy(osmymac, addr, MAC_LEN);
- return(ppa);
- }
- }
- }
- close(fd);
- }
- }
- return(i);
+int
+FindEthNum (uchar * addr)
+{ /* Need to use DLPI for HPUX */
+ /*See http://cplus.kompf.de/artikel/macaddr.html */
+ int fd;
+ int ppa;
+ u_char mac_addr[25];
+ char **dev;
+ int i = 0;
+
+ for (dev = dlpi_dev; **dev != ''; ++dev) {
+ for (ppa = 0; ppa < 10; ++ppa) {
+ if (GOT_ERR != dl_open (*dev, ppa, &fd)) {
+ if (GOT_ERR != dl_bind (fd, INSAP, mac_addr)) {
+ // bcopy( mac_addr, addr, 6);
+ i = ppa;
+ if (memcmp (mac_addr, addr, MAC_LEN) == 0) {
+ memcpy (osmymac, addr, MAC_LEN);
+ return (ppa);
+ }
+ }
+ }
+ close (fd);
+ }
+ }
+ return (i);
}
#else
-static char *get_ifreq_mac(struct ifreq *ifrq)
+static char *
+get_ifreq_mac (struct ifreq *ifrq)
{
- char *ptr;
+ char *ptr;
#ifdef SOLARIS
- ptr = (char *)&ifrq->ifr_ifru.ifru_enaddr[0];
+ ptr = (char *) &ifrq->ifr_ifru.ifru_enaddr[0];
#elif BSD
- ptr = (char *)&ifrq->ifr_ifru.ifru_addr.sa_data[0];
+ ptr = (char *) &ifrq->ifr_ifru.ifru_addr.sa_data[0];
#elif MACOS
- static uchar mactmp[MAC_LEN];
- ptr = &mactmp[0];
- MacSetInvalid(ptr);
+ static uchar mactmp[MAC_LEN];
+ ptr = &mactmp[0];
+ MacSetInvalid (ptr);
#else
- ptr = (char *)&ifrq->ifr_hwaddr.sa_data[0];
+ ptr = (char *) &ifrq->ifr_hwaddr.sa_data[0];
#endif
- return (ptr);
+ return (ptr);
}
-extern int find_ifname(char *ifname); /*see idiscover.c*/
-
-int FindEthNum(uchar *macadrin)
-{ /*only used for Linux*/
- struct ifreq ifr;
- int skfd;
- int nCurDevice;
- int devnum = -1;
- int devos = 0;
- uchar macadr[MAC_LEN];
- uchar macsav[MAC_LEN];
- uchar mactmp[MAC_LEN];
- uchar ipsav[4];
- char szDeviceName[ 16 ]; /* MAX_DEVICE_NAME_LENGTH + 1 */
- uchar fipvalid = 0;
- int n;
-
- memcpy(macadr,macadrin,MAC_LEN);
- if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
- /* Intel factory assigns them this way, so use that to compare */
- macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/
- }
+extern int find_ifname (char *ifname); /*see idiscover.c */
+
+int
+FindEthNum (uchar * macadrin)
+{ /*only used for Linux */
+ struct ifreq ifr;
+ int skfd;
+ int nCurDevice;
+ int devnum = -1;
+ int devos = 0;
+ uchar macadr[MAC_LEN];
+ uchar macsav[MAC_LEN];
+ uchar mactmp[MAC_LEN];
+ uchar ipsav[4];
+ char szDeviceName[16]; /* MAX_DEVICE_NAME_LENGTH + 1 */
+ uchar fipvalid = 0;
+ int n;
+
+ memcpy (macadr, macadrin, MAC_LEN);
+ if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
+ /* Intel factory assigns them this way, so use that to compare */
+ macadr[MAC_LEN - 1] -= 2; /*OS MAC = BMC MAC - 2 */
+ }
#ifdef DBG
- if (fdebug) {
- uchar *pb;
- pb = macadrin;
- printf("input mac:%02x:%02x:%02x:%02x:%02x:%02x "
- "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pb[0],pb[1],pb[2],pb[3],pb[4],pb[5],
- macadr[0],macadr[1],macadr[2],macadr[3],macadr[4],macadr[5]);
- }
+ if (fdebug) {
+ uchar *pb;
+ pb = macadrin;
+ printf ("input mac:%02x:%02x:%02x:%02x:%02x:%02x "
+ "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pb[0], pb[1], pb[2], pb[3], pb[4], pb[5],
+ macadr[0], macadr[1], macadr[2], macadr[3], macadr[4], macadr[5]);
+ }
#endif
-
- n = find_ifname(szDeviceName);
- if (n >= 0) {
- n = strlen_(szDeviceName);
- if (n < sizeof(ifpattn)) {
- strcpy(ifpattn,szDeviceName);
- ifpattn[n - 1] = 0; /*truncate last digit*/
- }
- if (fdebug)
- printf("found ifname %s, pattern %s\n",szDeviceName,ifpattn);
+
+ n = find_ifname (szDeviceName);
+ if (n >= 0) {
+ n = strlen_ (szDeviceName);
+ if (n < sizeof (ifpattn)) {
+ strcpy (ifpattn, szDeviceName);
+ ifpattn[n - 1] = 0; /*truncate last digit */
}
+ if (fdebug)
+ printf ("found ifname %s, pattern %s\n", szDeviceName, ifpattn);
+ }
- if ( ( skfd = socket(AF_INET, SOCK_DGRAM, 0 ) ) < 0) {
- if ( fdebug ) {
- perror("socket");
- return devnum;
- }
+ if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
+ if (fdebug) {
+ perror ("socket");
+ return devnum;
}
-
- for( nCurDevice = 0 ;
- (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1);
- nCurDevice++ )
- {
- sprintf( szDeviceName, "%s%d", ifpattn, nCurDevice ); /*eth%d*/
- memset((char *)&ifr,0,sizeof(ifr));
- strcpy(ifr.ifr_name, szDeviceName );
+ }
+
+ for (nCurDevice = 0;
+ (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1); nCurDevice++) {
+ sprintf (szDeviceName, "%s%d", ifpattn, nCurDevice); /*eth%d */
+ memset ((char *) &ifr, 0, sizeof (ifr));
+ strcpy (ifr.ifr_name, szDeviceName);
#ifdef SIOCGIFHWADDR
- if (ioctl(skfd, SIOCGIFHWADDR, &ifr) > 0) {
- if ( fdebug )
- printf("FindEthNum: Could not get MAC address for %s\n",
- szDeviceName);
- } else
+ if (ioctl (skfd, SIOCGIFHWADDR, &ifr) > 0) {
+ if (fdebug)
+ printf ("FindEthNum: Could not get MAC address for %s\n",
+ szDeviceName);
+ }
+ else
#endif
- {
- uchar *pb;
- pb = (uchar *)get_ifreq_mac(&ifr);
+ {
+ uchar *pb;
+ pb = (uchar *) get_ifreq_mac (&ifr);
#ifdef DBG
- if (fdebug) {
- printf("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n",
- szDeviceName, pb[0],pb[1],pb[2],pb[3],pb[4],pb[5]);
- }
+ if (fdebug) {
+ printf ("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ szDeviceName, pb[0], pb[1], pb[2], pb[3], pb[4], pb[5]);
+ }
#endif
- memcpy(macsav, pb, MAC_LEN);
- /* check if this device is configured for IP addr */
- memset((char *)&ifr,0,sizeof(ifr));
- strcpy(ifr.ifr_name, szDeviceName);
- ifr.ifr_addr.sa_family = AF_INET;
- if (ioctl(skfd, SIOCGIFADDR, &ifr) >= 0) {
- fipvalid = 1;
- memcpy(ipsav, &ifr.ifr_addr.sa_data[2], 4);
- } else fipvalid = 0;
- if (memcmp(macsav, macadr, MAC_LEN) == 0) { /*found match*/
- devnum = nCurDevice;
- memcpy(osmymac, macsav, MAC_LEN);
- if (fipvalid) memcpy(osmyip, ipsav, 4);
- break;
- }
- if (nCurDevice == 0) { /*set a default of eth0*/
- devos = nCurDevice;
- memcpy(osmymac,macsav, MAC_LEN);
- if (fipvalid) memcpy(osmyip, ipsav, 4);
- } else if (fipvalid) { /*check if NIC1 is eth1,2,3,...*/
- memcpy(mactmp,osmymac,MAC_LEN);
- mactmp[MAC_LEN-1] -= 1;
- if (memcmp(mactmp,macsav,MAC_LEN) == 0) {
- devos = nCurDevice;
- memcpy(osmymac, macsav, MAC_LEN);
- memcpy(osmyip, ipsav, 4);
- }
- }
- } /*end else*/
- }
- if (!fsetifn) {
- if (devnum == -1) { /*not found, use devos default*/
- devnum = devos;
- sprintf( ifname, "%s%d", ifpattn, devnum ); /*eth%d*/
- } else { /* match was found, devnum set */
- fethfound = 1;
- strcpy(ifname, szDeviceName );
+ memcpy (macsav, pb, MAC_LEN);
+ /* check if this device is configured for IP addr */
+ memset ((char *) &ifr, 0, sizeof (ifr));
+ strcpy (ifr.ifr_name, szDeviceName);
+ ifr.ifr_addr.sa_family = AF_INET;
+ if (ioctl (skfd, SIOCGIFADDR, &ifr) >= 0) {
+ fipvalid = 1;
+ memcpy (ipsav, &ifr.ifr_addr.sa_data[2], 4);
+ }
+ else
+ fipvalid = 0;
+ if (memcmp (macsav, macadr, MAC_LEN) == 0) { /*found match */
+ devnum = nCurDevice;
+ memcpy (osmymac, macsav, MAC_LEN);
+ if (fipvalid)
+ memcpy (osmyip, ipsav, 4);
+ break;
+ }
+ if (nCurDevice == 0) { /*set a default of eth0 */
+ devos = nCurDevice;
+ memcpy (osmymac, macsav, MAC_LEN);
+ if (fipvalid)
+ memcpy (osmyip, ipsav, 4);
+ }
+ else if (fipvalid) { /*check if NIC1 is eth1,2,3,... */
+ memcpy (mactmp, osmymac, MAC_LEN);
+ mactmp[MAC_LEN - 1] -= 1;
+ if (memcmp (mactmp, macsav, MAC_LEN) == 0) {
+ devos = nCurDevice;
+ memcpy (osmymac, macsav, MAC_LEN);
+ memcpy (osmyip, ipsav, 4);
+ }
}
+ } /*end else */
+ }
+ if (!fsetifn) {
+ if (devnum == -1) { /*not found, use devos default */
+ devnum = devos;
+ sprintf (ifname, "%s%d", ifpattn, devnum); /*eth%d */
}
- close(skfd);
- if (fdebug) /* show the local OS eth if and MAC */
- printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
- ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3],
- osmymac[0], osmymac[1], osmymac[2], osmymac[3],
- osmymac[4], osmymac[5]);
- return(devnum);
+ else { /* match was found, devnum set */
+ fethfound = 1;
+ strcpy (ifname, szDeviceName);
+ }
+ }
+ close (skfd);
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf
+ ("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], osmymac[0],
+ osmymac[1], osmymac[2], osmymac[3], osmymac[4], osmymac[5]);
+ return (devnum);
}
#endif
-int show_channels(void)
+int
+show_channels (void)
{
- int ret, rlen;
- uchar iData[2];
- uchar rData[10];
- uchar cc, mtype;
- int j;
- int rv = -1;
-
- for (j = 1; j < MAXCHAN; j++) {
- rlen = sizeof(rData);
- iData[0] = (uchar)j; /*channel #*/
- memset(rData,0,9); /*initialize recv data*/
- ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
- if (rv != 0) rv = ret;
- if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
- continue;
- if (ret != 0) {
- if (fdebug) printf("get_chan_info rc = %x\n",ret);
- break;
- }
- mtype = rData[1]; /* channel medium type */
- switch(mtype) {
- case 4: printf("channel[%d] type = lan\n",j); break; /*802.3 LAN type*/
- case 5: printf("channel[%d] type = serial\n",j); break;
- case 7: printf("channel[%d] type = pci_smbus\n",j); break;
- case 12: printf("channel[%d] type = system_interface\n",j); break;
- default: printf("channel[%d] type = other %d\n",j,mtype); break;
- }
- rv = 0;
- } /*end for j*/
- return(rv);
+ int ret, rlen;
+ uchar iData[2];
+ uchar rData[10];
+ uchar cc, mtype;
+ int j;
+ int rv = -1;
+
+ for (j = 1; j < MAXCHAN; j++) {
+ rlen = sizeof (rData);
+ iData[0] = (uchar) j; /*channel # */
+ memset (rData, 0, 9); /*initialize recv data */
+ ret = ipmi_cmd (GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
+ if (rv != 0)
+ rv = ret;
+ if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
+ continue;
+ if (ret != 0) {
+ if (fdebug)
+ printf ("get_chan_info rc = %x\n", ret);
+ break;
+ }
+ mtype = rData[1]; /* channel medium type */
+ switch (mtype) {
+ case 4:
+ printf ("channel[%d] type = lan\n", j);
+ break; /*802.3 LAN type */
+ case 5:
+ printf ("channel[%d] type = serial\n", j);
+ break;
+ case 7:
+ printf ("channel[%d] type = pci_smbus\n", j);
+ break;
+ case 12:
+ printf ("channel[%d] type = system_interface\n", j);
+ break;
+ default:
+ printf ("channel[%d] type = other %d\n", j, mtype);
+ break;
+ }
+ rv = 0;
+ } /*end for j */
+ return (rv);
}
/*
@@ -2170,95 +2380,118 @@ int show_channels(void)
* if no lan channels found, returns -2.
* if other error, returns -1.
*/
-int GetBmcEthDevice(uchar lan_parm)
+int
+GetBmcEthDevice (uchar lan_parm, uchar * pchan)
{
- LAN_RECORD LanRecord;
- int devnum = -1;
- int ret;
- uchar bmcMacAddress[ MAC_LEN ]; /*MAC_LEN = 6*/
- int rlen;
- uchar iData[2];
- uchar rData[10];
- uchar cc;
- int i = 0;
- int j, jstart, jend, jlan;
- uchar mtype;
- uchar *pb;
- int fchgmac;
- // int found = 0;
-
- /* Find the LAN channel(s) via Channel Info */
- if (lan_parm < MAXCHAN) { /* try user-specified channel only */
- lan_ch = lan_parm;
- jstart = lan_parm;
- jend = lan_parm+1;
- } else {
- jstart = 1;
- jend = MAXCHAN;
- }
- memset(bmcMacAddress,0xff,sizeof(bmcMacAddress)); /*initialize to invalid*/
- for (j = jstart; j < jend; j++) {
- rlen = sizeof(rData);
- iData[0] = (uchar)j; /*channel #*/
- memset(rData,0,9); /*initialize recv data*/
- ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
- if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
- continue;
- if (ret != 0) {
- if (fdebug) printf("get_chan_info rc = %x\n",ret);
- break;
- }
- mtype = rData[1]; /* channel medium type */
- if (mtype == 4) { /* 802.3 LAN type*/
- if (fdebug) printf("chan[%d] = lan\n",j);
- jlan = lan_ch; /*save prev lan chan */
- /* Get BMC MAC for this LAN channel. */
- /* Note: BMC MAC may not be valid yet. */
- lan_ch = (uchar)j; /*set lan channel for GetLanEntry*/
- ret = GetLanEntry( 5 /*MAC_ADDRESS_LAN_PARAM*/,0, &LanRecord);
- if ( ret != 0 ) {
- lan_ch = (uchar)jlan; /*restore lan_ch*/
- printf( "GetBmcEthDevice: GetLanEntry failed\n" );
- return devnum;
- } else {
- pb = &LanRecord.data[0];
- if (fdebug) printf("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n",j,
- pb[0], pb[1], pb[2], pb[3], pb[4], pb[5] );
- fchgmac = 0;
- /* use the lowest valid lan channel MAC address */
- if (!MacIsValid(bmcMacAddress)) /* old MAC not valid*/
- fchgmac = 1;
- else if (MacIsValid(pb) && /* new MAC is valid and*/
- (memcmp(bmcMacAddress,pb, sizeof(bmcMacAddress)) > 0))
- fchgmac = 1; /* new MAC lower */
- /* if no -L 3 and this is gcm, do not pick it. */
- if ((j == gcm_ch) && (lan_parm == PARM_INIT))
- fchgmac = 0;
- if (fchgmac) { /* pick this channel & MAC */
- memcpy(bmcMacAddress,pb,sizeof(bmcMacAddress));
- lan_ch = (uchar)j;
- } else lan_ch = (uchar)jlan; /*restore prev lan chan*/
- }
- i++; /* i = num lan channels found */
- } else if (mtype == 5) { /* serial type*/
- if (fdebug) printf("chan[%d] = serial\n",j);
- ser_ch = (uchar)j; /* set to last serial channel */
- } else if (mtype == 7) { /* PCI SMBus */
- if (fdebug) printf("chan[%d] = pci_smbus\n",j);
- } else if (mtype == 12) { /* system interface */
- if (fdebug) printf("chan[%d] = system_interface\n",j);
- } else /* other channel medium types, see IPMI 1.5 Table 6-3 */
- if (fdebug) printf("chan[%d] = %d\n",j,mtype);
- }
- if (i == 0) return(-2); /* no lan channels found */
- if (fdebug) printf("lan_ch detected = %d\n",lan_ch);
-
- /* This will work if the BMC MAC is shared with the OS */
- /* Otherwise, wait until we get the eth dev from the gateway below */
- devnum = FindEthNum(bmcMacAddress);
- if ( fdebug )
- printf("GetBmcEthDevice: channel %d, %s%d\n",lan_ch,ifpattn,devnum);
- return devnum;
+ LAN_RECORD LanRecord;
+ int devnum = -1;
+ int ret;
+ uchar bmcMacAddress[MAC_LEN]; /*MAC_LEN = 6 */
+ int rlen;
+ uchar iData[2];
+ uchar rData[10];
+ uchar cc;
+ int i = 0;
+ int j, jstart, jend, jlan;
+ uchar mtype;
+ uchar *pb;
+ int fchgmac;
+ // int found = 0;
+
+ /* Find the LAN channel(s) via Channel Info */
+ if (lan_parm < MAXCHAN) { /* try user-specified channel only */
+ lan_ch = lan_parm;
+ jstart = lan_parm;
+ jend = lan_parm + 1;
+ }
+ else {
+ jstart = 1;
+ jend = MAXCHAN;
+ }
+ memset (bmcMacAddress, 0xff, sizeof (bmcMacAddress)); /*initialize to invalid */
+ for (j = jstart; j < jend; j++) {
+ rlen = sizeof (rData);
+ iData[0] = (uchar) j; /*channel # */
+ memset (rData, 0, 9); /*initialize recv data */
+ ret = ipmi_cmd (GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
+ if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
+ continue;
+ if (ret != 0) {
+ if (fdebug)
+ printf ("get_chan_info rc = %x\n", ret);
+ break;
+ }
+ mtype = rData[1]; /* channel medium type */
+ if (mtype == 4) { /* 802.3 LAN type */
+ if (fdebug)
+ printf ("chan[%d] = lan\n", j);
+ jlan = lan_ch; /*save prev lan chan */
+ /* Get BMC MAC for this LAN channel. */
+ /* Note: BMC MAC may not be valid yet. */
+ lan_ch = (uchar) j; /*set lan channel for GetLanEntry */
+ ret = GetLanEntry (5 /*MAC_ADDRESS_LAN_PARAM */ , 0, &LanRecord);
+ if (ret != 0) {
+ lan_ch = (uchar) jlan; /*restore lan_ch */
+ printf ("GetBmcEthDevice: GetLanEntry failed\n");
+ return devnum;
+ }
+ else {
+ pb = &LanRecord.data[0];
+ if (fdebug)
+ printf ("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n", j,
+ pb[0], pb[1], pb[2], pb[3], pb[4], pb[5]);
+ fchgmac = 0;
+ /* use the lowest valid lan channel MAC address */
+ if (!MacIsValid (bmcMacAddress)) /* old MAC not valid */
+ fchgmac = 1;
+ else if (MacIsValid (pb) && /* new MAC is valid and */
+ (memcmp (bmcMacAddress, pb, sizeof (bmcMacAddress)) > 0))
+ fchgmac = 1; /* new MAC lower */
+ /* if no -L 3 and this is gcm, do not pick it. */
+ if ((j == gcm_ch) && (lan_parm == PARM_INIT))
+ fchgmac = 0;
+ if (fchgmac) { /* pick this channel & MAC */
+ memcpy (bmcMacAddress, pb, sizeof (bmcMacAddress));
+ lan_ch = (uchar) j;
+ }
+ else
+ lan_ch = (uchar) jlan; /*restore prev lan chan */
+ }
+ i++; /* i = num lan channels found */
+ }
+ else if (mtype == 5) { /* serial type */
+ if (fdebug)
+ printf ("chan[%d] = serial\n", j);
+ ser_ch = (uchar) j; /* set to last serial channel */
+ }
+ else if (mtype == 7) { /* PCI SMBus */
+ if (fdebug)
+ printf ("chan[%d] = pci_smbus\n", j);
+ }
+ else if (mtype == 12) { /* system interface */
+ if (fdebug)
+ printf ("chan[%d] = system_interface\n", j);
+ }
+ else if (mtype == 1) { /* IPMB */
+ if (fdebug)
+ printf ("chan[%d] = IPMB\n", j);
+ }
+ else /* other channel medium types, see IPMI 1.5 Table 6-3 */ if (fdebug)
+ printf ("chan[%d] = %d\n", j, mtype);
+ }
+ if (i == 0)
+ return (-2); /* no lan channels found */
+ if (fdebug)
+ printf ("lan_ch detected = %d\n", lan_ch);
+
+ /* This will work if the BMC MAC is shared with the OS */
+ /* Otherwise, wait until we get the eth dev from the gateway below */
+ devnum = FindEthNum (bmcMacAddress);
+ if (fdebug)
+ printf ("GetBmcEthDevice: channel %d, %s%d\n", lan_ch, ifpattn, devnum);
+ if (pchan != NULL)
+ *pchan = lan_ch;
+ return devnum;
}
/* file_grep/findmatch - No longer used here, see ievents.c */
@@ -2270,385 +2503,419 @@ int GetBmcEthDevice(uchar lan_parm)
* It uses ARP cache to do this.
*/
#if defined(WIN32)
-int Get_Mac(uchar *ipadr,uchar *macadr, char *nodname)
+int
+Get_Mac (uchar * ipadr, uchar * macadr, char *nodname)
{
- DWORD dwRetVal;
- IPAddr DestIp = 0;
- IPAddr SrcIp = 0; /* default for src ip */
- ULONG MacAddr[2]; /* for 6-byte hardware addresses */
- ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */
- BYTE *bPhysAddr;
-
- if (!IpIsValid(ipadr)) {
- if (fdebug) printf("Get_Mac: invalid IP addr\n");
- return 1; /*error*/
- }
- memcpy(&DestIp, ipadr, 4);
-
- /* invoke system ARP query */
- dwRetVal = SendARP(DestIp, SrcIp, MacAddr, &PhysAddrLen);
-
- if (dwRetVal == NO_ERROR)
- { /* no error - get the MAC */
- bPhysAddr = (BYTE *) & MacAddr;
- if (PhysAddrLen) {
- memcpy(macadr, bPhysAddr, MAC_LEN);
- } else
- printf("Warning: SendArp completed successfully, but returned length=0\n");
- } else if (dwRetVal == ERROR_GEN_FAILURE)
- { /* MAC not available in this network - get gateway MAC */
- memcpy(macadr, rggwymac, MAC_LEN);
- } else
- { /* other errors */
- printf("Error: SendArp failed with error: %d", dwRetVal);
- switch (dwRetVal) {
- case ERROR_INVALID_PARAMETER:
- printf(" (ERROR_INVALID_PARAMETER)\n");
- break;
- case ERROR_INVALID_USER_BUFFER:
- printf(" (ERROR_INVALID_USER_BUFFER)\n");
- break;
- case ERROR_BAD_NET_NAME:
- printf(" (ERROR_GEN_FAILURE)\n");
- break;
- case ERROR_BUFFER_OVERFLOW:
- printf(" (ERROR_BUFFER_OVERFLOW)\n");
- break;
- case ERROR_NOT_FOUND:
- printf(" (ERROR_NOT_FOUND)\n");
- break;
- default:
- printf("\n");
- break;
- }
- return 1;
+ DWORD dwRetVal;
+ IPAddr DestIp = 0;
+ IPAddr SrcIp = 0; /* default for src ip */
+ ULONG MacAddr[2]; /* for 6-byte hardware addresses */
+ ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */
+ BYTE *bPhysAddr;
+
+ if (!IpIsValid (ipadr)) {
+ if (fdebug)
+ printf ("Get_Mac: invalid IP addr\n");
+ return 1; /*error */
+ }
+ memcpy (&DestIp, ipadr, 4);
+
+ /* invoke system ARP query */
+ dwRetVal = SendARP (DestIp, SrcIp, MacAddr, &PhysAddrLen);
+
+ if (dwRetVal == NO_ERROR) { /* no error - get the MAC */
+ bPhysAddr = (BYTE *) & MacAddr;
+ if (PhysAddrLen) {
+ memcpy (macadr, bPhysAddr, MAC_LEN);
}
- return 0;
-} /* end Get_Mac() for WIN32*/
+ else
+ printf
+ ("Warning: SendArp completed successfully, but returned length=0\n");
+ }
+ else if (dwRetVal == ERROR_GEN_FAILURE) { /* MAC not available in this network - get gateway MAC */
+ memcpy (macadr, rggwymac, MAC_LEN);
+ }
+ else { /* other errors */
+ printf ("Error: SendArp failed with error: %d", dwRetVal);
+ switch (dwRetVal) {
+ case ERROR_INVALID_PARAMETER:
+ printf (" (ERROR_INVALID_PARAMETER)\n");
+ break;
+ case ERROR_INVALID_USER_BUFFER:
+ printf (" (ERROR_INVALID_USER_BUFFER)\n");
+ break;
+ case ERROR_BAD_NET_NAME:
+ printf (" (ERROR_GEN_FAILURE)\n");
+ break;
+ case ERROR_BUFFER_OVERFLOW:
+ printf (" (ERROR_BUFFER_OVERFLOW)\n");
+ break;
+ case ERROR_NOT_FOUND:
+ printf (" (ERROR_NOT_FOUND)\n");
+ break;
+ default:
+ printf ("\n");
+ break;
+ }
+ return 1;
+ }
+ return 0;
+} /* end Get_Mac() for WIN32 */
#elif defined(SOLARIS)
-int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
+int
+Get_Mac (uchar * ipadr, uchar * macadr, char *nodename)
{
- FILE *fparp;
- char buff[1024];
- /* char arpfile[] = "/proc/net/arp"; */
- char alertfile[] = "/tmp/dest.arping";
- char arping_cmd[128];
- char *pb, *pm;
- int num, i;
- int foundit = 0;
- int ret = 0;
-
- if (IpIsValid(ipadr)) { /* if valid IP address */
- sprintf(arping_cmd,
- "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
- ipadr[0],ipadr[1],ipadr[2],ipadr[3],
- ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile);
- } else if (nodename != NULL) { /*if valid nodename */
- sprintf(arping_cmd,
- "ping %s >/dev/null; arp -a |grep %s >%s\n",
- nodename,nodename,alertfile);
- } else ret = -1;
-
- if (ret == 0) { /* if valid IP address */
- /* make sure the destination is in the arp cache */
- if (fdebug) printf("%s", arping_cmd);
- system(arping_cmd);
-
- fparp = fopen(alertfile,"r");
- if (fparp == NULL) {
- fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
- alertfile,get_errno());
- ret = -1;
- } else {
- /* sample output: */
- /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */
- while (fgets(buff, 1023, fparp)) {
- /* should only run through loop once */
- num = strcspn(buff," \t"); /* skip 1st word ("e1000g0") */
- i = strspn(&buff[num]," \t"); /* skip whitespace */
- pb = &buff[num+i];
- num = strcspn(pb," \t"); /* skip 2nd word (nodename/IP) */
- i = strspn(&pb[num]," \t"); /* skip whitespace */
- pb += (num+i);
- pm = &pb[25]; /* Now pb[25] has the MAC address */
- { /*validate new address?*/
- if (fdebug) printf("Get_Mac: mac=%s\n",pm);
- foundit = 1;
- if (!MacIsValid(macadr)) atomac(macadr,pm);
- break;
- }
- } /*end while*/
- fclose(fparp);
- } /*end else file opened*/
- } /*endif valid IP */
-
- if (foundit == 0) { /* no errors, but no mac reply */
- if (MacIsValid(rggwymac) && !MacIsValid(macadr))
- /* this is useful if the ipadr is not in the local subnet */
- memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
- }
- return(ret);
-} /*end Get_Mac for Solaris*/
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm;
+ int num, i;
+ int foundit = 0;
+ int ret = 0;
+
+ if (IpIsValid (ipadr)) { /* if valid IP address */
+ sprintf (arping_cmd,
+ "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
+ ipadr[0], ipadr[1], ipadr[2], ipadr[3],
+ ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile);
+ }
+ else if (nodename != NULL) { /*if valid nodename */
+ sprintf (arping_cmd,
+ "ping %s >/dev/null; arp -a |grep %s >%s\n",
+ nodename, nodename, alertfile);
+ }
+ else
+ ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug)
+ printf ("%s", arping_cmd);
+ system (arping_cmd);
+
+ fparp = fopen (alertfile, "r");
+ if (fparp == NULL) {
+ fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile, get_errno ());
+ ret = -1;
+ }
+ else {
+ /* sample output: */
+ /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */
+ while (fgets (buff, 1023, fparp)) {
+ /* should only run through loop once */
+ num = strcspn (buff, " \t"); /* skip 1st word ("e1000g0") */
+ i = strspn (&buff[num], " \t"); /* skip whitespace */
+ pb = &buff[num + i];
+ num = strcspn (pb, " \t"); /* skip 2nd word (nodename/IP) */
+ i = strspn (&pb[num], " \t"); /* skip whitespace */
+ pb += (num + i);
+ pm = &pb[25]; /* Now pb[25] has the MAC address */
+ { /*validate new address? */
+ if (fdebug)
+ printf ("Get_Mac: mac=%s\n", pm);
+ foundit = 1;
+ if (!MacIsValid (macadr))
+ atomac (macadr, pm);
+ break;
+ }
+ } /*end while */
+ fclose (fparp);
+ } /*end else file opened */
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid (rggwymac) && !MacIsValid (macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */
+ }
+ return (ret);
+} /*end Get_Mac for Solaris */
#elif defined(BSD)
-int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
+int
+Get_Mac (uchar * ipadr, uchar * macadr, char *nodename)
{
- FILE *fparp;
- char buff[1024];
- /* char arpfile[] = "/proc/net/arp"; */
- char alertfile[] = "/tmp/dest.arping";
- char arping_cmd[128];
- char *pb, *pm;
- int num, i, j;
- int foundit = 0;
- int ret = 0;
-
- if (IpIsValid(ipadr)) { /* if valid IP address */
- sprintf(arping_cmd,
- "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
- ipadr[0],ipadr[1],ipadr[2],ipadr[3],
- ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile);
- } else if (nodename != NULL) { /*if valid nodename */
- sprintf(arping_cmd,
- "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n",
- nodename,nodename,alertfile);
- } else ret = -1;
-
- if (ret == 0) { /* if valid IP address */
- /* make sure the destination is in the arp cache */
- if (fdebug) printf("%s", arping_cmd);
- system(arping_cmd);
-
- fparp = fopen(alertfile,"r");
- if (fparp == NULL) {
- fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
- alertfile,get_errno());
- ret = -1;
- } else {
- /* sample output of arp -a -n: */
- /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
- /* sample output of arp -a: */
- /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
- while (fgets(buff, 1023, fparp)) {
- /* should only run through loop once */
- pb = &buff[0];
- for (j = 0; j < 3; j++) { /* skip 3 words */
- num = strcspn(pb," \t"); /* skip jth word */
- i = strspn(&pb[num]," \t"); /* skip whitespace */
- pb += (num+i);
- }
- pm = &pb[0]; /* Now pb[0] has the MAC address */
- { /* no need to validate new address*/
- if (fdebug) printf("Get_Mac: mac=%s\n",pm);
- foundit = 1;
- if (!MacIsValid(macadr)) atomac(macadr,pm);
- break;
- }
- } /*end while*/
- fclose(fparp);
- } /*end else file opened*/
- } /*endif valid IP */
-
- if (foundit == 0) { /* no errors, but no mac reply */
- if (MacIsValid(rggwymac) && !MacIsValid(macadr))
- /* this is useful if the ipadr is not in the local subnet */
- memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
- }
- return(ret);
-} /*end Get_Mac for BSD */
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm;
+ int num, i, j;
+ int foundit = 0;
+ int ret = 0;
+
+ if (IpIsValid (ipadr)) { /* if valid IP address */
+ sprintf (arping_cmd,
+ "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
+ ipadr[0], ipadr[1], ipadr[2], ipadr[3],
+ ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile);
+ }
+ else if (nodename != NULL) { /*if valid nodename */
+ sprintf (arping_cmd,
+ "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n",
+ nodename, nodename, alertfile);
+ }
+ else
+ ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug)
+ printf ("%s", arping_cmd);
+ system (arping_cmd);
+
+ fparp = fopen (alertfile, "r");
+ if (fparp == NULL) {
+ fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile, get_errno ());
+ ret = -1;
+ }
+ else {
+ /* sample output of arp -a -n: */
+ /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
+ /* sample output of arp -a: */
+ /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
+ while (fgets (buff, 1023, fparp)) {
+ /* should only run through loop once */
+ pb = &buff[0];
+ for (j = 0; j < 3; j++) { /* skip 3 words */
+ num = strcspn (pb, " \t"); /* skip jth word */
+ i = strspn (&pb[num], " \t"); /* skip whitespace */
+ pb += (num + i);
+ }
+ pm = &pb[0]; /* Now pb[0] has the MAC address */
+ { /* no need to validate new address */
+ if (fdebug)
+ printf ("Get_Mac: mac=%s\n", pm);
+ foundit = 1;
+ if (!MacIsValid (macadr))
+ atomac (macadr, pm);
+ break;
+ }
+ } /*end while */
+ fclose (fparp);
+ } /*end else file opened */
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid (rggwymac) && !MacIsValid (macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */
+ }
+ return (ret);
+} /*end Get_Mac for BSD */
#else
-int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
-{ /* Get_Mac for Linux */
- FILE *fparp;
- char buff[1024];
- /* char arpfile[] = "/proc/net/arp"; */
- char alertfile[] = "/tmp/dest.arping";
- char arping_cmd[128];
- char *pb, *pm, *px;
- int num, i;
- int foundit = 0;
- int ret = 0;
- char *_ifname;
-
- if (strcmp(ifname,"gcm") == 0) _ifname = ifname0; /*see gcm_ch instead*/
- else _ifname = ifname;
-
- /* Get a MAC address for a given IP address or nodename */
- if (IpIsValid(ipadr)) { /* if valid IP address */
- sprintf(arping_cmd,
- "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n",
- _ifname,ipadr[0],ipadr[1],ipadr[2],ipadr[3],alertfile);
- } else if (nodename != NULL) { /*if valid nodename */
- sprintf(arping_cmd,
- "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n",
- _ifname,nodename,alertfile);
- } else ret = -1;
-
- if (ret == 0) { /* if valid IP address */
- /* make sure the destination is in the arp cache */
- if (fdebug) printf("%s", arping_cmd);
- ret = system(arping_cmd);
-
- fparp = fopen(alertfile,"r");
- if (fparp == NULL) {
- fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
- alertfile,get_errno());
- ret = -1;
- } else {
- ret = 0;
- while (fgets(buff, 1023, fparp)) {
- /* should only run through loop once */
- num = strcspn(buff," \t"); /* skip 1st word ("Unicast") */
- i = strspn(&buff[num]," \t");
- pb = &buff[num+i];
- if (strncmp(pb,"reply",5) == 0) { /* valid output */
- /* Find the ip address */
- pb += 6 + 5; /* skip "reply from " */
- num = strcspn(pb," \t");
- pb[num] = 0;
- if (fdebug) printf("Get_Mac: ip=%s\n",pb);
- /* IP address should already match input param */
- if (!IpIsValid(ipadr)) /* had nodname only*/
- atoip(ipadr,pb); /* fill in ipadr */
- /* Now find the mac address */
- pm = strchr(&pb[num+1],'[');
- if (pm == NULL) pm = &pb[num+2]; /* just in case */
- pm++;
- px = strchr(pm,']');
- if (px == NULL) px = pm + 17; /* just in case */
- px[0] = 0;
- if (fdebug) printf("Get_Mac: mac=%s\n",pm);
- foundit = 1;
- if (!MacIsValid(macadr)) atomac(macadr,pm);
- break;
- }
- } /*end while*/
- fclose(fparp);
- } /*end else file opened*/
- } /*endif valid IP */
-
- if (foundit == 0) { /* no errors, but no mac reply */
- if (MacIsValid(rggwymac) && !MacIsValid(macadr))
- /* this is useful if the ipadr is not in the local subnet */
- memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
- }
- return(ret);
-} /* end Get_Mac() for Linux*/
+int
+Get_Mac (uchar * ipadr, uchar * macadr, char *nodename)
+{ /* Get_Mac for Linux */
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm, *px;
+ int num, i;
+ int foundit = 0;
+ int ret = 0;
+ char *_ifname;
+
+ if (strcmp (ifname, "gcm") == 0)
+ _ifname = ifname0; /*see gcm_ch instead */
+ else
+ _ifname = ifname;
+
+ /* Get a MAC address for a given IP address or nodename */
+ if (IpIsValid (ipadr)) { /* if valid IP address */
+ sprintf (arping_cmd,
+ "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n",
+ _ifname, ipadr[0], ipadr[1], ipadr[2], ipadr[3], alertfile);
+ }
+ else if (nodename != NULL) { /*if valid nodename */
+ sprintf (arping_cmd,
+ "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n",
+ _ifname, nodename, alertfile);
+ }
+ else
+ ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug)
+ printf ("%s", arping_cmd);
+ ret = system (arping_cmd);
+
+ fparp = fopen (alertfile, "r");
+ if (fparp == NULL) {
+ fprintf (stdout, "Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile, get_errno ());
+ ret = -1;
+ }
+ else {
+ ret = 0;
+ while (fgets (buff, 1023, fparp)) {
+ /* should only run through loop once */
+ num = strcspn (buff, " \t"); /* skip 1st word ("Unicast") */
+ i = strspn (&buff[num], " \t");
+ pb = &buff[num + i];
+ if (strncmp (pb, "reply", 5) == 0) { /* valid output */
+ /* Find the ip address */
+ pb += 6 + 5; /* skip "reply from " */
+ num = strcspn (pb, " \t");
+ pb[num] = 0;
+ if (fdebug)
+ printf ("Get_Mac: ip=%s\n", pb);
+ /* IP address should already match input param */
+ if (!IpIsValid (ipadr)) /* had nodname only */
+ atoip (ipadr, pb); /* fill in ipadr */
+ /* Now find the mac address */
+ pm = strchr (&pb[num + 1], '[');
+ if (pm == NULL)
+ pm = &pb[num + 2]; /* just in case */
+ pm++;
+ px = strchr (pm, ']');
+ if (px == NULL)
+ px = pm + 17; /* just in case */
+ px[0] = 0;
+ if (fdebug)
+ printf ("Get_Mac: mac=%s\n", pm);
+ foundit = 1;
+ if (!MacIsValid (macadr))
+ atomac (macadr, pm);
+ break;
+ }
+ } /*end while */
+ fclose (fparp);
+ } /*end else file opened */
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid (rggwymac) && !MacIsValid (macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy (macadr, rggwymac, 6); /* get to it from the default gateway */
+ }
+ return (ret);
+} /* end Get_Mac() for Linux */
#endif
#ifdef WIN32
/*
* Set subnet mask based on current IP address (Windows).
*/
-int SetSubnetMask() {
- PMIB_IPADDRTABLE pIPAddrTable;
- unsigned int i;
- DWORD dwSize = 0, dwRetVal;
- LPVOID lpMsgBuf;
-
- pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) );
-
- if ( pIPAddrTable ) {
- // Make an initial call to GetIpAddrTable to get the
- // necessary size into the dwSize variable
- if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
- free( pIPAddrTable );
- pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
- }
- } else
- printf("Memory allocation failed.\n");
-
- if ( pIPAddrTable ) {
- // Make a second call to GetIpAddrTable to get the
- // actual data we want
- if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) == NO_ERROR ) {
- for(i = 0; i < pIPAddrTable->dwNumEntries; ++i) {
- if(memcmp(&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) {
- memcpy(rgsubnet, &(pIPAddrTable->table[i].dwMask), 4);
- free( pIPAddrTable );
- return 1;
- }
- }
- } else {
- if (FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dwRetVal,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL )) {
- printf("\tError: %s", lpMsgBuf);
- }
-
- printf("Call to GetIpAddrTable failed.\n");
- }
- }
-
- if ( pIPAddrTable )
- free( pIPAddrTable );
+int
+SetSubnetMask ()
+{
+ PMIB_IPADDRTABLE pIPAddrTable;
+ unsigned int i;
+ DWORD dwSize = 0, dwRetVal;
+ LPVOID lpMsgBuf;
+
+ pIPAddrTable = (MIB_IPADDRTABLE *) malloc (sizeof (MIB_IPADDRTABLE));
+
+ if (pIPAddrTable) {
+ // Make an initial call to GetIpAddrTable to get the
+ // necessary size into the dwSize variable
+ if (GetIpAddrTable (pIPAddrTable, &dwSize, 0) ==
+ ERROR_INSUFFICIENT_BUFFER) {
+ free (pIPAddrTable);
+ pIPAddrTable = (MIB_IPADDRTABLE *) malloc (dwSize);
+ }
+ }
+ else
+ printf ("Memory allocation failed.\n");
+
+ if (pIPAddrTable) {
+ // Make a second call to GetIpAddrTable to get the
+ // actual data we want
+ if ((dwRetVal = GetIpAddrTable (pIPAddrTable, &dwSize, 0)) == NO_ERROR) {
+ for (i = 0; i < pIPAddrTable->dwNumEntries; ++i) {
+ if (memcmp (&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) {
+ memcpy (rgsubnet, &(pIPAddrTable->table[i].dwMask), 4);
+ free (pIPAddrTable);
+ return 1;
+ }
+ }
+ }
+ else {
+ if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) & lpMsgBuf, 0, NULL)) {
+ printf ("\tError: %s", lpMsgBuf);
+ }
- return 0;
+ printf ("Call to GetIpAddrTable failed.\n");
+ }
+ }
+
+ if (pIPAddrTable)
+ free (pIPAddrTable);
+
+ return 0;
}
/*
* Extract gateway address from routing table (Windows).
*/
-int SetDefaultGateway() {
- PMIB_IPFORWARDTABLE pIpForwardTable;
- DWORD dwRetVal, dwSize;
+int
+SetDefaultGateway ()
+{
+ PMIB_IPFORWARDTABLE pIpForwardTable;
+ DWORD dwRetVal, dwSize;
- unsigned int nord_mask;
- unsigned int nord_ip;
- unsigned int nord_net;
+ unsigned int nord_mask;
+ unsigned int nord_ip;
+ unsigned int nord_net;
- unsigned int i;
+ unsigned int i;
- nord_mask = *((unsigned int *)rgsubnet);
- nord_ip = *((unsigned int *)rgmyip);
+ nord_mask = *((unsigned int *) rgsubnet);
+ nord_ip = *((unsigned int *) rgmyip);
- nord_net = nord_ip & nord_mask;
+ nord_net = nord_ip & nord_mask;
- pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(sizeof(MIB_IPFORWARDTABLE));
+ pIpForwardTable =
+ (MIB_IPFORWARDTABLE *) malloc (sizeof (MIB_IPFORWARDTABLE));
+ if (pIpForwardTable == NULL) {
+ printf ("Error allocating memory\n");
+ return 0;
+ }
+
+ dwSize = 0;
+ if (GetIpForwardTable (pIpForwardTable, &dwSize, 0) ==
+ ERROR_INSUFFICIENT_BUFFER) {
+ free (pIpForwardTable);
+ pIpForwardTable = (MIB_IPFORWARDTABLE *) malloc (dwSize);
if (pIpForwardTable == NULL) {
- printf("Error allocating memory\n");
- return 0;
- }
-
- dwSize = 0;
- if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
- free(pIpForwardTable);
- pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(dwSize);
- if (pIpForwardTable == NULL) {
- printf("Error allocating memory\n");
- return 0;
- }
- }
-
- /*
- * Note that the IPv4 addresses returned in
- * GetIpForwardTable entries are in network byte order
- */
- if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
- for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
- unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop;
- if(nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr)
- { /* searching for gateways from our network with different address than ours */
- memcpy(rggwyip, &gwaddr, 4);
- return 0;
- }
- }
- free(pIpForwardTable);
- return 1;
+ printf ("Error allocating memory\n");
+ return 0;
}
- else {
- printf("\tGetIpForwardTable failed.\n");
- free(pIpForwardTable);
- return 0;
+ }
+
+ /*
+ * Note that the IPv4 addresses returned in
+ * GetIpForwardTable entries are in network byte order
+ */
+ if ((dwRetVal =
+ GetIpForwardTable (pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
+ for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
+ unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop;
+ if (nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr) { /* searching for gateways from our network with different address than ours */
+ memcpy (rggwyip, &gwaddr, 4);
+ return 0;
+ }
}
-
+ free (pIpForwardTable);
+ return 1;
+ }
+ else {
+ printf ("\tGetIpForwardTable failed.\n");
+ free (pIpForwardTable);
+ return 0;
+ }
+
}
+
/*endif WIN32*/
#endif
@@ -2664,732 +2931,827 @@ int SetDefaultGateway() {
* SuSE SLES 9: /etc/snmpd.conf
*/
#ifdef WIN32
-int Get_IPMac_Addr()
-{ /*for Windows*/
- char ipstr[] = "IP Address";
- char macstr[] = "Physical Address";
- char gwystr[] = "Default Gateway";
- char substr[] = "Subnet Mask";
- int found = 0;
- char fgetmac;
-
- if (IpIsValid(rgmyip))
- { /* user-specified ip, get mac */
- if (fdebug) printf("User IP was specified\n");
- if (!MacIsValid(rgmymac))
- { /* no user-specified MAC, get it from IP */
- if (fdebug) printf("No user MAC specified\n");
- if(!GetLocalMACByIP())
- { /* couldn't get MAC from IP, get old one */
- if (fdebug) printf("No MAC from IP, use old\n");
- if(IpIsValid(bmcmyip) && MacIsValid(bmcmymac))
- {
- printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- bmcmymac[0], bmcmymac[1],
- bmcmymac[2], bmcmymac[3],
- bmcmymac[4], bmcmymac[5]);
- memcpy(rgmymac,bmcmymac,MAC_LEN);
- } else {
- printf("Failed to obtain valid MAC\n");
- }
- } else {
- printf("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- rgmymac[0], rgmymac[1],
- rgmymac[2], rgmymac[3],
- rgmymac[4], rgmymac[5]);
- }
- } else { /* user MAC available */
- printf("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- rgmymac[0], rgmymac[1],
- rgmymac[2], rgmymac[3],
- rgmymac[4], rgmymac[5]);
- }
- } else { /* no user-specified IP */
- if (fdebug) printf("No user IP specified\n");
- if (!MacIsValid(rgmymac))
- { /* no user-specified MAC, get it from interface */
- if(!GetLocalDataByIface())
- { /* use existing MAC an IP */
- printf("Using current BMC IP %d.%d.%d.%d\n",
- bmcmyip[0], bmcmyip[1],
- bmcmyip[2], bmcmyip[3]);
- memcpy(rgmyip,bmcmyip,4);
- printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- bmcmymac[0], bmcmymac[1],
- bmcmymac[2], bmcmymac[3],
- bmcmymac[4], bmcmymac[5]);
- memcpy(rgmymac,bmcmymac,MAC_LEN);
-
- }
- } else { /* user-specified MAC */
- if(!GetLocalIPByMAC(rgmymac))
- { /* use existing MAC and IP */
- printf("Using current BMC IP %d.%d.%d.%d\n",
- bmcmyip[0], bmcmyip[1],
- bmcmyip[2], bmcmyip[3]);
- memcpy(rgmyip,bmcmyip,4);
- printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
- bmcmymac[0], bmcmymac[1],
- bmcmymac[2], bmcmymac[3],
- bmcmymac[4], bmcmymac[5]);
- memcpy(rgmymac,bmcmymac,MAC_LEN);
- }
- }
- }
-
- if (rghostname[0] == 0) { /*hostname not specified*/
- if (!fipmilan)
- gethostname(rghostname,sizeof(rghostname));
- }
- if (fdebug) /* show the local OS eth if and MAC */
- printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
- ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname,
- osmymac[0], osmymac[1], osmymac[2], osmymac[3],
- osmymac[4], osmymac[5]);
-
- if(!SubnetIsValid(rgsubnet)) {
- SetSubnetMask();
- }
- if (!IpIsValid(rggwyip)) { /* if gwy ip not user-specified */
- SetDefaultGateway();
+int
+Get_IPMac_Addr ()
+{ /*for Windows */
+ char ipstr[] = "IP Address";
+ char macstr[] = "Physical Address";
+ char gwystr[] = "Default Gateway";
+ char substr[] = "Subnet Mask";
+ int found = 0;
+ char fgetmac;
+
+ if (IpIsValid (rgmyip)) { /* user-specified ip, get mac */
+ if (fdebug)
+ printf ("User IP was specified\n");
+ if (!MacIsValid (rgmymac)) { /* no user-specified MAC, get it from IP */
+ if (fdebug)
+ printf ("No user MAC specified\n");
+ if (!GetLocalMACByIP ()) { /* couldn't get MAC from IP, get old one */
+ if (fdebug)
+ printf ("No MAC from IP, use old\n");
+ if (IpIsValid (bmcmyip) && MacIsValid (bmcmymac)) {
+ printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]);
+ memcpy (rgmymac, bmcmymac, MAC_LEN);
}
+ else {
+ printf ("Failed to obtain valid MAC\n");
+ }
+ }
+ else {
+ printf ("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ rgmymac[0], rgmymac[1],
+ rgmymac[2], rgmymac[3], rgmymac[4], rgmymac[5]);
+ }
+ }
+ else { /* user MAC available */
+ printf ("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ rgmymac[0], rgmymac[1],
+ rgmymac[2], rgmymac[3], rgmymac[4], rgmymac[5]);
+ }
+ }
+ else { /* no user-specified IP */
+ if (fdebug)
+ printf ("No user IP specified\n");
+ if (!MacIsValid (rgmymac)) { /* no user-specified MAC, get it from interface */
+ if (!GetLocalDataByIface ()) { /* use existing MAC an IP */
+ printf ("Using current BMC IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]);
+ memcpy (rgmyip, bmcmyip, 4);
+ printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]);
+ memcpy (rgmymac, bmcmymac, MAC_LEN);
- if (lan_ch == gcm_ch) {
- if (SubnetIsSame(rgmyip,rggwyip,rgsubnet)) fgetmac = 1;
- else fgetmac = 0;
- } else fgetmac = 1;
+ }
+ }
+ else { /* user-specified MAC */
+ if (!GetLocalIPByMAC (rgmymac)) { /* use existing MAC and IP */
+ printf ("Using current BMC IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]);
+ memcpy (rgmyip, bmcmyip, 4);
+ printf ("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3], bmcmymac[4], bmcmymac[5]);
+ memcpy (rgmymac, bmcmymac, MAC_LEN);
+ }
+ }
+ }
+
+ if (rghostname[0] == 0) { /*hostname not specified */
+ if (!fipmilan)
+ gethostname (rghostname, sizeof (rghostname));
+ }
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf
+ ("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
+ ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], rghostname,
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3], osmymac[4],
+ osmymac[5]);
+
+ if (!SubnetIsValid (rgsubnet)) {
+ SetSubnetMask ();
+ }
+ if (!IpIsValid (rggwyip)) { /* if gwy ip not user-specified */
+ SetDefaultGateway ();
+ }
+
+ if (lan_ch == gcm_ch) {
+ if (SubnetIsSame (rgmyip, rggwyip, rgsubnet))
+ fgetmac = 1;
+ else
+ fgetmac = 0;
+ }
+ else
+ fgetmac = 1;
- if (fgetmac) {
- if (IpIsValid(rggwyip) && !MacIsValid(rggwymac)) /*gwy mac not specified*/
- Get_Mac(rggwyip,rggwymac,NULL);
+ if (fgetmac) {
+ if (IpIsValid (rggwyip) && !MacIsValid (rggwymac)) /*gwy mac not specified */
+ Get_Mac (rggwyip, rggwymac, NULL);
- if (IpIsValid(rggwy2ip) && !MacIsValid(rggwy2mac)) /*gwy2 mac not valid*/
- Get_Mac(rggwy2ip,rggwy2mac,NULL);
- }
+ if (IpIsValid (rggwy2ip) && !MacIsValid (rggwy2mac)) /*gwy2 mac not valid */
+ Get_Mac (rggwy2ip, rggwy2mac, NULL);
+ }
- return(0);
-} /* end Get_IPMac_Addr for Windows */
+ return (0);
+} /* end Get_IPMac_Addr for Windows */
#elif defined(HPUX)
-int Get_IPMac_Addr()
-{ /*for HP-UX*/
- return(-1);
+int
+Get_IPMac_Addr ()
+{ /*for HP-UX */
+ return (-1);
}
#else
-int Get_IPMac_Addr()
-{ /*for Linux*/
-#if defined(SOLARIS)
- char rtfile[] = "/tmp/route";
- char snmpfile[] = "/etc/snmp/conf/snmpd.conf";
+int
+Get_IPMac_Addr ()
+{ /*for Linux */
+#if defined(SOLARIS)
+ char rtfile[] = "/tmp/route";
+ char snmpfile[] = "/etc/snmp/conf/snmpd.conf";
#elif defined(BSD)
- char rtfile[] = "/tmp/route";
- char snmpfile[] = "/etc/snmpd.config";
+ char rtfile[] = "/tmp/route";
+ char snmpfile[] = "/etc/snmpd.config";
#else
- char rtfile[] = "/proc/net/route";
- char snmpfile[] = "/etc/snmp/snmpd.conf";
+ char rtfile[] = "/proc/net/route";
+ char snmpfile[] = "/etc/snmp/snmpd.conf";
#endif
- // char alertfile[] = "/tmp/alert.arping";
- // FILE *fparp;
- FILE *fprt;
- int fd = -1;
- int skfd;
- uchar *pc;
- int rc = 0;
- int i,j;
- uchar bnetadr[4];
- uchar bgateadr[4];
- char gate_addr[128];
- char iface[16];
- char defcommunity[19] = "public";
- char buff[1024];
- char alertname[60];
- int num, nmatch;
- struct ifreq ifr;
- char *_ifname;
- char fgetmac;
-
- /* Get the IP address and associated MAC address specified. */
- /* Local for ethN; Default Gateway; Alert Destination */
-
- /* Get the default gateway IP */
+ // char alertfile[] = "/tmp/alert.arping";
+ // FILE *fparp;
+ FILE *fprt;
+ int fd = -1;
+ int skfd;
+ uchar *pc;
+ int rc = 0;
+ int i, j;
+ uchar bnetadr[4];
+ uchar bgateadr[4];
+ char gate_addr[128];
+ char iface[16];
+ char defcommunity[19] = "public";
+ char buff[1024];
+ char alertname[60];
+ int num, nmatch;
+ struct ifreq ifr;
+ char *_ifname;
+ char fgetmac;
+
+ /* Get the IP address and associated MAC address specified. */
+ /* Local for ethN; Default Gateway; Alert Destination */
+
+ /* Get the default gateway IP */
#if defined(SOLARIS) || defined(BSD)
- char rtcmd[80];
- sprintf(rtcmd,"netstat -r -n |grep default |awk '{ print $2 }' >%s",rtfile);
- system(rtcmd);
- /* use rtfile output from netstat -r, see also /etc/defaultroute */
- fprt = fopen(rtfile,"r");
- if (fprt == NULL) {
- fprintf(stdout,"netstat: Cannot open %s, errno = %d\n",rtfile,get_errno());
- } else {
- while (fgets(buff, 1023, fprt)) {
- if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid*/
- atoip(bgateadr,buff);
- if (fdebug)
- printf("default gateway: %s, %d.%d.%d.%d %s\n",buff,
- bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],ifname);
- if (!IpIsValid(rggwyip)) /* if not user-specified */
- memcpy(rggwyip,bgateadr,4);
- break;
- }
+ char rtcmd[80];
+ sprintf (rtcmd, "netstat -r -n |grep default |awk '{ print $2 }' >%s",
+ rtfile);
+ system (rtcmd);
+ /* use rtfile output from netstat -r, see also /etc/defaultroute */
+ fprt = fopen (rtfile, "r");
+ if (fprt == NULL) {
+ fprintf (stdout, "netstat: Cannot open %s, errno = %d\n", rtfile,
+ get_errno ());
+ }
+ else {
+ while (fgets (buff, 1023, fprt)) {
+ if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid */
+ atoip (bgateadr, buff);
+ if (fdebug)
+ printf ("default gateway: %s, %d.%d.%d.%d %s\n", buff,
+ bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3], ifname);
+ if (!IpIsValid (rggwyip)) /* if not user-specified */
+ memcpy (rggwyip, bgateadr, 4);
+ break;
}
- fclose(fprt);
- } /*end-else good open */
+ }
+ fclose (fprt);
+ } /*end-else good open */
#else
- /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */
- fprt = fopen(rtfile,"r");
- if (fprt == NULL) {
- fprintf(stdout,"route: Cannot open %s, errno = %d\n",rtfile,get_errno());
- } else {
- char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n";
- int iflags, refcnt, use, metric, mss, window, irtt;
- char mask_addr[128], net_addr[128];
- uint *pnet;
- uint *pgate;
-
- pnet = (uint *)&bnetadr[0];
- pgate = (uint *)&bgateadr[0];
- while (fgets(buff, 1023, fprt)) {
- num = sscanf(buff, rtfmt,
- iface, net_addr, gate_addr,
- &iflags, &refcnt, &use, &metric, mask_addr,
- &mss, &window, &irtt);
- if (num < 10 || !(iflags & RTF_UP))
- continue;
-
- j = 6;
- for (i = 0; i < 4; i ++) {
- bnetadr[i] = htoi(&net_addr[j]);
- bgateadr[i] = htoi(&gate_addr[j]);
- j -= 2;
- }
- if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */
- if (fdebug)
- printf("default gateway: %s, %d.%d.%d.%d %s\n",gate_addr,
- bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],iface);
- if (!IpIsValid(rggwyip)) /* if not user-specified */
- memcpy(rggwyip,bgateadr,4);
- _ifname = iface; /*use this iface for gwy mac */
- if (!fsetifn) strncpy(ifname,iface,16);
- break;
- }
- } /*end while*/
- fclose(fprt);
- } /*end-else good open */
+ /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */
+ fprt = fopen (rtfile, "r");
+ if (fprt == NULL) {
+ fprintf (stdout, "route: Cannot open %s, errno = %d\n", rtfile,
+ get_errno ());
+ }
+ else {
+ char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n";
+ int iflags, refcnt, use, metric, mss, window, irtt;
+ char mask_addr[128], net_addr[128];
+ uint *pnet;
+ uint *pgate;
+
+ pnet = (uint *) & bnetadr[0];
+ pgate = (uint *) & bgateadr[0];
+ while (fgets (buff, 1023, fprt)) {
+ num = sscanf (buff, rtfmt,
+ iface, net_addr, gate_addr,
+ &iflags, &refcnt, &use, &metric, mask_addr,
+ &mss, &window, &irtt);
+ if (num < 10 || !(iflags & RTF_UP))
+ continue;
+
+ j = 6;
+ for (i = 0; i < 4; i++) {
+ bnetadr[i] = htoi (&net_addr[j]);
+ bgateadr[i] = htoi (&gate_addr[j]);
+ j -= 2;
+ }
+ if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */
+ if (fdebug)
+ printf ("default gateway: %s, %d.%d.%d.%d %s\n", gate_addr,
+ bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3], iface);
+ if (!IpIsValid (rggwyip)) /* if not user-specified */
+ memcpy (rggwyip, bgateadr, 4);
+ _ifname = iface; /*use this iface for gwy mac */
+ if (!fsetifn)
+ strncpy (ifname, iface, 16);
+ break;
+ }
+ } /*end while */
+ fclose (fprt);
+ } /*end-else good open */
#endif
- /* Create a channel to the NET kernel. */
- if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- perror("socket");
- return(-3);
- }
-
- /* Find a valid local BMC MAC Address */
- if (lan_ch == gcm_ch) {
- /* GCM has its own unique mac address */
- if (!MacIsValid(rgmymac)) {
- if (MacIsValid(bmcmymac)) {
- memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
- } else { /*error*/
- printf("invalid MAC address for gcm\n");
- }
- } /*else use rgmymac if specified*/
- _ifname = iface; /*use the iface from gwy (e.g. eth0) */
- fsharedMAC = 0; /*gcm has separate NIC, separate MAC*/
-
- // fd = -1;
- fd = skfd; // get_socket_for_af(AF_INET) below;
- } else { /*else not gcm*/
- if (!fsetifn && !fethfound) { /*do not have ifname yet*/
- i = FindEthNum(bmcmymac);
- if (i >= 0) sprintf(ifname,"%s%d",ifpattn,i);
- }
- ifr.ifr_addr.sa_family = AF_INET;
- if (fdebug) printf("getipmac: ifname=%s\n",ifname);
- _ifname = ifname;
- strcpy(ifr.ifr_name, _ifname);
+ /* Create a channel to the NET kernel. */
+ if ((skfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0) {
+ perror ("socket");
+ return (-3);
+ }
+
+ /* Find a valid local BMC MAC Address */
+ if (lan_ch == gcm_ch) {
+ /* GCM has its own unique mac address */
+ if (!MacIsValid (rgmymac)) {
+ if (MacIsValid (bmcmymac)) {
+ memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */
+ }
+ else { /*error */
+ printf ("invalid MAC address for gcm\n");
+ }
+ } /*else use rgmymac if specified */
+ _ifname = iface; /*use the iface from gwy (e.g. eth0) */
+ fsharedMAC = 0; /*gcm has separate NIC, separate MAC */
+
+ // fd = -1;
+ fd = skfd; // get_socket_for_af(AF_INET) below;
+ }
+ else { /*else not gcm */
+ if (!fsetifn && !fethfound) { /*do not have ifname yet */
+ i = FindEthNum (bmcmymac);
+ if (i >= 0)
+ sprintf (ifname, "%s%d", ifpattn, i);
+ }
+ ifr.ifr_addr.sa_family = AF_INET;
+ if (fdebug)
+ printf ("getipmac: ifname=%s\n", ifname);
+ _ifname = ifname;
+ strcpy (ifr.ifr_name, _ifname);
#ifdef SIOCGIFHWADDR
- /* Get the local if HWADDR (MAC Address) from OS */
- if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) {
- if (fdebug)
- printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",_ifname,get_errno());
- } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/
+ /* Get the local if HWADDR (MAC Address) from OS */
+ if (ioctl (skfd, SIOCGIFHWADDR, &ifr) < 0) {
+ if (fdebug)
+ printf ("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n", _ifname,
+ get_errno ());
+ }
+ else
+ memcpy (osmymac, get_ifreq_mac (&ifr), MAC_LEN); /*OS mac */
#endif
-
- if (memcmp(bmcmymac,osmymac,MAC_LEN) == 0) {
- /* osmymac and ifname were set above by FindEthNum */
- printf("\tBMC shares IP/MAC with OS NIC %s\n",_ifname);
- fsharedMAC = 1;
- } /* else fsharedMAC = 0; */
-
- if (fsharedMAC == 0) { /* then BMC has separate MAC */
- if (!MacIsValid(rgmymac) && MacIsValid(bmcmymac))
- memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
- } else { /* else OS & BMC share a MAC */
- /* Use the local if HWADDR (MAC Address) from OS */
- if (!MacIsValid(rgmymac)) { /* if not user-specified */
- if (MacIsValid(bmcmymac))
- memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
- else memcpy(rgmymac,osmymac,MAC_LEN); /*use OS mac*/
- }
- }
- fd = skfd; // get_socket_for_af(AF_INET) below;
- }
-
- if (fd >= 0) { /* if valid fd, find OS IP */
- strcpy(ifr.ifr_name, _ifname);
- ifr.ifr_addr.sa_family = AF_INET;
- /* Get the IFADDR (IP Address) from OS */
- if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
- int err;
- err = get_errno();
- /* errno 99 here means that eth0 is not enabled/up/defined. */
- if (err == 99)
- printf("ioctl(SIOCGIFADDR) error, %s not enabled\n",_ifname);
- else if (fdebug)
- printf("ioctl(SIOCGIFADDR,%s) error, errno=%d\n",_ifname,err);
- } else { /* got the local OS IP successfully */
- pc = (uchar *)&ifr.ifr_addr.sa_data[2];
- if (fdebug)
- printf("%s addr = %d.%d.%d.%d\n",_ifname,pc[0],pc[1],pc[2],pc[3]);
- memcpy(osmyip, pc, 4);
- if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/
- memcpy(rgmyip, osmyip, 4);
-
- /* get the local OS netmask */
- strcpy(ifr.ifr_name, _ifname);
- if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) {
- if (fdebug)
- printf("ioctl(SIOCGIFNETMASK) error, errno=%d\n",get_errno());
- /* if leave invalid, will use default rgsubnet */
- } else { // sizeof(struct sockaddr)
- pc = (uchar *)&ifr.ifr_netmask.sa_data[2];
- if (fdebug)
- printf("subnet = %d.%d.%d.%d \n", pc[0],pc[1],pc[2],pc[3]);
- memcpy(ossubnet, pc, 4);
- if (!SubnetIsValid(rgsubnet) && fsharedMAC) /*not specified*/
- memcpy(rgsubnet, pc, 4);
- }
+
+ if (memcmp (bmcmymac, osmymac, MAC_LEN) == 0) {
+ /* osmymac and ifname were set above by FindEthNum */
+ printf ("\tBMC shares IP/MAC with OS NIC %s\n", _ifname);
+ fsharedMAC = 1;
+ } /* else fsharedMAC = 0; */
+
+ if (fsharedMAC == 0) { /* then BMC has separate MAC */
+ if (!MacIsValid (rgmymac) && MacIsValid (bmcmymac))
+ memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */
+ }
+ else { /* else OS & BMC share a MAC */
+ /* Use the local if HWADDR (MAC Address) from OS */
+ if (!MacIsValid (rgmymac)) { /* if not user-specified */
+ if (MacIsValid (bmcmymac))
+ memcpy (rgmymac, bmcmymac, MAC_LEN); /*use existing */
+ else
+ memcpy (rgmymac, osmymac, MAC_LEN); /*use OS mac */
+ }
+ }
+ fd = skfd; // get_socket_for_af(AF_INET) below;
+ }
+
+ if (fd >= 0) { /* if valid fd, find OS IP */
+ strcpy (ifr.ifr_name, _ifname);
+ ifr.ifr_addr.sa_family = AF_INET;
+ /* Get the IFADDR (IP Address) from OS */
+ if (ioctl (fd, SIOCGIFADDR, &ifr) < 0) {
+ int err;
+ err = get_errno ();
+ /* errno 99 here means that eth0 is not enabled/up/defined. */
+ if (err == 99)
+ printf ("ioctl(SIOCGIFADDR) error, %s not enabled\n", _ifname);
+ else if (fdebug)
+ printf ("ioctl(SIOCGIFADDR,%s) error, errno=%d\n", _ifname, err);
+ }
+ else { /* got the local OS IP successfully */
+ pc = (uchar *) & ifr.ifr_addr.sa_data[2];
+ if (fdebug)
+ printf ("%s addr = %d.%d.%d.%d\n", _ifname, pc[0], pc[1], pc[2],
+ pc[3]);
+ memcpy (osmyip, pc, 4);
+ if (!IpIsValid (rgmyip) && (fsharedMAC == 1)) /*not specified, shared */
+ memcpy (rgmyip, osmyip, 4);
+
+ /* get the local OS netmask */
+ strcpy (ifr.ifr_name, _ifname);
+ if (ioctl (fd, SIOCGIFNETMASK, &ifr) < 0) {
+ if (fdebug)
+ printf ("ioctl(SIOCGIFNETMASK) error, errno=%d\n", get_errno ());
+ /* if leave invalid, will use default rgsubnet */
+ }
+ else { // sizeof(struct sockaddr)
+ pc = (uchar *) & ifr.ifr_netmask.sa_data[2];
+ if (fdebug)
+ printf ("subnet = %d.%d.%d.%d \n", pc[0], pc[1], pc[2], pc[3]);
+ memcpy (ossubnet, pc, 4);
+ if (!SubnetIsValid (rgsubnet) && fsharedMAC) /*not specified */
+ memcpy (rgsubnet, pc, 4);
+ }
#ifdef SIOCGIFHWADDR
- /* Get the localhost OS HWADDR (MAC Address) */
- if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
- if (fdebug)
- printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",
- _ifname,get_errno());
- } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/
+ /* Get the localhost OS HWADDR (MAC Address) */
+ if (ioctl (fd, SIOCGIFHWADDR, &ifr) < 0) {
+ if (fdebug)
+ printf ("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",
+ _ifname, get_errno ());
+ }
+ else
+ memcpy (osmymac, get_ifreq_mac (&ifr), MAC_LEN); /*OS mac */
#endif
+ }
+ }
+ close (skfd); /* done, close the socket */
+
+ if (rghostname[0] == 0) { /*hostname not specified */
+ if (!fipmilan)
+ gethostname (rghostname, sizeof (rghostname));
+ }
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf
+ ("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
+ _ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3], rghostname,
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3], osmymac[4],
+ osmymac[5]);
+
+ if (!IpIsValid (rgmyip) && IpIsValid (bmcmyip)) {
+ /* If no user-specified IP and there is a valid IP already in the
+ * BMC LAN configuration, use the existing BMC LAN IP. */
+ memcpy (rgmyip, bmcmyip, 4);
+ if (fdebug)
+ printf ("Using current IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]);
+ }
+
+ /* Get the default gateway MAC */
+ if (lan_ch == gcm_ch) {
+ if (SubnetIsSame (osmyip, rggwyip, ossubnet))
+ fgetmac = 1;
+ else { /* gateway is not on the same subnet as RMM/GCM */
+ fgetmac = 0; /*don't try to get mac if not the same subnet */
+ if ((fset_ip & GWYIP) == 0)
+ memset (rggwyip, 0, 4);
+ }
+ }
+ else
+ fgetmac = 1;
+ if (fgetmac && IpIsValid (rggwyip) && !MacIsValid (rggwymac))
+ Get_Mac (rggwyip, rggwymac, NULL); /*gwy mac not specified, so get mac */
+
+ /* Get the Alert Destination IP */
+ /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */
+ /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */
+ alertname[0] = 0; /* default to null string */
+ fprt = fopen (snmpfile, "r");
+ if (fprt == NULL) {
+ printf ("snmp: Cannot open %s, errno = %d\n", snmpfile, get_errno ());
+ }
+ else {
+ // char snmpfmt[] = "%20s %60s\n";
+ // char *keywd, *value;
+ while (fgets (buff, 1023, fprt)) {
+ /* parse each line */
+ if (buff[0] == '#')
+ continue; /*skip comment lines */
+ /* skip leading whitespace here */
+ j = strspn (&buff[0], " \t");
+ if (strncmp (&buff[j], "com2sec", 7) == 0) { /* found community line */
+ /* usu like this: "com2sec demouser default public" */
+ i = j + 7;
+ for (j = 0; j < 3; j++) {
+ num = strspn (&buff[i], " \t");
+ i += num;
+ num = strcspn (&buff[i], " \t\r\n");
+ if (j < 2)
+ i += num;
}
- }
- close(skfd); /* done, close the socket */
-
- if (rghostname[0] == 0) { /*hostname not specified*/
- if (!fipmilan)
- gethostname(rghostname,sizeof(rghostname));
- }
- if (fdebug) /* show the local OS eth if and MAC */
- printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
- _ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname,
- osmymac[0], osmymac[1], osmymac[2], osmymac[3],
- osmymac[4], osmymac[5]);
-
- if (!IpIsValid(rgmyip) && IpIsValid(bmcmyip)) {
- /* If no user-specified IP and there is a valid IP already in the
- * BMC LAN configuration, use the existing BMC LAN IP. */
- memcpy(rgmyip,bmcmyip,4);
- if (fdebug) printf("Using current IP %d.%d.%d.%d\n",
- bmcmyip[0], bmcmyip[1],
- bmcmyip[2], bmcmyip[3]);
- }
-
- /* Get the default gateway MAC */
- if (lan_ch == gcm_ch) {
- if (SubnetIsSame(osmyip,rggwyip,ossubnet)) fgetmac = 1;
- else { /* gateway is not on the same subnet as RMM/GCM */
- fgetmac = 0; /*don't try to get mac if not the same subnet*/
- if ((fset_ip & GWYIP) == 0) memset(rggwyip,0,4);
- }
- } else fgetmac = 1;
- if (fgetmac && IpIsValid(rggwyip) && !MacIsValid(rggwymac))
- Get_Mac(rggwyip,rggwymac,NULL); /*gwy mac not specified, so get mac*/
-
- /* Get the Alert Destination IP */
- /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */
- /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */
- alertname[0] = 0; /* default to null string */
- fprt = fopen(snmpfile,"r");
- if (fprt == NULL) {
- printf("snmp: Cannot open %s, errno = %d\n",snmpfile,get_errno());
- } else {
- // char snmpfmt[] = "%20s %60s\n";
- // char *keywd, *value;
- while (fgets(buff, 1023, fprt)) {
- /* parse each line */
- if (buff[0] == '#') continue; /*skip comment lines*/
- /* skip leading whitespace here */
- j = strspn(&buff[0]," \t");
- if (strncmp(&buff[j],"com2sec",7) == 0) { /* found community line */
- /* usu like this: "com2sec demouser default public" */
- i = j + 7;
- for (j = 0; j < 3; j++) {
- num = strspn(&buff[i]," \t");
- i += num;
- num = strcspn(&buff[i]," \t\r\n");
- if (j < 2) i += num;
- }
- buff[i+num] = 0;
- if (fsetcommunity == 0) { /* if not user-specified */
- strcpy(rgcommunity,&buff[i]);
- strcpy(defcommunity,&buff[i]);
- }
+ buff[i + num] = 0;
+ if (fsetcommunity == 0) { /* if not user-specified */
+ strcpy (rgcommunity, &buff[i]);
+ strcpy (defcommunity, &buff[i]);
}
+ }
#ifdef BSD
- if (strncmp(&buff[j],"traphost :=",11) == 0) nmatch = 11;
- else nmatch = 0;
+ if (strncmp (&buff[j], "traphost :=", 11) == 0)
+ nmatch = 11;
+ else
+ nmatch = 0;
#else
- if (strncmp(&buff[j],"trapsink",8) == 0) nmatch = 8;
- else if (strncmp(&buff[j],"trap2sink",9) == 0) nmatch = 9;
- else nmatch = 0;
+ if (strncmp (&buff[j], "trapsink", 8) == 0)
+ nmatch = 8;
+ else if (strncmp (&buff[j], "trap2sink", 9) == 0)
+ nmatch = 9;
+ else
+ nmatch = 0;
#endif
- if (nmatch > 0) { /* found trapsink line match */
- if (fdebug) printf("%s: %s",snmpfile,&buff[j]);
- num = strspn(&buff[j+nmatch]," \t");
- i = j + nmatch + num;
- if (buff[i] == '`') continue;
- num = strcspn(&buff[i]," \t\r\n");
- strncpy(alertname,&buff[i],num); /* save alert destination */
- alertname[num] = 0;
- i += num;
- num = strspn(&buff[i]," \t"); /*skip whitespace*/
- i += num;
- num = strcspn(&buff[i]," \t\r\n"); /*span next word*/
- if (num != 0) { /* there is another word, that is community */
- if (fsetcommunity == 0) { /* if not user-specified */
- strncpy(rgcommunity,&buff[i],num); /* save community */
- rgcommunity[num] = 0;
- }
- } else { /*have trapsink node with no community*/
- /* use previously discovered default community from above */
- strcpy(rgcommunity,defcommunity);
- }
- /* dont break, keep looking, use the last one */
+ if (nmatch > 0) { /* found trapsink line match */
+ if (fdebug)
+ printf ("%s: %s", snmpfile, &buff[j]);
+ num = strspn (&buff[j + nmatch], " \t");
+ i = j + nmatch + num;
+ if (buff[i] == '`')
+ continue;
+ num = strcspn (&buff[i], " \t\r\n");
+ strncpy (alertname, &buff[i], num); /* save alert destination */
+ alertname[num] = 0;
+ i += num;
+ num = strspn (&buff[i], " \t"); /*skip whitespace */
+ i += num;
+ num = strcspn (&buff[i], " \t\r\n"); /*span next word */
+ if (num != 0) { /* there is another word, that is community */
+ if (fsetcommunity == 0) { /* if not user-specified */
+ strncpy (rgcommunity, &buff[i], num); /* save community */
+ rgcommunity[num] = 0;
+ }
+ }
+ else { /*have trapsink node with no community */
+ /* use previously discovered default community from above */
+ strcpy (rgcommunity, defcommunity);
}
- } /*end while*/
- fclose(fprt);
- if (fdebug)
- printf("snmp alertname=%s community=%s\n",alertname,rgcommunity);
- } /*end else snmpfile*/
-
- /* Get the Alert Destination MAC from the alertname. */
- if (alertname[0] != 0) {
+ /* dont break, keep looking, use the last one */
+ }
+ } /*end while */
+ fclose (fprt);
+ if (fdebug)
+ printf ("snmp alertname=%s community=%s\n", alertname, rgcommunity);
+ } /*end else snmpfile */
+
+ /* Get the Alert Destination MAC from the alertname. */
+ if (alertname[0] != 0) {
#ifdef TEST
- char arping_cmd[128];
- char *pb, *pm, *px;
- int num, i;
- if (fdebug) printf("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d "
- "mac=%02x:%02x:%02x:%02x:%02x:%02x "
- "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n",
- alertname,
- rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
- osmyip[0], osmyip[1], osmyip[2], osmyip[3],
- rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
- rgdestmac[4], rgdestmac[5],
- osmymac[0], osmymac[1], osmymac[2], osmymac[3],
- osmymac[4], osmymac[5]);
+ char arping_cmd[128];
+ char *pb, *pm, *px;
+ int num, i;
+ if (fdebug)
+ printf ("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d "
+ "mac=%02x:%02x:%02x:%02x:%02x:%02x "
+ "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ alertname,
+ rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
+ osmyip[0], osmyip[1], osmyip[2], osmyip[3],
+ rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
+ rgdestmac[4], rgdestmac[5],
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
#endif
- if (!IpIsValid(rgdestip)) { /* if not user-specified with -A */
- if (IpIsValid(bmcdestip)) { /* use existing if valid */
- memcpy(rgdestip,bmcdestip,4);
- if (MacIsValid(bmcdestmac))
- memcpy(rgdestmac,bmcdestmac,MAC_LEN);
- }
- else if ((strncmp(alertname,"localhost",9) == 0) )
- { /* snmpd.conf = localhost (self) is the SNMP alert destination */
- if (IpIsValid(osmyip))
- memcpy(rgdestip,osmyip,4);
- if (!MacIsValid(rgdestmac)) { /* if not user-specified */
- // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local)
- memcpy(rgdestmac,osmymac,MAC_LEN);
- }
- } /*endif local */
+ if (!IpIsValid (rgdestip)) { /* if not user-specified with -A */
+ if (IpIsValid (bmcdestip)) { /* use existing if valid */
+ memcpy (rgdestip, bmcdestip, 4);
+ if (MacIsValid (bmcdestmac))
+ memcpy (rgdestmac, bmcdestmac, MAC_LEN);
}
- if (!MacIsValid(rgdestmac)) /* if MAC not vaild or user-specified */
- {
- /* Use arping to get MAC from alertname or IP */
- Get_Mac(rgdestip,rgdestmac,alertname);
- }
- } /*endif have alertname*/
-
- return(rc);
-} /* end Get_IPMac_Addr */
+ else if ((strncmp (alertname, "localhost", 9) == 0)) { /* snmpd.conf = localhost (self) is the SNMP alert destination */
+ if (IpIsValid (osmyip))
+ memcpy (rgdestip, osmyip, 4);
+ if (!MacIsValid (rgdestmac)) { /* if not user-specified */
+ // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local)
+ memcpy (rgdestmac, osmymac, MAC_LEN);
+ }
+ } /*endif local */
+ }
+ if (!MacIsValid (rgdestmac)) { /* if MAC not vaild or user-specified */
+ /* Use arping to get MAC from alertname or IP */
+ Get_Mac (rgdestip, rgdestmac, alertname);
+ }
+ } /*endif have alertname */
+
+ return (rc);
+} /* end Get_IPMac_Addr */
#endif
-int ShowChanAcc(uchar bchan)
+int
+ShowChanAcc (uchar bchan)
{
- LAN_RECORD LanRecord;
- int ret = 0;
- uchar access;
- char *pstr;
- uchar pb0, pb1;
-
- if (bchan == lan_ch) pstr = "lan";
- else if (bchan == ser_ch) pstr = "ser";
- else pstr = "?";
- ret = GetChanAcc(bchan, 0x40, &LanRecord);
- if (fdebug)
- printf(" GetChanAcc(%d), ret = %d, data = %02x %02x\n",
- bchan,ret, LanRecord.data[0], LanRecord.data[1]);
- pb0 = LanRecord.data[0];
- pb1 = LanRecord.data[1];
- if (fcanonical)
- printf("Channel %d Access Mode %s%c ",bchan,pspace3,bdelim);
- else
- printf("Channel(%d=%s) Access Mode: %02x %02x : ",bchan,pstr,pb0,pb1);
- access = pb0;
- switch (access & 0x03) {
- case 0: printf("Disabled, "); break;
- case 1: printf("Pre-Boot, "); break;
- case 2: printf("Always Avail, "); break;
- case 3: printf("Shared, "); break;
- }
- if (access & 0x20) printf("PEF Alerts Disabled\n"); /*0*/
- else printf("PEF Alerts Enabled\n"); /*1*/
- return(ret);
+ LAN_RECORD LanRecord;
+ int ret = 0;
+ uchar access;
+ char *pstr;
+ uchar pb0, pb1;
+
+ if (bchan == lan_ch)
+ pstr = "lan";
+ else if (bchan == ser_ch)
+ pstr = "ser";
+ else
+ pstr = "?";
+ ret = GetChanAcc (bchan, 0x40, &LanRecord);
+ if (fdebug)
+ printf (" GetChanAcc(%d), ret = %d, data = %02x %02x\n",
+ bchan, ret, LanRecord.data[0], LanRecord.data[1]);
+ pb0 = LanRecord.data[0];
+ pb1 = LanRecord.data[1];
+ if (fcanonical)
+ printf ("Channel %d Access Mode %s%c ", bchan, pspace3, bdelim);
+ else
+ printf ("Channel(%d=%s) Access Mode: %02x %02x : ", bchan, pstr, pb0,
+ pb1);
+ access = pb0;
+ switch (access & 0x03) {
+ case 0:
+ printf ("Disabled, ");
+ break;
+ case 1:
+ printf ("Pre-Boot, ");
+ break;
+ case 2:
+ printf ("Always Avail, ");
+ break;
+ case 3:
+ printf ("Shared, ");
+ break;
+ }
+ if (access & 0x20)
+ printf ("PEF Alerts Disabled\n"); /*0 */
+ else
+ printf ("PEF Alerts Enabled\n"); /*1 */
+ return (ret);
}
-static int GetSessionInfo(uchar *rData, int sz)
+static int
+GetSessionInfo (uchar * rData, int sz)
{
- int rv, rlen;
- uchar ccode;
- uchar iData[5];
-
- iData[0] = 0x00; /*get data for this session*/
- rlen = sz;
- rv = ipmi_cmdraw(CMD_GET_SESSION_INFO,NETFN_APP, BMC_SA,PUBLIC_BUS,BMC_LUN,
- iData,1,rData, &rlen, &ccode, fdebug);
- if ((rv == 0) && (ccode != 0)) rv = ccode;
- return(rv);
+ int rv, rlen;
+ uchar ccode;
+ uchar iData[5];
+
+ iData[0] = 0x00; /*get data for this session */
+ rlen = sz;
+ rv =
+ ipmi_cmdraw (CMD_GET_SESSION_INFO, NETFN_APP, BMC_SA, PUBLIC_BUS, BMC_LUN,
+ iData, 1, rData, &rlen, &ccode, fdebug);
+ if ((rv == 0) && (ccode != 0))
+ rv = ccode;
+ return (rv);
}
-static int GetPefCapabilities(uchar *bmax)
+static int
+GetPefCapabilities (uchar * bmax)
{
- int rv, rlen;
- uchar ccode;
- uchar rData[MAX_BUFFER_SIZE];
-
- rlen = sizeof(rData);
- rv = ipmi_cmdraw(0x10, NETFN_SEVT, BMC_SA,PUBLIC_BUS,BMC_LUN,
- NULL,0,rData, &rlen, &ccode, fdebug);
- if ((rv == 0) && (ccode != 0)) rv = ccode;
- if ((rv == 0) && (bmax != NULL))
- *bmax = rData[2]; /*max num PEF table entries*/
- return(rv);
+ int rv, rlen;
+ uchar ccode;
+ uchar rData[MAX_BUFFER_SIZE];
+
+ rlen = sizeof (rData);
+ rv = ipmi_cmdraw (0x10, NETFN_SEVT, BMC_SA, PUBLIC_BUS, BMC_LUN,
+ NULL, 0, rData, &rlen, &ccode, fdebug);
+ if ((rv == 0) && (ccode != 0))
+ rv = ccode;
+ if ((rv == 0) && (bmax != NULL))
+ *bmax = rData[2]; /*max num PEF table entries */
+ return (rv);
}
-int GetSerialOverLan( uchar chan, uchar bset, uchar block )
+int
+GetSerialOverLan (uchar chan, uchar bset, uchar block)
{
- uchar requestData[24];
- uchar rData[MAX_BUFFER_SIZE];
- int rlen;
- int status, i;
- uchar ccode;
- uchar enable_parm, auth_parm, baud_parm;
- ushort getsolcmd;
- uchar user;
-
- if (fIPMI20 && fSOL20) {
- getsolcmd = GET_SOL_CONFIG2;
- enable_parm = SOL_ENABLE_PARAM;
- auth_parm = SOL_AUTHENTICATION_PARAM;
- baud_parm = SOL_BAUD_RATE_PARAM;
- } else {
- getsolcmd = GET_SOL_CONFIG;
- enable_parm = SOL_ENABLE_PARAM;
- auth_parm = SOL_AUTHENTICATION_PARAM;
- baud_parm = SOL_BAUD_RATE_PARAM;
- chan = 0; /*override chan for IPMI 1.5*/
+ uchar requestData[24];
+ uchar rData[MAX_BUFFER_SIZE];
+ int rlen;
+ int status, i;
+ uchar ccode;
+ uchar enable_parm, auth_parm, baud_parm;
+ ushort getsolcmd;
+ uchar user;
+
+ if (fIPMI20 && fSOL20) {
+ getsolcmd = GET_SOL_CONFIG2;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ }
+ else {
+ getsolcmd = GET_SOL_CONFIG;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ chan = 0; /*override chan for IPMI 1.5 */
+ }
+ if (!fcanonical)
+ printf ("%s, GetSOL for channel %d ...\n", progname, chan);
+
+ requestData[0] = chan; /*channel */
+ requestData[1] = enable_parm;
+ requestData[2] = bset; /*set */
+ requestData[3] = block; /*block */
+ rlen = sizeof (rData);
+ status = ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ if (ccode == 0xC1) { /* unsupported command */
+ printf ("Serial-Over-Lan not available on this platform\n");
+ return (status);
+ }
+ else {
+ printf ("SOL Enable ccode = %x\n", ccode);
+ status = ccode;
+ }
+ }
+ else { /*success */
+ if (fcanonical) {
+ printf ("Channel %d SOL Enable %s", chan, pspace3);
+ }
+ else {
+ printf ("SOL Enable: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ }
+ if (rData[1] == 0x01)
+ printf ("%c enabled\n", bdelim);
+ else
+ printf ("%c disabled\n", bdelim);
+ }
+
+ if (!fcanonical) {
+ requestData[0] = chan;
+ requestData[1] = auth_parm;
+ requestData[2] = bset; // selector
+ requestData[3] = block; // block
+ rlen = sizeof (rData);
+ status =
+ ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ printf ("SOL Auth ccode = %x\n", ccode);
+ status = ccode;
+ }
+ else { /*success */
+ printf ("SOL Auth: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ printf (": ");
+ show_priv (rData[1]); /* priv level = User,Admin,... */
+ printf ("\n");
+ }
+
+ requestData[0] = chan;
+ requestData[1] = SOL_ACC_INTERVAL_PARAM;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof (rData);
+ status =
+ ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ printf ("SOL Accum Interval ccode = %x\n", ccode);
+ status = ccode;
+ }
+ else { /*success */
+ printf ("SOL Accum Interval: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ printf (": %d msec\n", (rData[1] * 5));
+ }
+
+ requestData[0] = chan;
+ requestData[1] = SOL_RETRY_PARAM;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof (rData);
+ status =
+ ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ printf ("SOL Retry ccode = %x\n", ccode);
+ status = ccode;
+ }
+ else { /*success */
+ printf ("SOL Retry Interval: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ printf (": %d msec\n", (rData[2] * 10));
+ }
+ }
+
+ if (!fRomley) {
+ requestData[0] = chan;
+ requestData[1] = baud_parm;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof (rData);
+ status =
+ ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ printf ("SOL nvol Baud ccode = %x\n", ccode);
+ status = ccode;
+ }
+ else { /*success */
+ uchar b;
+ if (fcanonical) {
+ printf ("Channel %d SOL Baud Rate%s", chan, pspace3);
+ }
+ else {
+ printf ("SOL nvol Baud Rate: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ }
+ /* if not user-specified and previously enabled, use existing */
+ b = (rData[1] & 0x0f);
+ if ((fnewbaud == 0) && BaudValid (b)) {
+ sol_baud = b;
+ sol_bvalid = 1;
+ }
+ printf ("%c %s\n", bdelim, Baud2Str (b));
+ }
+
+ if (!fcanonical) {
+ requestData[0] = chan;
+ requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06 */
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof (rData);
+ status =
+ ipmi_cmd (getsolcmd, requestData, 4, rData, &rlen, &ccode, fdebug);
+ if (status != 0)
+ return (status);
+ if (ccode) {
+ printf ("SOL vol Baud ccode = %x\n", ccode);
+ status = ccode;
+ }
+ else { /*success */
+ printf ("SOL vol Baud Rate: ");
+ for (i = 1; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ printf ("%c %s\n", bdelim, Baud2Str (rData[1]));
+ }
+ }
+ }
+ if (fIPMI20) {
+ if (vend_id != VENDOR_IBM) {
+ /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */
+ if (!fcanonical) {
+ requestData[0] = chan;
+ rlen = sizeof (rData);
+ status = ipmi_cmdraw (GET_PAYLOAD_SUPPORT, NETFN_APP,
+ BMC_SA, PUBLIC_BUS, BMC_LUN,
+ requestData, 1, rData, &rlen, &ccode, fdebug);
+ if ((status != 0) || (ccode != 0)) {
+ printf ("SOL Payload Support error %d, ccode = %x\n", status,
+ ccode);
+ if (status == 0)
+ status = ccode;
}
- if (!fcanonical)
- printf("%s, GetSOL for channel %d ...\n",progname,chan);
-
- requestData[0] = chan; /*channel*/
- requestData[1] = enable_parm;
- requestData[2] = bset; /*set*/
- requestData[3] = block; /*block*/
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd, requestData,4, rData, &rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- if (ccode == 0xC1) { /* unsupported command */
- printf("Serial-Over-Lan not available on this platform\n");
- return(status);
- } else {
- printf("SOL Enable ccode = %x\n",ccode);
- status = ccode;
- }
- } else { /*success*/
- if (fcanonical) {
- printf("Channel %d SOL Enable %s",chan,pspace3);
- } else {
- printf("SOL Enable: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- }
- if (rData[1] == 0x01) printf("%c enabled\n",bdelim);
- else printf("%c disabled\n",bdelim);
+ else { /*success */
+ printf ("SOL Payload Support(%d): ", chan);
+ for (i = 0; i < rlen; i++)
+ printf ("%02x ", rData[i]);
+ printf ("\n");
}
-
- if (!fcanonical)
- {
- requestData[0] = chan;
- requestData[1] = auth_parm;
- requestData[2] = bset; // selector
- requestData[3] = block; // block
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- printf("SOL Auth ccode = %x\n",ccode);
- status = ccode;
- } else { /*success*/
- printf("SOL Auth: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- printf(": ");
- show_priv(rData[1]); /* priv level = User,Admin,... */
- printf("\n");
+ } /*endif not canonical */
+ /* get Payload Access for 4 users, not just lan_user */
+ for (user = 1; user <= show_users; user++) {
+ /* mBMC doesn't support more than 1 user */
+ if (fmBMC && (user > 1))
+ break;
+ /* IPMI 2.0 has >= 4 users */
+ requestData[0] = chan;
+ requestData[1] = user;
+ rlen = sizeof (rData);
+ status = ipmi_cmdraw (GET_PAYLOAD_ACCESS, NETFN_APP,
+ BMC_SA, PUBLIC_BUS, BMC_LUN,
+ requestData, 2, rData, &rlen, &ccode, fdebug);
+ if ((status != 0) || (ccode != 0)) {
+ printf ("SOL Payload Access(%d,%d) error %d, ccode = %x\n",
+ chan, user, status, ccode);
+ if (status == 0)
+ status = ccode;
+ }
+ else { /*success */
+ if (fcanonical) {
+ printf ("Channel %d SOL Payload Access(user%d)%s", chan, user,
+ pspace1);
}
-
- requestData[0] = chan;
- requestData[1] = SOL_ACC_INTERVAL_PARAM;
- requestData[2] = bset;
- requestData[3] = block;
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- printf("SOL Accum Interval ccode = %x\n",ccode);
- status = ccode;
- } else { /*success*/
- printf("SOL Accum Interval: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- printf(": %d msec\n",(rData[1] * 5));
- }
-
- requestData[0] = chan;
- requestData[1] = SOL_RETRY_PARAM;
- requestData[2] = bset;
- requestData[3] = block;
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- printf("SOL Retry ccode = %x\n",ccode);
- status = ccode;
- } else { /*success*/
- printf("SOL Retry Interval: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- printf(": %d msec\n",(rData[2] * 10));
- }
- }
-
- if (!fRomley)
- {
- requestData[0] = chan;
- requestData[1] = baud_parm;
- requestData[2] = bset;
- requestData[3] = block;
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd,requestData,4,rData, &rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- printf("SOL nvol Baud ccode = %x\n",ccode);
- status = ccode;
- } else { /*success*/
- uchar b;
- if (fcanonical) {
- printf("Channel %d SOL Baud Rate%s",chan,pspace3);
- } else {
- printf("SOL nvol Baud Rate: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- }
- /* if not user-specified and previously enabled, use existing */
- b = (rData[1] & 0x0f);
- if ((fnewbaud == 0) && BaudValid(b)) {
- sol_baud = b;
- sol_bvalid = 1;
- }
- printf("%c %s\n",bdelim,Baud2Str(b));
- }
-
- if (!fcanonical)
- {
- requestData[0] = chan;
- requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06*/
- requestData[2] = bset;
- requestData[3] = block;
- rlen = sizeof(rData);
- status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
- if (status != 0) return(status);
- if (ccode) {
- printf("SOL vol Baud ccode = %x\n",ccode);
- status = ccode;
- } else { /*success*/
- printf("SOL vol Baud Rate: ");
- for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
- printf("%c %s\n",bdelim,Baud2Str(rData[1]));
- }
+ else {
+ printf ("SOL Payload Access(%d,%d): ", chan, user);
+ for (i = 0; i < rlen; i++)
+ printf ("%02x ", rData[i]);
}
+ if ((rData[0] & 0x02) != 0)
+ printf ("%c enabled\n", bdelim);
+ else
+ printf ("%c disabled\n", bdelim);
}
- if (fIPMI20) {
- if (vend_id != VENDOR_IBM) {
- /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */
- if (!fcanonical) {
- requestData[0] = chan;
- rlen = sizeof(rData);
- status = ipmi_cmdraw(GET_PAYLOAD_SUPPORT, NETFN_APP,
- BMC_SA,PUBLIC_BUS,BMC_LUN,
- requestData,1,rData, &rlen, &ccode, fdebug);
- if ((status != 0) || (ccode != 0)) {
- printf("SOL Payload Support error %d, ccode = %x\n",status,ccode);
- if (status == 0) status = ccode;
- } else { /*success*/
- printf("SOL Payload Support(%d): ",chan);
- for (i = 0; i < rlen; i++) printf("%02x ",rData[i]);
- printf("\n");
- }
- } /*endif not canonical*/
- /* get Payload Access for 4 users, not just lan_user */
- for (user = 1; user <= show_users; user++)
- {
- /* mBMC doesn't support more than 1 user */
- if (fmBMC && (user > 1)) break;
- /* IPMI 2.0 has >= 4 users */
- requestData[0] = chan;
- requestData[1] = user;
- rlen = sizeof(rData);
- status = ipmi_cmdraw(GET_PAYLOAD_ACCESS, NETFN_APP,
- BMC_SA,PUBLIC_BUS,BMC_LUN,
- requestData,2,rData, &rlen, &ccode, fdebug);
- if ((status != 0) || (ccode != 0)) {
- printf("SOL Payload Access(%d,%d) error %d, ccode = %x\n",
- chan,user,status,ccode);
- if (status == 0) status = ccode;
- } else { /*success*/
- if (fcanonical) {
- printf("Channel %d SOL Payload Access(user%d)%s",chan,user,
- pspace1);
- } else {
- printf("SOL Payload Access(%d,%d): ",chan,user);
- for (i = 0; i < rlen; i++) printf("%02x ",rData[i]);
- }
- if ((rData[0] & 0x02) != 0) printf("%c enabled\n",bdelim);
- else printf("%c disabled\n",bdelim);
- }
- } /*end user loop*/
- } /*endif not IBM*/
- }
-
- return(status);
-} /*end GetSerialOverLan */
+ } /*end user loop */
+ } /*endif not IBM */
+ }
+
+ return (status);
+} /*end GetSerialOverLan */
/*
ECHO SOL Config Enable
@@ -3413,1784 +3775,2277 @@ CMDTOOL 20 30 21 %1 06 07
ECHO Set user Payload Access for user 1
CMDTOOL 20 18 4c %1 01 02 00 00 00
*/
-int SetupSerialOverLan( int benable )
+int
+SetupSerialOverLan (int benable)
{
- uchar requestData[24];
- uchar responseData[MAX_BUFFER_SIZE];
- int responseLength = MAX_BUFFER_SIZE;
- int status;
- uchar completionCode;
- uchar enable_parm, auth_parm, baud_parm;
- ushort setsolcmd;
- ushort getsolcmd;
- uchar bchan, b;
-
- if (fIPMI20 && fSOL20) {
- setsolcmd = SET_SOL_CONFIG2;
- getsolcmd = GET_SOL_CONFIG2;
- enable_parm = SOL_ENABLE_PARAM;
- auth_parm = SOL_AUTHENTICATION_PARAM;
- baud_parm = SOL_BAUD_RATE_PARAM;
- bchan = lan_ch;
- } else {
- setsolcmd = SET_SOL_CONFIG;
- getsolcmd = GET_SOL_CONFIG;
- enable_parm = SOL_ENABLE_PARAM;
- auth_parm = SOL_AUTHENTICATION_PARAM;
- baud_parm = SOL_BAUD_RATE_PARAM;
- bchan = 0x00; /*override chan for IPMI 1.5*/
+ uchar requestData[24];
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar enable_parm, auth_parm, baud_parm;
+ ushort setsolcmd;
+ ushort getsolcmd;
+ uchar bchan, b;
+
+ if (fIPMI20 && fSOL20) {
+ setsolcmd = SET_SOL_CONFIG2;
+ getsolcmd = GET_SOL_CONFIG2;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ bchan = lan_ch;
+ }
+ else {
+ setsolcmd = SET_SOL_CONFIG;
+ getsolcmd = GET_SOL_CONFIG;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ bchan = 0x00; /*override chan for IPMI 1.5 */
+ }
+ memset (requestData, 0, sizeof (requestData)); /* zero-fill */
+ requestData[0] = bchan;
+ requestData[1] = enable_parm;
+ if (benable == 0)
+ requestData[2] = SOL_DISABLE_FLAG;
+ else
+ requestData[2] = SOL_ENABLE_FLAG;
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (setsolcmd, requestData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ switch (completionCode) {
+ case 0x00: /* success */
+ break;
+ case 0xC1: /* unsupported command */
+ SELprintf ("SetupSerialOverLan: SOL not available on this platform\n");
+ return 0;
+ default: /* other error */
+ SELprintf ("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n",
+ completionCode);
+ return -1;
+ break;
+ }
+ }
+ else {
+ SELprintf ("SET_SOL_CONFIG, enable SOL failed\n");
+ return -1;
+ }
+ if (benable == 0)
+ return 0;
+
+ requestData[0] = bchan; /* channel */
+ requestData[1] = auth_parm;
+ requestData[2] = 0x00; /* set selector */
+ requestData[3] = 0x00; /* block selector */
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (getsolcmd, requestData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ SELprintf ("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n",
+ completionCode);
+
+ return -1;
+ }
+ }
+ else {
+ SELprintf ("SOL_CONFIG, get SOL authentication failed\n");
+ return -1;
+ }
+
+ if ((vend_id == VENDOR_SUPERMICROX) || (vend_id == VENDOR_SUPERMICRO))
+ b = SOL_PRIVILEGE_LEVEL_OPERATOR;
+ else
+ b = SOL_PRIVILEGE_LEVEL_USER;
+ requestData[0] = bchan;
+ requestData[1] = auth_parm;
+ requestData[2] = b | (responseData[1] & 0x80); /* priv | enable */
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd (setsolcmd, requestData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ if (completionCode) {
+ SELprintf ("SET_SOL_AUTHENTICATION_PARAM code=%x\n", completionCode);
+
+ return -1;
+ }
+ }
+ else {
+ SELprintf ("SET_SOL_CONFIG, set SOL authentication failed\n");
+ return -1;
+ }
+
+ requestData[0] = bchan;
+ requestData[1] = SOL_ACC_INTERVAL_PARAM;
+ requestData[2] = sol_accum[0]; //0x04;
+ requestData[3] = sol_accum[1]; //0x32;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug)
+ SELprintf ("Setting SOL AccumInterval\n");
+ status = ipmi_cmd (setsolcmd, requestData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf ("SET SOL AccumInterval ret=%d ccode=%x\n",
+ status, completionCode);
+ return -1;
+ }
+
+ /* Some BMCs return sporadic errors for SOL params (e.g. Kontron) */
+ // if (vend_id == VENDOR_KONTRON) ;
+ // else
+ {
+ requestData[0] = bchan;
+ requestData[1] = SOL_RETRY_PARAM;
+ requestData[2] = sol_retry[0]; //0x06;
+ requestData[3] = sol_retry[1]; //0x14;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug)
+ SELprintf ("Setting SOL RetryInterval\n");
+ status = ipmi_cmd (setsolcmd, requestData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf ("SET SOL RetryInterval ret=%d ccode=%x\n",
+ status, completionCode);
+ return -1;
+ }
+ }
+
+ if (fRomley); /* skip SOL BAUD */
+ else { /* else SOL BAUD is used, so set it. */
+ if (fnewbaud == 0) { /* no user-specified SOL baud */
+ /* if sol_bvalid, sol_baud was set to existing value above */
+ if (!sol_bvalid) {
+ status = GetSerEntry (7, (LAN_RECORD *) & responseData);
+ if (status == 0) { /* use Serial baud for SOL */
+ sol_baud = responseData[1];
+ if (fdebug)
+ SELprintf ("Serial Baud is %s\n", Baud2Str (sol_baud));
}
- memset(requestData, 0, sizeof(requestData)); /* zero-fill */
- requestData[0] = bchan;
- requestData[1] = enable_parm;
- if (benable == 0)
- requestData[2] = SOL_DISABLE_FLAG;
- else
- requestData[2] = SOL_ENABLE_FLAG;
- responseLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(setsolcmd, requestData,3,responseData,
- &responseLength, &completionCode, fdebug);
- if (status == ACCESS_OK) {
- switch( completionCode ) {
- case 0x00: /* success */
- break;
- case 0xC1: /* unsupported command */
- SELprintf("SetupSerialOverLan: SOL not available on this platform\n");
- return 0;
- default: /* other error */
- SELprintf("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n",
- completionCode);
- return -1;
- break;
- }
- } else {
- SELprintf( "SET_SOL_CONFIG, enable SOL failed\n" );
- return -1;
- }
- if (benable == 0) return 0;
-
- requestData[0] = bchan; /* channel */
- requestData[1] = auth_parm;
- requestData[2] = 0x00; /* set selector */
- requestData[3] = 0x00; /* block selector */
- responseLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(getsolcmd, requestData,4,responseData,
- &responseLength, &completionCode, fdebug);
- if (status == ACCESS_OK) {
- if( completionCode ) {
- SELprintf("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n",
- completionCode);
-
- return -1;
- }
- } else {
- SELprintf( "SOL_CONFIG, get SOL authentication failed\n" );
- return -1;
- }
-
- if ((vend_id == VENDOR_SUPERMICROX) ||
- (vend_id == VENDOR_SUPERMICRO)) b = SOL_PRIVILEGE_LEVEL_OPERATOR;
- else b = SOL_PRIVILEGE_LEVEL_USER;
- requestData[0] = bchan;
- requestData[1] = auth_parm;
- requestData[2] = b | ( responseData[1] & 0x80 ); /* priv | enable */
- responseLength = MAX_BUFFER_SIZE;
- status = ipmi_cmd(setsolcmd, requestData,3,responseData,
- &responseLength, &completionCode, fdebug);
- if (status == ACCESS_OK) {
- if( completionCode ) {
- SELprintf("SET_SOL_AUTHENTICATION_PARAM code=%x\n",
- completionCode);
-
- return -1;
- }
- } else {
- SELprintf( "SET_SOL_CONFIG, set SOL authentication failed\n" );
- return -1;
- }
-
- requestData[0] = bchan;
- requestData[1] = SOL_ACC_INTERVAL_PARAM;
- requestData[2] = sol_accum[0]; //0x04;
- requestData[3] = sol_accum[1]; //0x32;
- responseLength = MAX_BUFFER_SIZE;
- if (fdebug) SELprintf("Setting SOL AccumInterval\n");
- status = ipmi_cmd(setsolcmd, requestData,4,responseData,
- &responseLength, &completionCode, fdebug);
- if (status != ACCESS_OK || completionCode) {
- SELprintf("SET SOL AccumInterval ret=%d ccode=%x\n",
- status,completionCode);
- return -1;
- }
-
- /* Some BMCs return sporadic errors for SOL params (e.g. Kontron)*/
- // if (vend_id == VENDOR_KONTRON) ;
- // else
- {
- requestData[0] = bchan;
- requestData[1] = SOL_RETRY_PARAM;
- requestData[2] = sol_retry[0]; //0x06;
- requestData[3] = sol_retry[1]; //0x14;
- responseLength = MAX_BUFFER_SIZE;
- if (fdebug) SELprintf("Setting SOL RetryInterval\n");
- status = ipmi_cmd(setsolcmd, requestData,4,responseData,
- &responseLength, &completionCode, fdebug);
- if (status != ACCESS_OK || completionCode) {
- SELprintf("SET SOL RetryInterval ret=%d ccode=%x\n",
- status,completionCode);
- return -1;
- }
- }
-
- if (fRomley) ; /* skip SOL BAUD */
- else { /* else SOL BAUD is used, so set it. */
- if (fnewbaud == 0) { /* no user-specified SOL baud */
- /* if sol_bvalid, sol_baud was set to existing value above */
- if (!sol_bvalid) {
- status = GetSerEntry(7, (LAN_RECORD *)&responseData);
- if (status == 0) { /* use Serial baud for SOL */
- sol_baud = responseData[1];
- if (fdebug) SELprintf("Serial Baud is %s\n",Baud2Str(sol_baud));
- }
- }
- }
- requestData[0] = bchan;
- requestData[1] = baud_parm;
- requestData[2] = sol_baud;
- responseLength = MAX_BUFFER_SIZE;
- if (fdebug) SELprintf("Setting SOL BAUD to %s\n",Baud2Str(sol_baud));
- status = ipmi_cmd(setsolcmd, requestData,3,responseData,
- &responseLength, &completionCode, fdebug);
- if (status != ACCESS_OK || completionCode) {
- SELprintf("SET SOL BAUD ret=%d ccode=%x\n", status,completionCode);
- return -1;
- }
-
- requestData[0] = bchan;
- requestData[1] = SOL_VOL_BAUD_RATE_PARAM;
- requestData[2] = sol_baud;
- responseLength = MAX_BUFFER_SIZE;
- if (fdebug)
- printf("Setting SOL vol BAUD to %s\n",Baud2Str(sol_baud));
- status = ipmi_cmd(setsolcmd, requestData,3,responseData,
- &responseLength, &completionCode, fdebug);
- if (status != ACCESS_OK || completionCode) {
- printf("SET SOL vol BAUD ret=%d ccode=%x\n",status,completionCode);
- return -1;
- }
- }
-
- if (fIPMI20 && fSOL20) {
- if (vend_id == VENDOR_KONTRON && lan_user == 1) {
- if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n",
- lan_user);
- } else if (vend_id == VENDOR_IBM) { /*non-conformance*/
- if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n",
- lan_user);
- } else {
- if (fdebug) SELprintf("Setting SOL Payload Access for user %d\n",
- lan_user);
- requestData[0] = bchan;
- requestData[1] = lan_user; /*enable this user*/
- requestData[2] = 0x02; /*enable std 2.0 SOL*/
- requestData[3] = 0;
- requestData[4] = 0;
- requestData[5] = 0;
- responseLength = MAX_BUFFER_SIZE;
- status = ipmi_cmdraw(SET_PAYLOAD_ACCESS, NETFN_APP,
- BMC_SA,PUBLIC_BUS,BMC_LUN,
- requestData,6,responseData, &responseLength,
- &completionCode, fdebug);
- if (status != ACCESS_OK || completionCode) {
- SELprintf("SET SOL Payload Access ret=%d ccode=%x\n",
- status,completionCode);
- return -1;
- }
- }
- }
- return 0;
-} /*end SetupSerialOverLan */
+ }
+ }
+ requestData[0] = bchan;
+ requestData[1] = baud_parm;
+ requestData[2] = sol_baud;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug)
+ SELprintf ("Setting SOL BAUD to %s\n", Baud2Str (sol_baud));
+ status = ipmi_cmd (setsolcmd, requestData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf ("SET SOL BAUD ret=%d ccode=%x\n", status, completionCode);
+ return -1;
+ }
+
+ requestData[0] = bchan;
+ requestData[1] = SOL_VOL_BAUD_RATE_PARAM;
+ requestData[2] = sol_baud;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug)
+ printf ("Setting SOL vol BAUD to %s\n", Baud2Str (sol_baud));
+ status = ipmi_cmd (setsolcmd, requestData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ printf ("SET SOL vol BAUD ret=%d ccode=%x\n", status, completionCode);
+ return -1;
+ }
+ }
+
+ if (fIPMI20 && fSOL20) {
+ if (vend_id == VENDOR_KONTRON && lan_user == 1) {
+ if (fdebug)
+ SELprintf ("Skipping SOL Payload Access for user %d\n", lan_user);
+ }
+ else if (vend_id == VENDOR_IBM) { /*non-conformance */
+ if (fdebug)
+ SELprintf ("Skipping SOL Payload Access for user %d\n", lan_user);
+ }
+ else {
+ if (fdebug)
+ SELprintf ("Setting SOL Payload Access for user %d\n", lan_user);
+ requestData[0] = bchan;
+ requestData[1] = lan_user; /*enable this user */
+ requestData[2] = 0x02; /*enable std 2.0 SOL */
+ requestData[3] = 0;
+ requestData[4] = 0;
+ requestData[5] = 0;
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmdraw (SET_PAYLOAD_ACCESS, NETFN_APP,
+ BMC_SA, PUBLIC_BUS, BMC_LUN,
+ requestData, 6, responseData, &responseLength,
+ &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf ("SET SOL Payload Access ret=%d ccode=%x\n",
+ status, completionCode);
+ return -1;
+ }
+ }
+ }
+ return 0;
+} /*end SetupSerialOverLan */
-static char *PefDesc(int idx, uchar stype)
+static char *
+PefDesc (int idx, uchar stype)
{
- char *pdesc, *p;
- static char mystr[60];
- int mylen = sizeof(mystr);
- pdesc = &mystr[0];
- if (pefdesc != NULL) strcpy(pdesc,pefdesc[idx]); /* if Intel, pre-defined */
- else strcpy(pdesc,"reserved"); /* else set default to detect */
- if ((stype != 0) && (strcmp(pdesc,"reserved") == 0)) {
- /* Dynamically set the pef desc string from the sensor type */
- switch(stype) {
- case 0x01: strcpy(pdesc,"Temperature"); break;
- case 0x02: strcpy(pdesc,"Voltage"); break;
- case 0x04: strcpy(pdesc,"Fan"); break;
- case 0x05: strcpy(pdesc,"Chassis"); break;
- case 0x07: strcpy(pdesc,"BIOS"); break;
- case 0x08: strcpy(pdesc,"Power Supply"); break;
- case 0x09: strcpy(pdesc,"Power Unit"); break;
- case 0x0c: strcpy(pdesc,"Memory"); break;
- case 0x0f: strcpy(pdesc,"Boot"); break;
- case 0x12: strcpy(pdesc,"System Restart"); break;
- case 0x13: strcpy(pdesc,"NMI"); break;
- case 0x23: strcpy(pdesc,"Watchdog"); break;
- case 0x20: strcpy(pdesc,"OS Critical Stop"); break;
- default:
+ char *pdesc, *p;
+ static char mystr[60];
+ int mylen = sizeof (mystr);
+ pdesc = &mystr[0];
+ if (pefdesc != NULL)
+ strcpy (pdesc, pefdesc[idx]); /* if Intel, pre-defined */
+ else
+ strcpy (pdesc, "reserved"); /* else set default to detect */
+ if ((stype != 0) && (strcmp (pdesc, "reserved") == 0)) {
+ /* Dynamically set the pef desc string from the sensor type */
+ switch (stype) {
+ case 0x01:
+ strcpy (pdesc, "Temperature");
+ break;
+ case 0x02:
+ strcpy (pdesc, "Voltage");
+ break;
+ case 0x04:
+ strcpy (pdesc, "Fan");
+ break;
+ case 0x05:
+ strcpy (pdesc, "Chassis");
+ break;
+ case 0x07:
+ strcpy (pdesc, "BIOS");
+ break;
+ case 0x08:
+ strcpy (pdesc, "Power Supply");
+ break;
+ case 0x09:
+ strcpy (pdesc, "Power Unit");
+ break;
+ case 0x0c:
+ strcpy (pdesc, "Memory");
+ break;
+ case 0x0f:
+ strcpy (pdesc, "Boot");
+ break;
+ case 0x12:
+ strcpy (pdesc, "System Restart");
+ break;
+ case 0x13:
+ strcpy (pdesc, "NMI");
+ break;
+ case 0x23:
+ strcpy (pdesc, "Watchdog");
+ break;
+ case 0x20:
+ strcpy (pdesc, "OS Critical Stop");
+ break;
+ default:
#ifdef METACOMMAND
- p = get_sensor_type_desc(stype);
- if (p != NULL) {
- strncpy(pdesc,p,mylen);
- mystr[mylen-1] = 0; /*stringify*/
- }
+ p = get_sensor_type_desc (stype);
+ if (p != NULL) {
+ strncpy (pdesc, p, mylen);
+ mystr[mylen - 1] = 0; /*stringify */
+ }
#else
- sprintf(pdesc,"Other[%02x]",stype);
+ sprintf (pdesc, "Other[%02x]", stype);
#endif
- break;
- }
- if (pef_array[idx-1][4] == PEF_SEV_OK) strcat(pdesc," OK");
- }
- return(pdesc);
+ break;
+ }
+ if (pef_array[idx - 1][4] == PEF_SEV_OK)
+ strcat (pdesc, " OK");
+ }
+ return (pdesc);
}
#ifdef METACOMMAND
-int i_lan(int argc, char **argv)
+int
+i_lan (int argc, char **argv)
#else
#ifdef WIN32
int __cdecl
#else
int
#endif
-main(int argc, char **argv)
+main (int argc, char **argv)
#endif
{
- int ret;
- PEF_RECORD PefRecord;
- LAN_RECORD LanRecord;
- int i, idx, j;
- int c;
- char *pstr;
- uchar bset;
- int ndest = 4;
- int idest;
- char mystr[80];
- char fpefok = 1;
- uchar * pc; int sz;
- char *pa;
- char *pb;
-
- // progname = argv[0];
- printf("%s ver %s \n",progname,progver);
- j = 0; freadonly = FLAG_INIT;
- idx = argc; /*getopt loop counter*/
- /* available opt chars: y O Q + = ~ _ */
- while ((c = getopt(argc, argv,"a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?")) != EOF) {
- switch(c) {
- case 'a': /* alert dest number (usu 1 thru 4) */
- alertnum = atob(optarg);
- if (alertnum > alertmax) alertnum = 1;
- j++;
- break;
- case 'b': bAuth = htoi(optarg); j++; break; /*undocumented*/
- case 'c': fcanonical = 1; bdelim = BDELIM; break;
- case 'd': fenable = 0; fdisable = 1; freadonly = 0; break;
- case 'e': fenable = 1; fdisable = 0; freadonly = 0; break;
- case 'f': i = atoi(optarg); /*set arp_ctl*/
- if (i < 0 || i > 3) printf("Invalid ARP control %d\n",i);
- else {
- arp_ctl = i;
- fsetarp = 1;
- j++;
- }
- break;
- case 'l': fpefenable = 0; fenable = 2;
- fdisable = 0; freadonly = 0; break;
- case 'h': /* VLAN ID */
- i = atoi(optarg);
- if (i > 4095) vlan_enable = 0;
- else {
- vlan_enable = 1;
- vlan_id = (ushort)i;
- }
- j++;
- break;
- case 'y': /* OEM LAN Failover enable/disable */
- i = atoi(optarg);
- if (i < 0) printf("Failover(-y) parameter is negative\n");
- else failover_enable = i;
- j++;
- break;
- case 'Q': /* VLAN Priority */
- i = atoi(optarg);
- if (i > 7 || i < 0) vlan_enable = 0;
- else {
- vlan_enable = 1;
- vlan_prio = (uchar)i;
- }
- j++;
- break;
- case 'i': /* eth interface (ifname) */
- fsetifn = 1;
- i = sizeof(ifname);
- if (strlen(optarg) > (uint)i) optarg[i] = 0;
- strcpy(ifname,optarg);
- if (fdebug) printf("ifname = %s\n",ifname);
- j++;
- break;
- case 'j': fCustomPEF = 1; /*custom 10 PEF bytes */
- fpefenable = 1; /* PEF is implied here */
- freadonly = 0;
- memset(custPEF,0,sizeof(custPEF));
- custPEF[0] = htoi(&optarg[0]); /*action */
- custPEF[1] = htoi(&optarg[2]); /*policy */
- custPEF[2] = htoi(&optarg[4]); /*severity*/
- custPEF[3] = htoi(&optarg[6]); /*genid1 */
- custPEF[4] = htoi(&optarg[8]); /*genid2 */
- custPEF[5] = htoi(&optarg[10]); /*sensor_type*/
- custPEF[6] = htoi(&optarg[12]); /*sensor_num */
- custPEF[7] = htoi(&optarg[14]); /*evt_trigger*/
- custPEF[8] = htoi(&optarg[16]); /*data1offset*/
- custPEF[9] = htoi(&optarg[18]); /*data1mask */
- if (optarg[20] != 0) {
- /* optionally get 8 extra PEF entry bytes */
- custPEF[10] = htoi(&optarg[20]); /*data1cmp1 */
- custPEF[11] = htoi(&optarg[22]); /*data1cmp2 */
- custPEF[12] = htoi(&optarg[24]); /*data2mask */
- custPEF[13] = htoi(&optarg[26]); /*data2cmp1 */
- custPEF[14] = htoi(&optarg[28]); /*data2cmp2 */
- custPEF[15] = htoi(&optarg[30]); /*data3mask */
- custPEF[16] = htoi(&optarg[32]); /*data3cmp1 */
- custPEF[17] = htoi(&optarg[34]); /*data3cmp2 */
- }
- j++;
- break;
- case 'k': fSetPEFOks = 1; j++; break; /*configure PEF OK rules */
- case 'm': set_max_kcs_loops(atoi(optarg)); break;
- case 'n': /* number/index in PEF table to insert new entry */
- fpefenable = 1;
- pefnum = atob(optarg);
- if (pefnum >= MAXPEF) {
- pefnum = MAXPEF - 1;
- fAdjustPefNum = 1;
- } else fUserPefNum = 1;
- j++;
- break;
- case 'o': fdisableSOL = 1; /*disable SOL only*/
- fpefenable = 0; /*no change to PEF*/
- freadonly = 0;
- break;
- case 'r': freadonly = 1; fenable = 0; break;
- case 's': fgetser = 1; break;
- case 't': ftestonly = 1; freadonly = 1; break;
- case 'v': /* user access privilege level */
- i = atoi(optarg);
- if (valid_priv(i)) lan_access = i & 0x0f;
- else printf("Invalid privilege -v %d, using Admin\n",i);
- j++;
- break;
- case 'w': i = atoi(optarg); /*set grat arp interval, in #sec*/
- if (i >= 0 && i < 256) arp_interval = i * 2;
- else printf("Invalid arp interval -w %d, skipping\n",i);
- break;
- case 'x': fdebug = 1; break;
- case 'z': flanstats = 1; break;
- case 'D': lan_dhcp = 1; j++; break;
- case 'O': flansecure = 1; j++; break;
- case 'I': /* My BMC IP Address */
- fset_ip |= MYIP;
- atoip(rgmyip,optarg);
- j++;
- break;
- case 'M': /* My BMC MAC Address */
- atomac(rgmymac,optarg);
- if (!MacIsValid(rgmymac)) printf("Invalid MAC for -M\n");
- j++;
- break;
- case 'S': /* Subnet IP Address */
- atoip(rgsubnet,optarg);
- j++;
- break;
- case 'G': /* Gateway IP Address */
- fset_ip |= GWYIP;
- atoip(rggwyip,optarg);
- j++;
- break;
- case 'g': /* Secondary Gateway IP Address */
- fset_ip |= GWYIP;
- atoip(rggwy2ip,optarg);
- j++;
- break;
- case 'H': /* Gateway MAC Address */
- atomac(rggwymac,optarg);
- if (!MacIsValid(rggwymac)) printf("Invalid MAC for -H\n");
- j++;
- break;
- case 'B': /* SOL Baud rate */
- fnewbaud = 1;
- sol_baud = Str2Baud(optarg);
- j++;
- break;
- case 'A': /* Alert Dest IP Address */
- fset_ip |= DESTIP;
- /* allow name or ip here via Get_Mac() ? */
- atoip(rgdestip,optarg);
- fpefenable = 1; /* PEF is implied here */
- j++;
- break;
- case 'X': /* Alert Dest MAC Address */
- atomac(rgdestmac,optarg);
- if (!MacIsValid(rgdestmac)) printf("Invalid MAC for -X\n");
- fpefenable = 1; /* PEF is implied here */
- j++;
- break;
- case 'K': /* Kontron IPMI hostname */
- i = sizeof(rghostname); /*usu 18*/
- if (strlen(optarg) > (uint)i) optarg[i] = 0;
- strcpy(rghostname,optarg);
- j++;
- break;
- case 'C': /* Community String */
- fsetcommunity = 1;
- i = sizeof(rgcommunity); /*usu 18*/
- if (strlen(optarg) > (uint)i) optarg[i] = 0;
- strcpy(rgcommunity,optarg);
- fpefenable = 1; /* PEF is implied here */
- j++;
- break;
- case 'u': /* username to set */
- myuser = strdup_(optarg); /*remote username */
- j++;
- break;
- case 'p': /* password to set */
- fpassword = 1;
- if (strlen(optarg) > PSW_MAX) optarg[PSW_MAX] = 0;
- strcpy(passwordData,optarg);
- if (fdebug) printf("Password = %s\n",passwordData);
- /* Hide password from 'ps' */
- memset(optarg, ' ', strlen(optarg));
- j++;
- break;
- case 'q':
- case '#':
- usernum = atob(optarg);
- if (usernum > 15) usernum = 0; /*MAX_IPMI_USERS = 15*/
- j++;
- break;
- case 'L':
- if (strcmp(optarg,"list") == 0) fshowchan = 1;
- lan_ch_parm = atob(optarg);
- if (lan_ch_parm > MAXCHAN) lan_ch_parm = PARM_INIT; /*invalid*/
- break;
- case 'V': /* priv level */
- fprivset = 1;
- case 'N': /* nodename */
- case 'U': /* remote username */
- case 'P': /* remote password */
- case 'R': /* remote password */
- case 'E': /* get password from IPMI_PASSWORD environment var */
- case 'F': /* force driver type */
- case 'T': /* auth type */
- case 'J': /* cipher suite */
- case 'Y': /* prompt for remote password */
- case 'Z': /* set local MC address */
- parse_lan_options(c,optarg,fdebug);
- break;
- default:
- printf("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n",progname);
- printf(" \t [-a alertnum -i eth1 -n pefnum ]\n");
- printf(" \t [-I ipadr -M macadr -S subnet ]\n");
- printf(" \t [-G gwyip -H gwymac -L lan_channel_num]\n");
- printf(" \t [-A alertip -X alertmac -C community ]\n");
- printf(" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n");
- printf(" \t [-j 10_bytes_custom_pef -b authmask ]\n");
- printf("where -c shows Canonical, simpler output format\n");
- printf(" -d Disables BMC LAN & PEF\n");
- printf(" -e Enables BMC LAN & PEF\n");
- printf(" -f set ARP Control to 1=grat, 2=resp, 3=both\n");
- printf(" -g secondary Gateway IP (-G=primary_gwy_ip)\n");
- printf(" -h VLAN ID (>=4096 to disable)\n");
- printf(" -j specify custom PEF rule (10 or 18 hex bytes)\n");
- printf(" -k add PEF oK rules, if PEF enable\n");
- printf(" -l Enables BMC LAN only, not PEF\n");
- printf(" -o disable Only SOL\n");
- printf(" -p password to set \n");
- printf(" -q/-# User number of LAN username_to_set\n");
- printf(" -r Read-only BMC LAN & PEF settings\n");
- printf(" -s Show some Serial settings also \n");
- printf(" -t Test if BMC LAN is already configured\n");
- printf(" -u username to set \n");
- printf(" -v access priVilege: 4=Admin,3=Operator,2=User\n");
- printf(" -w set Grat ARP Interval to specified # seconds\n");
- printf(" -x Show eXtra debug messages\n");
- printf(" -y OEM LAN Failover (1=enable,0=disable if Intel)\n");
- printf(" -z Show IPMI LAN statistics\n");
- printf(" -B Baud for SerialOverLan (19.2K,115.2K,...)\n");
- printf(" -D Use DHCP instead of static IP (-I for server)\n");
- printf(" -K (Kontron) IPMI hostname to set\n");
- printf(" -Q VLAN Priority (default =0)\n");
- printf(" -O Force LAN security: no null user, cipher 0 off\n");
- print_lan_opt_usage(0);
- ret = ERR_USAGE;
- goto do_exit;
- } /*end switch*/
- nopts++;
- } /*end while*/
-
- if ((freadonly == FLAG_INIT) && (j > 0)) {
- /* got some options implying set, but no -e -l -d option specified. */
- foptmsg = 1; /*show warning message later*/
- freadonly = 1; /*assume read only*/
- }
- fipmilan = is_remote();
- if (fipmilan && !fprivset)
- parse_lan_options('V',"4",0); /*even if freadonly request admin*/
- if ((fsetarp == 0) && ostype == OS_WINDOWS)
- arp_ctl = 0x03; /*grat arp & arp resp enabled */
-
- ret = GetDeviceID( &LanRecord);
- if (ret != 0) {
- goto do_exit;
- } else { /* success */
- uchar ipmi_maj, ipmi_min;
- ipmi_maj = LanRecord.data[4] & 0x0f;
- ipmi_min = LanRecord.data[4] >> 4;
- show_devid( LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min);
- if (ipmi_maj == 0) fIPMI10 = 1;
- else if (ipmi_maj == 1 && ipmi_min < 5) fIPMI10 = 1;
- else fIPMI10 = 0; /* >= IPMI 1.5 is ok */
- if (ipmi_maj >= 2) fIPMI20 = 1;
- if (fIPMI20) show_users = 5;
- else show_users = 3;
- if (fIPMI10) {
- printf("This IPMI v%d.%d system does not support PEF records.\n",
- ipmi_maj,ipmi_min);
- /* Wont handle PEF, but continue and look for BMC LAN anyway */
- // fIPMI10 = 1;
- // ipmi_close_();
- // exit(1);
- }
- prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8);
- vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8)
- + (LanRecord.data[8] << 16);
- /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */
- if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */
- fmBMC = 1; /*NSC miniBMC*/
- if (pefnum == 12) pefnum = 10; /* change CritStop pefnum to 0x0a */
- pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/
- pefmax = 30;
- fsharedMAC = 1; /* shared MAC with OS */
- } else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */
- pefdesc = NULL; /* unknown, see PefDesc() */
- if (pefnum == 12) pefnum = 15; /* change CritStop pefnum */
- pefmax = 16;
- fsharedMAC = 0; /* not-shared BMC LAN port */
- } else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */
- pefdesc = &pefdesc1[0]; /*default Intel PEF*/
- pefmax = 20; /*default Intel PEF*/
- switch(prod_id) {
- case 0x4311: /* Intel NSI2U w SE7520JR23 */
- fmBMC = 1; /* Intel miniBMC*/
- if (pefnum == 12) pefnum = 14; /* change CritStop pefnum */
- pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/
- pefmax = 30;
- fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
- break;
- case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM*/
- fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
- gcm_ch = 3; /* IMM GCM port, dedicated MAC */
- show_users = 4;
- break;
- case 0x000C: /*TSRLT2*/
- case 0x001B: /*TIGPR2U*/
- /* fmBMC=0; Intel Sahalee BMC*/
- fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
- break;
- case 0x0026: /*S5000 Bridgeport*/
- case 0x0028: /*S5000PAL Alcolu*/
- case 0x0029: /*S5000PSL StarLake*/
- case 0x0811: /*S5000PHB TIGW1U */
- /* fmBMC=0; Intel Sahalee ESB2 BMC*/
- fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
- gcm_ch = 3;
- parm7 = &iparm7[0]; /*TTL=30*/
- break;
- case 0x003E: /*NSN2U or CG2100 Urbanna*/
- fiBMC = 1; /* Intel iBMC */
- fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
- // gcm_ch = 3;
- parm7 = &iparm7[0]; /*TTL=30*/
- if (fsetarp == 0)
- arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */
- arp_interval = 0x00; /*0 sec, since grat arp disabled */
- sol_accum[0] = 0x0c; /*Intel defaults*/
- sol_accum[1] = 0x60; /*Intel defaults*/
- sol_retry[0] = 0x07; /*Intel defaults*/
- sol_retry[1] = 0x32; /*Intel defaults*/
- set_max_kcs_loops(URNLOOPS); /*longer for SetLan cmds (default 300)*/
- break;
- case 0x0107: /* Intel Caneland*/
- fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
- gcm_ch = 3;
- break;
- case 0x0100: /*Tiger2 ia64*/
- /* for ia64 set chan_pefon, chan_pefoff accordingly*/
- chan_pefon = CHAN_ACC_PEFON64;
- chan_pefoff = CHAN_ACC_PEFOFF64;
- /* fall through */
- default: /* else other Intel */
- /* fmBMC = 0; * Intel Sahalee BMC*/
- if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */
- else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
- break;
- } /*end switch*/
- if (is_romley(vend_id,prod_id)) fRomley = 1;
- if (is_grantley(vend_id,prod_id)) fGrantley = 1;
- if (fRomley) {
- fiBMC = 1; /* Intel iBMC */
- fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
- set_max_kcs_loops(URNLOOPS); /*longer for SetLan (default 300)*/
- fipv6 = 1;
- if (fsetarp == 0) arp_ctl = 0x03; /*default to both for Romley*/
- }
- } else { /* else other vendors */
- if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */
- else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
- pefdesc = NULL; /* unknown, see PefDesc() */
- if (pefnum == 12) pefnum = 15; /* change CritStop pefnum to 15? */
- pefmax = 20;
- if (!fUserPefNum) fAdjustPefNum = 1;
+ int ret;
+ PEF_RECORD PefRecord;
+ LAN_RECORD LanRecord;
+ int i, idx, j;
+ int c;
+ char *pstr;
+ uchar bset;
+ int ndest = 4;
+ int idest;
+ char mystr[80];
+ char fpefok = 1;
+ uchar *pc;
+ int sz;
+ char *pa;
+ char *pb;
+
+ // progname = argv[0];
+ printf ("%s ver %s \n", progname, progver);
+ j = 0;
+ freadonly = FLAG_INIT;
+ idx = argc; /*getopt loop counter */
+ /* available opt chars: y O Q + = ~ _ */
+ while ((c =
+ getopt (argc, argv,
+ "a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?"))
+ != EOF) {
+ switch (c) {
+ case 'a': /* alert dest number (usu 1 thru 4) */
+ alertnum = atob (optarg);
+ if (alertnum > alertmax)
+ alertnum = 1;
+ j++;
+ break;
+ case 'b':
+ bAuth = htoi (optarg);
+ j++;
+ break; /*undocumented */
+ case 'c':
+ fcanonical = 1;
+ bdelim = BDELIM;
+ break;
+ case 'd':
+ fenable = 0;
+ fdisable = 1;
+ freadonly = 0;
+ break;
+ case 'e':
+ fenable = 1;
+ fdisable = 0;
+ freadonly = 0;
+ break;
+ case 'f':
+ i = atoi (optarg); /*set arp_ctl */
+ if (i < 0 || i > 3)
+ printf ("Invalid ARP control %d\n", i);
+ else {
+ arp_ctl = i;
+ fsetarp = 1;
+ j++;
}
- if (fmBMC) show_users = 1; /* mBMC doesn't support more than 1 user */
- }
-
- if (fshowchan) {
- ret = show_channels();
- exit(ret);
- }
-
- ret = GetPefCapabilities(&bset);
- if ((ret == 0) && (bset <= MAXPEF)) pefmax = bset;
-
- /* Get the BMC LAN channel & match it to an OS eth if. */
- i = GetBmcEthDevice(lan_ch_parm);
- if (i == -2) { /* no lan channels found (see lan_ch) */
- if (lan_ch_parm == PARM_INIT)
- printf("This system does not support IPMI LAN channels.\n");
- else /*specified a LAN channel*/
- printf("BMC channel %d does not support IPMI LAN.\n",lan_ch_parm);
- ret = LAN_ERR_NOTSUPPORT;
- goto do_exit;
- } else if (i < 0) { /* mac not found, use platform defaults */
- i = 0; /* default to eth0, lan_ch set already. */
- if (vend_id == VENDOR_INTEL) {
- if ((prod_id == 0x001B) || (prod_id == 0x000c)) {
- /* Intel TIGPR2U or TSRLT2 defaults are special */
- if (lan_ch_parm == 6)
- { i = 0; lan_ch = 6; }
- else { i = 1; lan_ch = 7; }
- ser_ch = 1;
- }
- }
- }
- if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) {
- /* Has a GCM, defaulted to it, and user didn't specify -L */
- /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */
- lan_ch = 1; /*default BMC LAN channel*/
- // i = 0; /*default eth0 (was eth1) */
- }
- if (fsetifn == 0) { /*not user specified, use the detected one*/
- // if (lan_ch == gcm_ch) strcpy(ifname,"gcm");
- sprintf(ifname,"%s%d",ifpattn,i); /*eth%d*/
- }
- if (fdebug) printf("lan_ch = %d, ifname = %s\n",lan_ch,ifname);
-
- /* set the lan_user appropriately */
- if (myuser == NULL) { /* if no -u param */
- if (ipmi_reserved_user(vend_id, 1)) lan_user = 2;
- else if (flansecure) lan_user = 2;
- else lan_user = 1; /*use default null user */
- } else if (usernum != 0) lan_user = usernum; /*use -q specified usernum*/
- /* else use default lan_user (=2) if -u and not -q */
-
- if (ftestonly) { /*test only if BMC LAN is configured or not */
- /* TODO: test gcm also, if present */
- ret = GetLanEntry(4, 0, &LanRecord); /*ip addr src*/
- if (ret == 0) {
- if ((LanRecord.data[0] == SRC_BIOS) ||
- (LanRecord.data[0] == SRC_DHCP)) ret = 0; /* DHCP, so ok */
- else { /*static IP*/
- ret = GetLanEntry(3, 0, &LanRecord); /* ip address */
- if (ret == 0) {
- if (!IpIsValid(LanRecord.data)) {
- printf("invalid BMC IP address\n");
- ret = 1; /* invalid ip */
- } else ret = GetLanEntry(12, 0, &LanRecord); /*gateway ip*/
- if (ret == 0) {
- if (!IpIsValid(LanRecord.data)) {
- printf("invalid gateway ip\n");
- ret = 2; /*invalid gwy ip*/
- } else ret = GetLanEntry(13, 0, &LanRecord);
- if (ret == 0) {
- if (!MacIsValid(&LanRecord.data[0])) {
- printf("invalid gateway mac\n");
- ret = 3; /*invalid gwy mac */
- }
- }
- }
+ break;
+ case 'l':
+ fpefenable = 0;
+ fenable = 2;
+ fdisable = 0;
+ freadonly = 0;
+ break;
+ case 'h': /* VLAN ID */
+ i = atoi (optarg);
+ if (i > 4095)
+ vlan_enable = 0;
+ else {
+ vlan_enable = 1;
+ vlan_id = (ushort) i;
+ }
+ j++;
+ break;
+ case 'y': /* OEM LAN Failover enable/disable */
+ i = atoi (optarg);
+ if (i < 0)
+ printf ("Failover(-y) parameter is negative\n");
+ else
+ failover_enable = i;
+ j++;
+ break;
+ case 'Q': /* VLAN Priority */
+ i = atoi (optarg);
+ if (i > 7 || i < 0)
+ vlan_enable = 0;
+ else {
+ vlan_enable = 1;
+ vlan_prio = (uchar) i;
+ }
+ j++;
+ break;
+ case 'i': /* eth interface (ifname) */
+ fsetifn = 1;
+ i = sizeof (ifname);
+ if (strlen (optarg) > (uint) i)
+ optarg[i] = 0;
+ strcpy (ifname, optarg);
+ if (fdebug)
+ printf ("ifname = %s\n", ifname);
+ j++;
+ break;
+ case 'j':
+ fCustomPEF = 1; /*custom 10 PEF bytes */
+ fpefenable = 1; /* PEF is implied here */
+ freadonly = 0;
+ memset (custPEF, 0, sizeof (custPEF));
+ custPEF[0] = htoi (&optarg[0]); /*action */
+ custPEF[1] = htoi (&optarg[2]); /*policy */
+ custPEF[2] = htoi (&optarg[4]); /*severity */
+ custPEF[3] = htoi (&optarg[6]); /*genid1 */
+ custPEF[4] = htoi (&optarg[8]); /*genid2 */
+ custPEF[5] = htoi (&optarg[10]); /*sensor_type */
+ custPEF[6] = htoi (&optarg[12]); /*sensor_num */
+ custPEF[7] = htoi (&optarg[14]); /*evt_trigger */
+ custPEF[8] = htoi (&optarg[16]); /*data1offset */
+ custPEF[9] = htoi (&optarg[18]); /*data1mask */
+ if (optarg[20] != 0) {
+ /* optionally get 8 extra PEF entry bytes */
+ custPEF[10] = htoi (&optarg[20]); /*data1cmp1 */
+ custPEF[11] = htoi (&optarg[22]); /*data1cmp2 */
+ custPEF[12] = htoi (&optarg[24]); /*data2mask */
+ custPEF[13] = htoi (&optarg[26]); /*data2cmp1 */
+ custPEF[14] = htoi (&optarg[28]); /*data2cmp2 */
+ custPEF[15] = htoi (&optarg[30]); /*data3mask */
+ custPEF[16] = htoi (&optarg[32]); /*data3cmp1 */
+ custPEF[17] = htoi (&optarg[34]); /*data3cmp2 */
+ }
+ j++;
+ break;
+ case 'k':
+ fSetPEFOks = 1;
+ j++;
+ break; /*configure PEF OK rules */
+ case 'm':
+ set_max_kcs_loops (atoi (optarg));
+ break;
+ case 'n': /* number/index in PEF table to insert new entry */
+ fpefenable = 1;
+ pefnum = atob (optarg);
+ if (pefnum >= MAXPEF) {
+ pefnum = MAXPEF - 1;
+ fAdjustPefNum = 1;
+ }
+ else
+ fUserPefNum = 1;
+ j++;
+ break;
+ case 'o':
+ fdisableSOL = 1; /*disable SOL only */
+ fpefenable = 0; /*no change to PEF */
+ freadonly = 0;
+ break;
+ case 'r':
+ freadonly = 1;
+ fenable = 0;
+ break;
+ case 's':
+ fgetser = 1;
+ break;
+ case 't':
+ ftestonly = 1;
+ freadonly = 1;
+ break;
+ case 'v': /* user access privilege level */
+ i = atoi (optarg);
+ if (valid_priv (i))
+ lan_access = i & 0x0f;
+ else
+ printf ("Invalid privilege -v %d, using Admin\n", i);
+ j++;
+ break;
+ case 'w':
+ i = atoi (optarg); /*set grat arp interval, in #sec */
+ if (i >= 0 && i < 256)
+ arp_interval = i * 2;
+ else
+ printf ("Invalid arp interval -w %d, skipping\n", i);
+ break;
+ case 'x':
+ fdebug = 1;
+ break;
+ case 'z':
+ flanstats = 1;
+ break;
+ case 'D':
+ lan_dhcp = 1;
+ j++;
+ break;
+ case 'O':
+ flansecure = 1;
+ j++;
+ break;
+ case 'I': /* My BMC IP Address */
+ fset_ip |= MYIP;
+ atoip (rgmyip, optarg);
+ j++;
+ break;
+ case 'M': /* My BMC MAC Address */
+ atomac (rgmymac, optarg);
+ if (!MacIsValid (rgmymac))
+ printf ("Invalid MAC for -M\n");
+ j++;
+ break;
+ case 'S': /* Subnet IP Address */
+ atoip (rgsubnet, optarg);
+ j++;
+ break;
+ case 'G': /* Gateway IP Address */
+ fset_ip |= GWYIP;
+ atoip (rggwyip, optarg);
+ j++;
+ break;
+ case 'g': /* Secondary Gateway IP Address */
+ fset_ip |= GWYIP;
+ atoip (rggwy2ip, optarg);
+ j++;
+ break;
+ case 'H': /* Gateway MAC Address */
+ atomac (rggwymac, optarg);
+ if (!MacIsValid (rggwymac))
+ printf ("Invalid MAC for -H\n");
+ j++;
+ break;
+ case 'B': /* SOL Baud rate */
+ fnewbaud = 1;
+ sol_baud = Str2Baud (optarg);
+ j++;
+ break;
+ case 'A': /* Alert Dest IP Address */
+ fset_ip |= DESTIP;
+ /* allow name or ip here via Get_Mac() ? */
+ atoip (rgdestip, optarg);
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'X': /* Alert Dest MAC Address */
+ atomac (rgdestmac, optarg);
+ if (!MacIsValid (rgdestmac))
+ printf ("Invalid MAC for -X\n");
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'K': /* Kontron IPMI hostname */
+ i = sizeof (rghostname); /*usu 18 */
+ if (strlen (optarg) > (uint) i)
+ optarg[i] = 0;
+ strcpy (rghostname, optarg);
+ j++;
+ break;
+ case 'C': /* Community String */
+ fsetcommunity = 1;
+ i = sizeof (rgcommunity); /*usu 18 */
+ if (strlen (optarg) > (uint) i)
+ optarg[i] = 0;
+ strcpy (rgcommunity, optarg);
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'u': /* username to set */
+ myuser = strdup_ (optarg); /*remote username */
+ j++;
+ break;
+ case 'p': /* password to set */
+ fpassword = 1;
+ if (strlen (optarg) > PSW_MAX)
+ optarg[PSW_MAX] = 0;
+ strcpy (passwordData, optarg);
+ if (fdebug)
+ printf ("Password = %s\n", passwordData);
+ /* Hide password from 'ps' */
+ memset (optarg, ' ', strlen (optarg));
+ j++;
+ break;
+ case 'q':
+ case '#':
+ usernum = atob (optarg);
+ if (usernum > 15)
+ usernum = 0; /*MAX_IPMI_USERS = 15 */
+ j++;
+ break;
+ case 'L':
+ if (strcmp (optarg, "list") == 0)
+ fshowchan = 1;
+ lan_ch_parm = atob (optarg);
+ if (lan_ch_parm > MAXCHAN)
+ lan_ch_parm = PARM_INIT; /*invalid */
+ break;
+ case 'V': /* priv level */
+ fprivset = 1;
+ case 'N': /* nodename */
+ case 'U': /* remote username */
+ case 'P': /* remote password */
+ case 'R': /* remote password */
+ case 'E': /* get password from IPMI_PASSWORD environment var */
+ case 'F': /* force driver type */
+ case 'T': /* auth type */
+ case 'J': /* cipher suite */
+ case 'Y': /* prompt for remote password */
+ case 'Z': /* set local MC address */
+ parse_lan_options (c, optarg, fdebug);
+ break;
+ default:
+ printf ("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n", progname);
+ printf (" \t [-a alertnum -i eth1 -n pefnum ]\n");
+ printf (" \t [-I ipadr -M macadr -S subnet ]\n");
+ printf (" \t [-G gwyip -H gwymac -L lan_channel_num]\n");
+ printf (" \t [-A alertip -X alertmac -C community ]\n");
+ printf (" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n");
+ printf (" \t [-j 10_bytes_custom_pef -b authmask ]\n");
+ printf ("where -c shows Canonical, simpler output format\n");
+ printf (" -d Disables BMC LAN & PEF\n");
+ printf (" -e Enables BMC LAN & PEF\n");
+ printf (" -f set ARP Control to 1=grat, 2=resp, 3=both\n");
+ printf (" -g secondary Gateway IP (-G=primary_gwy_ip)\n");
+ printf (" -h VLAN ID (>=4096 to disable)\n");
+ printf (" -j specify custom PEF rule (10 or 18 hex bytes)\n");
+ printf (" -k add PEF oK rules, if PEF enable\n");
+ printf (" -l Enables BMC LAN only, not PEF\n");
+ printf (" -o disable Only SOL\n");
+ printf (" -p password to set \n");
+ printf (" -q/-# User number of LAN username_to_set\n");
+ printf (" -r Read-only BMC LAN & PEF settings\n");
+ printf (" -s Show some Serial settings also \n");
+ printf (" -t Test if BMC LAN is already configured\n");
+ printf (" -u username to set \n");
+ printf (" -v access priVilege: 4=Admin,3=Operator,2=User\n");
+ printf (" -w set Grat ARP Interval to specified # seconds\n");
+ printf (" -x Show eXtra debug messages\n");
+ printf (" -y OEM LAN Failover (1=enable,0=disable if Intel)\n");
+ printf (" -z Show IPMI LAN statistics\n");
+ printf (" -B Baud for SerialOverLan (19.2K,115.2K,...)\n");
+ printf (" -D Use DHCP instead of static IP (-I for server)\n");
+ printf (" -K (Kontron) IPMI hostname to set\n");
+ printf (" -Q VLAN Priority (default =0)\n");
+ printf (" -O Force LAN security: no null user, cipher 0 off\n");
+ print_lan_opt_usage (0);
+ ret = ERR_USAGE;
+ goto do_exit;
+ } /*end switch */
+ nopts++;
+ } /*end while */
+
+ if ((freadonly == FLAG_INIT) && (j > 0)) {
+ /* got some options implying set, but no -e -l -d option specified. */
+ foptmsg = 1; /*show warning message later */
+ freadonly = 1; /*assume read only */
+ }
+ fipmilan = is_remote ();
+ if (fipmilan && !fprivset)
+ parse_lan_options ('V', "4", 0); /*even if freadonly request admin */
+ if ((fsetarp == 0) && ostype == OS_WINDOWS)
+ arp_ctl = 0x03; /*grat arp & arp resp enabled */
+
+ ret = GetDeviceID (&LanRecord);
+ if (ret != 0) {
+ goto do_exit;
+ }
+ else { /* success */
+ uchar ipmi_maj, ipmi_min;
+ ipmi_maj = LanRecord.data[4] & 0x0f;
+ ipmi_min = LanRecord.data[4] >> 4;
+ show_devid (LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min);
+ if (ipmi_maj == 0)
+ fIPMI10 = 1;
+ else if (ipmi_maj == 1 && ipmi_min < 5)
+ fIPMI10 = 1;
+ else
+ fIPMI10 = 0; /* >= IPMI 1.5 is ok */
+ if (ipmi_maj >= 2)
+ fIPMI20 = 1;
+ if (fIPMI20)
+ show_users = 5;
+ else
+ show_users = 3;
+ if (fIPMI10) {
+ printf ("This IPMI v%d.%d system does not support PEF records.\n",
+ ipmi_maj, ipmi_min);
+ /* Wont handle PEF, but continue and look for BMC LAN anyway */
+ // fIPMI10 = 1;
+ // ipmi_close_();
+ // exit(1);
+ }
+ prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8);
+ vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8)
+ + (LanRecord.data[8] << 16);
+ /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */
+ if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */
+ fmBMC = 1; /*NSC miniBMC */
+ if (pefnum == 12)
+ pefnum = 10; /* change CritStop pefnum to 0x0a */
+ pefdesc = &pefdesc2[0]; /*mini-BMC PEF */
+ pefmax = 30;
+ fsharedMAC = 1; /* shared MAC with OS */
+ }
+ else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */
+ pefdesc = NULL; /* unknown, see PefDesc() */
+ if (pefnum == 12)
+ pefnum = 15; /* change CritStop pefnum */
+ pefmax = 16;
+ fsharedMAC = 0; /* not-shared BMC LAN port */
+ }
+ else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */
+ pefdesc = &pefdesc1[0]; /*default Intel PEF */
+ pefmax = 20; /*default Intel PEF */
+ switch (prod_id) {
+ case 0x4311: /* Intel NSI2U w SE7520JR23 */
+ fmBMC = 1; /* Intel miniBMC */
+ if (pefnum == 12)
+ pefnum = 14; /* change CritStop pefnum */
+ pefdesc = &pefdesc2[0]; /*mini-BMC PEF */
+ pefmax = 30;
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ break;
+ case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM */
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ gcm_ch = 3; /* IMM GCM port, dedicated MAC */
+ show_users = 4;
+ break;
+ case 0x000C: /*TSRLT2 */
+ case 0x001B: /*TIGPR2U */
+ /* fmBMC=0; Intel Sahalee BMC */
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ break;
+ case 0x0026: /*S5000 Bridgeport */
+ case 0x0028: /*S5000PAL Alcolu */
+ case 0x0029: /*S5000PSL StarLake */
+ case 0x0811: /*S5000PHB TIGW1U */
+ /* fmBMC=0; Intel Sahalee ESB2 BMC */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ gcm_ch = 3;
+ parm7 = &iparm7[0]; /*TTL=30 */
+ break;
+ case 0x003E: /*NSN2U or CG2100 Urbanna */
+ fiBMC = 1; /* Intel iBMC */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ // gcm_ch = 3;
+ parm7 = &iparm7[0]; /*TTL=30 */
+ if (fsetarp == 0)
+ arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */
+ arp_interval = 0x00; /*0 sec, since grat arp disabled */
+ sol_accum[0] = 0x0c; /*Intel defaults */
+ sol_accum[1] = 0x60; /*Intel defaults */
+ sol_retry[0] = 0x07; /*Intel defaults */
+ sol_retry[1] = 0x32; /*Intel defaults */
+ set_max_kcs_loops (URNLOOPS); /*longer for SetLan cmds (default 300) */
+ break;
+ case 0x0107: /* Intel Caneland */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ gcm_ch = 3;
+ break;
+ case 0x0100: /*Tiger2 ia64 */
+ /* for ia64 set chan_pefon, chan_pefoff accordingly */
+ chan_pefon = CHAN_ACC_PEFON64;
+ chan_pefoff = CHAN_ACC_PEFOFF64;
+ /* fall through */
+ default: /* else other Intel */
+ /* fmBMC = 0; * Intel Sahalee BMC */
+ if (fIPMI20)
+ fsharedMAC = 0; /* recent, not-shared BMC MAC */
+ else
+ fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
+ break;
+ } /*end switch */
+ if (is_romley (vend_id, prod_id))
+ fRomley = 1;
+ if (is_grantley (vend_id, prod_id))
+ fGrantley = 1;
+ if (fRomley) {
+ fiBMC = 1; /* Intel iBMC */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ set_max_kcs_loops (URNLOOPS); /*longer for SetLan (default 300) */
+ fipv6 = 1;
+ if (fsetarp == 0)
+ arp_ctl = 0x03; /*default to both for Romley */
+ }
+ }
+ else { /* else other vendors */
+ if (fIPMI20)
+ fsharedMAC = 0; /* recent, not-shared BMC MAC */
+ else
+ fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
+ pefdesc = NULL; /* unknown, see PefDesc() */
+ if (pefnum == 12)
+ pefnum = 15; /* change CritStop pefnum to 15? */
+ pefmax = 20;
+ if (!fUserPefNum)
+ fAdjustPefNum = 1;
+ }
+ if (fmBMC)
+ show_users = 1; /* mBMC doesn't support more than 1 user */
+ }
+
+ if (fshowchan) {
+ ret = show_channels ();
+ exit (ret);
+ }
+
+ ret = GetPefCapabilities (&bset);
+ if ((ret == 0) && (bset <= MAXPEF))
+ pefmax = bset;
+
+ /* Get the BMC LAN channel & match it to an OS eth if. */
+ i = GetBmcEthDevice (lan_ch_parm, &lan_ch);
+ if (i == -2) { /* no lan channels found (see lan_ch) */
+ if (lan_ch_parm == PARM_INIT)
+ printf ("This system does not support IPMI LAN channels.\n");
+ else /*specified a LAN channel */
+ printf ("BMC channel %d does not support IPMI LAN.\n", lan_ch_parm);
+ ret = LAN_ERR_NOTSUPPORT;
+ goto do_exit;
+ }
+ else if (i < 0) { /* mac not found, use platform defaults */
+ i = 0; /* default to eth0, lan_ch set already. */
+ if (vend_id == VENDOR_INTEL) {
+ if ((prod_id == 0x001B) || (prod_id == 0x000c)) {
+ /* Intel TIGPR2U or TSRLT2 defaults are special */
+ if (lan_ch_parm == 6) {
+ i = 0;
+ lan_ch = 6;
+ }
+ else {
+ i = 1;
+ lan_ch = 7;
+ }
+ ser_ch = 1;
+ }
+ }
+ }
+ if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) {
+ /* Has a GCM, defaulted to it, and user didn't specify -L */
+ /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */
+ lan_ch = 1; /*default BMC LAN channel */
+ // i = 0; /*default eth0 (was eth1) */
+ }
+ if (fsetifn == 0) { /*not user specified, use the detected one */
+ // if (lan_ch == gcm_ch) strcpy(ifname,"gcm");
+ sprintf (ifname, "%s%d", ifpattn, i); /*eth%d */
+ }
+ if (fdebug)
+ printf ("lan_ch = %d, ifname = %s\n", lan_ch, ifname);
+
+ /* set the lan_user appropriately */
+ if (myuser == NULL) { /* if no -u param */
+ if (ipmi_reserved_user (vend_id, 1))
+ lan_user = 2;
+ else if (flansecure)
+ lan_user = 2;
+ else
+ lan_user = 1; /*use default null user */
+ }
+ else if (usernum != 0)
+ lan_user = usernum; /*use -q specified usernum */
+ /* else use default lan_user (=2) if -u and not -q */
+
+ if (ftestonly) { /*test only if BMC LAN is configured or not */
+ /* TODO: test gcm also, if present */
+ ret = GetLanEntry (4, 0, &LanRecord); /*ip addr src */
+ if (ret == 0) {
+ if ((LanRecord.data[0] == SRC_BIOS) || (LanRecord.data[0] == SRC_DHCP))
+ ret = 0; /* DHCP, so ok */
+ else { /*static IP */
+ ret = GetLanEntry (3, 0, &LanRecord); /* ip address */
+ if (ret == 0) {
+ if (!IpIsValid (LanRecord.data)) {
+ printf ("invalid BMC IP address\n");
+ ret = 1; /* invalid ip */
+ }
+ else
+ ret = GetLanEntry (12, 0, &LanRecord); /*gateway ip */
+ if (ret == 0) {
+ if (!IpIsValid (LanRecord.data)) {
+ printf ("invalid gateway ip\n");
+ ret = 2; /*invalid gwy ip */
+ }
+ else
+ ret = GetLanEntry (13, 0, &LanRecord);
+ if (ret == 0) {
+ if (!MacIsValid (&LanRecord.data[0])) {
+ printf ("invalid gateway mac\n");
+ ret = 3; /*invalid gwy mac */
+ }
}
- }
- } /*endif GetLanEntry ok*/
- if (ret == 0) printf("BMC LAN already configured\n");
- else printf("BMC LAN not configured\n");
+ }
+ }
+ }
+ } /*endif GetLanEntry ok */
+ if (ret == 0)
+ printf ("BMC LAN already configured\n");
+ else
+ printf ("BMC LAN not configured\n");
+ goto do_exit;
+ } /*endif ftestonly */
+
+ memset (SessInfo, 0, sizeof (SessInfo));
+ ret = GetSessionInfo (SessInfo, sizeof (SessInfo));
+ // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen);
+ if (fdebug)
+ printf ("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n",
+ ret, SessInfo[0], SessInfo[1], SessInfo[2], SessInfo[3]);
+ if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */
+ if (SessInfo[2] > 1) { /* another session is active also */
+ printf
+ ("Another session is also active, cannot change IPMI LAN settings now.\n");
+ ret = ERR_NOT_ALLOWED;
goto do_exit;
- } /*endif ftestonly*/
-
- memset(SessInfo,0,sizeof(SessInfo));
- ret = GetSessionInfo(SessInfo,sizeof(SessInfo));
- // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen);
- if (fdebug) printf("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n",
- ret,SessInfo[0],SessInfo[1],SessInfo[2],SessInfo[3]);
- if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */
- if (SessInfo[2] > 1) { /* another session is active also */
- printf("Another session is also active, cannot change IPMI LAN settings now.\n");
- ret = ERR_NOT_ALLOWED;
- goto do_exit;
+ }
+ }
+
+ if (!fIPMI10) {
+ if (fcanonical) { /* canonical/simple output */
+ ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord);
+ if (ret != 0)
+ ndest = 0;
+ else { /*success */
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j == 0)
+ strcat (mystr, "none ");
+ else {
+ if (j & 0x01)
+ strcat (mystr, "PEFenable ");
+ if (j & 0x02)
+ strcat (mystr, "DoEventMsgs ");
+ if (j & 0x04)
+ strcat (mystr, "Delay ");
+ if (j & 0x08)
+ strcat (mystr, "AlertDelay ");
+ }
+ printf ("PEF Control %s%c %s\n", pspace4, bdelim, mystr);
+ }
+ }
+ else { /* normal/full output */
+ ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord);
+ if (ret == 0 && (LanRecord.data[0] != 0)) {
+ fpefok = 1;
+ bmcpefctl = LanRecord.data[0];
}
- }
-
- if (!fIPMI10) {
- if (fcanonical)
- { /* canonical/simple output */
- ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
- if (ret != 0) ndest = 0;
- else { /*success*/
- j = LanRecord.data[0];
- mystr[0] = 0;
- if (j == 0) strcat(mystr,"none ");
- else {
- if (j & 0x01) strcat(mystr,"PEFenable ");
- if (j & 0x02) strcat(mystr,"DoEventMsgs ");
- if (j & 0x04) strcat(mystr,"Delay ");
- if (j & 0x08) strcat(mystr,"AlertDelay ");
- }
- printf("PEF Control %s%c %s\n",pspace4,bdelim,mystr);
- }
- } else { /* normal/full output */
- ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
- if (ret == 0 && (LanRecord.data[0] != 0)) {
- fpefok = 1;
- bmcpefctl = LanRecord.data[0];
- } else { /* skip PEF rules/params if disabled */
- printf("PEF Control %s%c %s\n",pspace4,bdelim,"none ");
- ndest = 0;
- fpefok = 0;
- }
-
- if (fpefok) {
- printf("%s, GetPefEntry ...\n",progname);
- for (idx = 1; idx <= pefmax; idx++)
- {
- ret = GetPefEntry( 0x06, (ushort)idx, &PefRecord);
- if (ret == 0) { // Show the PEF record
- pc = (uchar *)&PefRecord;
- sz = 21; // sizeof(PEF_RECORD) = 21
+ else { /* skip PEF rules/params if disabled */
+ printf ("PEF Control %s%c %s\n", pspace4, bdelim, "none ");
+ ndest = 0;
+ fpefok = 0;
+ }
+
+ if (fpefok) {
+ printf ("%s, GetPefEntry ...\n", progname);
+ for (idx = 1; idx <= pefmax; idx++) {
+ ret = GetPefEntry (0x06, (ushort) idx, &PefRecord);
+ if (ret == 0) { // Show the PEF record
+ pc = (uchar *) & PefRecord;
+ sz = 21; // sizeof(PEF_RECORD) = 21
if (PefRecord.sensor_type == 0) {
- if (idx <= pefnum)
- printf("PEFilter(%02d): empty\n",idx);
- memcpy(pef_array[idx-1], &PefRecord, sz);
- if (fAdjustPefNum) pefnum = (char)idx;
- } else {
- memcpy(pef_array[idx-1], &PefRecord, sz);
- if (PefRecord.fconfig & 0x80) pb = "enabled";
- else pb = "disabled";
+ if (idx <= pefnum)
+ printf ("PEFilter(%02d): empty\n", idx);
+ memcpy (pef_array[idx - 1], &PefRecord, sz);
+ if (fAdjustPefNum)
+ pefnum = (char) idx;
+ }
+ else {
+ memcpy (pef_array[idx - 1], &PefRecord, sz);
+ if (PefRecord.fconfig & 0x80)
+ pb = "enabled";
+ else
+ pb = "disabled";
i = PefRecord.rec_id;
- switch(PefRecord.action) {
- case 0x01: pa = "alert"; break;
- case 0x02: pa = "poweroff"; break;
- case 0x04: pa = "reset"; break;
- case 0x08: pa = "powercycle"; break;
- case 0x10: pa = "OEMaction"; break;
- case 0x20: pa = "NMI"; break;
- default: pa = "no action";
- }
- printf("PEFilter(%02d): %02x %s event - %s for %s\n",
- idx, PefRecord.sensor_type,
- PefDesc(i,PefRecord.sensor_type), pb,pa);
+ switch (PefRecord.action) {
+ case 0x01:
+ pa = "alert";
+ break;
+ case 0x02:
+ pa = "poweroff";
+ break;
+ case 0x04:
+ pa = "reset";
+ break;
+ case 0x08:
+ pa = "powercycle";
+ break;
+ case 0x10:
+ pa = "OEMaction";
+ break;
+ case 0x20:
+ pa = "NMI";
+ break;
+ default:
+ pa = "no action";
+ }
+ printf ("PEFilter(%02d): %02x %s event - %s for %s\n",
+ idx, PefRecord.sensor_type,
+ PefDesc (i, PefRecord.sensor_type), pb, pa);
}
- if (fdebug) { /* show raw PEFilter record */
- pc = &PefRecord.rec_id;
- printf("raw PEF(%.2d): ",pc[0]);
- for (i = 0; i < sz; i++) printf("%02x ",pc[i]);
- printf("\n");
+ if (fdebug) { /* show raw PEFilter record */
+ pc = &PefRecord.rec_id;
+ printf ("raw PEF(%.2d): ", pc[0]);
+ for (i = 0; i < sz; i++)
+ printf ("%02x ", pc[i]);
+ printf ("\n");
}
- } else {
- printf("GetPefEntry(%d), ret = %d\n",idx,ret);
- if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */
- fpefok = 0;
- ndest = 0; /* if no PEF, no alerts & no alert dest */
- break;
+ }
+ else {
+ printf ("GetPefEntry(%d), ret = %d\n", idx, ret);
+ if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */
+ fpefok = 0;
+ ndest = 0; /* if no PEF, no alerts & no alert dest */
+ break;
}
- }
- }
- } /*endif fpefok*/
- if (fpefok) {
- if (fdebug) ShowPef();
- ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
- if (ret == 0) {
- j = LanRecord.data[0];
- mystr[0] = 0;
- if (j & 0x01) strcat(mystr,"PEFenable ");
- if (j & 0x02) strcat(mystr,"DoEventMsgs ");
- if (j & 0x04) strcat(mystr,"Delay ");
- if (j & 0x08) strcat(mystr,"AlertDelay ");
- printf("PEF Control: %02x : %s\n",j, mystr);
- }
- ret = GetPefEntry(0x02, 0,(PEF_RECORD *)&LanRecord);
- if (ret == 0) {
- j = LanRecord.data[0];
- mystr[0] = 0;
- if (j & 0x01) strcat(mystr,"Alert ");
- if (j & 0x02) strcat(mystr,"PwrDn ");
- if (j & 0x04) strcat(mystr,"Reset ");
- if (j & 0x08) strcat(mystr,"PwrCyc ");
- if (j & 0x10) strcat(mystr,"OEM ");
- if (j & 0x20) strcat(mystr,"DiagInt ");
- printf("PEF Actions: %02x : %s\n",j, mystr);
- }
- ret = GetPefEntry(0x03, 0,(PEF_RECORD *)&LanRecord);
- if (ret == 0) printf("PEF Startup Delay: %02x : %d sec\n",
- LanRecord.data[0],LanRecord.data[0]);
- if (!fmBMC) {
- ret = GetPefEntry(0x04, 0,(PEF_RECORD *)&LanRecord);
- if (ret == 0) printf("PEF Alert Startup Delay: %02x: %d sec\n",
- LanRecord.data[0],LanRecord.data[0]);
- /* fmBMC gets cc=0x80 here */
- }
- /* note that ndest should be read from lan param 17 below. */
- for (i = 1; i <= ndest; i++)
- {
- ret = GetPefEntry(0x09, (ushort)i,(PEF_RECORD *)&LanRecord);
- if (ret == 0) {
+ }
+ }
+ } /*endif fpefok */
+ if (fpefok) {
+ if (fdebug)
+ ShowPef ();
+ ret = GetPefEntry (0x01, 0, (PEF_RECORD *) & LanRecord);
+ if (ret == 0) {
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j & 0x01)
+ strcat (mystr, "PEFenable ");
+ if (j & 0x02)
+ strcat (mystr, "DoEventMsgs ");
+ if (j & 0x04)
+ strcat (mystr, "Delay ");
+ if (j & 0x08)
+ strcat (mystr, "AlertDelay ");
+ printf ("PEF Control: %02x : %s\n", j, mystr);
+ }
+ ret = GetPefEntry (0x02, 0, (PEF_RECORD *) & LanRecord);
+ if (ret == 0) {
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j & 0x01)
+ strcat (mystr, "Alert ");
+ if (j & 0x02)
+ strcat (mystr, "PwrDn ");
+ if (j & 0x04)
+ strcat (mystr, "Reset ");
+ if (j & 0x08)
+ strcat (mystr, "PwrCyc ");
+ if (j & 0x10)
+ strcat (mystr, "OEM ");
+ if (j & 0x20)
+ strcat (mystr, "DiagInt ");
+ printf ("PEF Actions: %02x : %s\n", j, mystr);
+ }
+ ret = GetPefEntry (0x03, 0, (PEF_RECORD *) & LanRecord);
+ if (ret == 0)
+ printf ("PEF Startup Delay: %02x : %d sec\n",
+ LanRecord.data[0], LanRecord.data[0]);
+ if (!fmBMC) {
+ ret = GetPefEntry (0x04, 0, (PEF_RECORD *) & LanRecord);
+ if (ret == 0)
+ printf ("PEF Alert Startup Delay: %02x: %d sec\n",
+ LanRecord.data[0], LanRecord.data[0]);
+ /* fmBMC gets cc=0x80 here */
+ }
+ /* note that ndest should be read from lan param 17 below. */
+ for (i = 1; i <= ndest; i++) {
+ ret = GetPefEntry (0x09, (ushort) i, (PEF_RECORD *) & LanRecord);
+ if (ret == 0) {
mystr[0] = 0;
- j = LanRecord.data[2];
- if (LanRecord.data[1] & 0x08) {
- sprintf(mystr,"Chan[%d] Dest[%d] ",((j & 0xf0) >> 4),(j & 0x0f));
- strcat(mystr,"Enabled ");
- } else strcpy(mystr,"Disabled ");
- printf("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n",i,
- LanRecord.data[0], LanRecord.data[1],
- LanRecord.data[2], LanRecord.data[3],mystr);
- }
- } /*endfor ndest*/
- } /*endif fpefok*/
- } /*endif not canonical*/
-
- if (fpefenable && !freadonly) { /* fenable or fdisable */
- if (fSetPEFOks) pefadd = 5;
- else pefadd = 2;
- sz = (pefnum - 1) + pefadd + fCustomPEF;
- printf("\n%s, SetPefEntry(1-%d) ...\n",progname,sz);
- if (fdebug) printf("pefnum = %d, pefmax = %d\n",pefnum,pefmax);
- for (idx = 1; idx <= pefmax; idx++)
- {
- // Set & Enable all PEF records
- memset(&PefRecord.rec_id,0,sizeof(PEF_RECORD));
- PefRecord.rec_id = (uchar)idx; /* next record, or user-specified */
- if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */
- if (pef_array[idx-1][7] == 0) /*empty pef record, set to default*/
- memcpy(&PefRecord.rec_id,pef_defaults[idx-1],sizeof(PEF_RECORD));
- else { /* set config however it was previously */
- memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD));
- if (PefRecord.severity == 0)
- PefRecord.severity = pef_defaults[idx-1][4];
- }
- } else if ((idx == pefnum) && /* new OS Crit Stop entry */
- (PefRecord.sensor_type == 0)) {
- // Set PEF values for 0x20, OS Critical Stop event
- PefRecord.severity = PEF_SEV_CRIT;
- PefRecord.genid1 = 0xff;
- PefRecord.genid2 = 0xff;
- PefRecord.sensor_type = 0x20; /* OS Critical Stop */
- PefRecord.sensor_no = 0xff;
- PefRecord.event_trigger = 0x6f;
- PefRecord.data1 = 0xff;
- PefRecord.mask1 = 0x00;
- } else if ((idx == pefnum+1) && /* new Power Redundancy entry */
- (PefRecord.sensor_type == 0)) {
- // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost
- PefRecord.severity = PEF_SEV_WARN;
- PefRecord.genid1 = 0xff;
- PefRecord.genid2 = 0xff;
- PefRecord.sensor_type = 0x09; /* Power Unit */
- PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
- PefRecord.event_trigger = 0x0b; /* event trigger */
- PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */
- PefRecord.mask1 = 0x00;
- } else if (fSetPEFOks && idx == (pefnum+2)) {
- PefRecord.severity = PEF_SEV_OK;
- PefRecord.genid1 = 0xff;
- PefRecord.genid2 = 0xff;
- PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */
- PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
- PefRecord.event_trigger = 0x0b; /* event trigger */
- PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */
- PefRecord.mask1 = 0x00;
- } else if (fSetPEFOks && idx == (pefnum+3)) {
- PefRecord.severity = PEF_SEV_OK;
- PefRecord.genid1 = 0xff;
- PefRecord.genid2 = 0xff;
- PefRecord.sensor_type = 0x01; /* Temp OK */
- PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
- PefRecord.event_trigger = 0x81; /* event trigger */
- PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
- PefRecord.mask1 = 0x0a;
- } else if (fSetPEFOks && idx == (pefnum+4)) {
- PefRecord.severity = PEF_SEV_OK;
- PefRecord.genid1 = 0xff;
- PefRecord.genid2 = 0xff;
- PefRecord.sensor_type = 0x02; /* Voltage OK */
- PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
- PefRecord.event_trigger = 0x81; /* event trigger */
- PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
- PefRecord.mask1 = 0x0a;
- } else if (fCustomPEF && idx == (pefnum+pefadd)) {
- /* user entered 10 or 18 PEF entry bytes */
- PefRecord.action = custPEF[0];
- PefRecord.policy = custPEF[1];
- PefRecord.severity = custPEF[2];
- PefRecord.genid1 = custPEF[3];
- PefRecord.genid2 = custPEF[4];
- PefRecord.sensor_type = custPEF[5];
- PefRecord.sensor_no = custPEF[6];
- PefRecord.event_trigger = custPEF[7];
- PefRecord.data1 = custPEF[8];
- PefRecord.mask1 = custPEF[9];
- memcpy(&PefRecord.action,custPEF,18);
- } else {
- memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD));
- if (PefRecord.sensor_type == 0) continue; /* if reserved, skip it */
- }
- if (fdebug && (PefRecord.rec_id != idx)) {
- /* memcpy from pef_defaults or pef_array clobbered rec_id */
- printf("Warning: SetPef idx=%d, rec_id=%d\n",idx,PefRecord.rec_id);
- PefRecord.rec_id = (uchar)idx; /*fix it*/
- }
- if (fdisable) {
- /* Disable all PEF rules */
- if (idx >= pefnum) PefRecord.fconfig = 0x00; /*disabled, software*/
- else PefRecord.fconfig = 0x40; /*disabled, preset */
- PefRecord.action = 0x00;
- PefRecord.policy = 0x00;
- } else { /*fenable*/
- if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */
- /* Enable all non-empty PEF rules */
- if (fCustomPEF && (idx == (pefnum+pefadd))) {
- PefRecord.action = custPEF[0];
- PefRecord.policy = custPEF[1];
- } else {
- PefRecord.action = 0x01; /*Alert*/
- PefRecord.policy = 0x01; /*see Alert Policy #1*/
- }
- if (idx < pefnum) { /* special handling for presets, 1 thru 11 */
- PefRecord.fconfig = 0x80; /* enabled, software */
- ret = SetPefEntry(&PefRecord);
- if (fdebug)
- printf("SetPefEntry(%d/80) ret=%d\n",PefRecord.rec_id,ret);
- // if (ret != 0) { nerrs++; lasterr = ret; }
- // else ngood++;
- PefRecord.fconfig = 0xC0; /* enabled, preset */
- } else {
- PefRecord.fconfig = 0x80; /* enabled, software */
- }
- } /*endif not empty*/
- }
- { // Show the new PEF record before setting it.
- pc = (uchar *)&PefRecord;
- sz = 21;
- printf("PEFilter(%d): ",PefRecord.rec_id);
- for (i = 0; i < sz; i++) printf("%02x ",pc[i]);
- printf("\n");
- }
- ret = SetPefEntry(&PefRecord);
- if (fdebug)
- printf("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id,ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- } /*end for*/
- }
- } /*end if not fIPMI10*/
-
- if (!fcanonical)
- printf("\n%s, GetLanEntry for channel %d ...\n",progname,lan_ch);
- idest = 1;
- for (idx = 0; idx < NLAN; idx++)
- {
- int ival;
- if (fcanonical && (canon_param[idx] == 0)) continue;
- if (idx == 8 || idx == 9) continue; /* not implemented */
- ival = lanparams[idx].cmd;
- if (ival >= 96 && ival <= 98) continue; /* not implemented */
- if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters*/
- if (fipv6 == 0) continue; /*skip these*/
- }
- if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm*/
- lanparams[idx].sz = 36;
- strcpy(lanparams[idx].desc,"IPMI Hostname");
- } else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters*/
- if (vend_id != VENDOR_INTEL) continue;
- if (fmBMC || fiBMC || fcanonical) continue; /*skip these*/
- }
- if (ival >= 20 && ival <= 25) {
- if (!fIPMI20) continue; /*VLAN params 20-25, fIPMI20 only/opt*/
- }
- if ((ndest == 0) && (ival >= 18 && ival <= 19)) continue; /*skip dest*/
- if (ival == 11) { /*grat arp interval*/
- if (vend_id == VENDOR_SUPERMICROX) continue;
- if (vend_id == VENDOR_SUPERMICRO) continue;
- }
- if (ival == 14 || ival == 15) { /*secondary gateway is optional*/
- if (vend_id == VENDOR_KONTRON) continue;
- }
- if (ival == 201) { /*Get Channel Access*/
- ret = ShowChanAcc(lan_ch);
- } else {
- if (ival == 18 || ival == 19) { /*dest params*/
- if (ndest == 0) continue; /*skip if ndest==0 */
- bset = (uchar)idest; /* dest id = 1 thru n */
- } else bset = 0;
- ret = GetLanEntry((uchar)ival, bset, &LanRecord);
- }
- if (ret == 0) { // Show the LAN record
- pc = (uchar *)&LanRecord;
- sz = lanparams[idx].sz;
- if (ival == 18) { /*skip if invalid dest type param*/
- if ((idest > 1) && (pc[2] == 0)) { idest = 1; continue; }
- } else if (ival == 19) { /*skip if invalid dest addr param*/
- if ((idest > 1) && !IpIsValid(&pc[3])) { idest = 1; continue; }
+ j = LanRecord.data[2];
+ if (LanRecord.data[1] & 0x08) {
+ sprintf (mystr, "Chan[%d] Dest[%d] ", ((j & 0xf0) >> 4),
+ (j & 0x0f));
+ strcat (mystr, "Enabled ");
}
- if (ival == 201) ; /* did it above */
- else {
- if (fcanonical) {
- if ((ival == 19) && (idest > 1)) ; /*skip it*/
- else {
- j = strlen_(lanparams[idx].desc);
- // (ival < 7) || (ival == 19) || ival == 102)
- if (j <= 12) pstr = pspace3;
- else pstr = pspace2;
- printf("Channel %d %s %s%c ",lan_ch,
- lanparams[idx].desc,pstr,bdelim);
- }
- } else
- printf("Lan Param(%d) %s: ",ival,lanparams[idx].desc);
+ else
+ strcpy (mystr, "Disabled ");
+ printf ("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n", i,
+ LanRecord.data[0], LanRecord.data[1],
+ LanRecord.data[2], LanRecord.data[3], mystr);
+ }
+ } /*endfor ndest */
+ } /*endif fpefok */
+ } /*endif not canonical */
+
+ if (fpefenable && !freadonly) { /* fenable or fdisable */
+ if (fSetPEFOks)
+ pefadd = 5;
+ else
+ pefadd = 2;
+ sz = (pefnum - 1) + pefadd + fCustomPEF;
+ printf ("\n%s, SetPefEntry(1-%d) ...\n", progname, sz);
+ if (fdebug)
+ printf ("pefnum = %d, pefmax = %d\n", pefnum, pefmax);
+ for (idx = 1; idx <= pefmax; idx++) {
+ // Set & Enable all PEF records
+ memset (&PefRecord.rec_id, 0, sizeof (PEF_RECORD));
+ PefRecord.rec_id = (uchar) idx; /* next record, or user-specified */
+ if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */
+ if (pef_array[idx - 1][7] == 0) /*empty pef record, set to default */
+ memcpy (&PefRecord.rec_id, pef_defaults[idx - 1],
+ sizeof (PEF_RECORD));
+ else { /* set config however it was previously */
+ memcpy (&PefRecord.rec_id, pef_array[idx - 1],
+ sizeof (PEF_RECORD));
+ if (PefRecord.severity == 0)
+ PefRecord.severity = pef_defaults[idx - 1][4];
+ }
+ }
+ else if ((idx == pefnum) && /* new OS Crit Stop entry */
+ (PefRecord.sensor_type == 0)) {
+ // Set PEF values for 0x20, OS Critical Stop event
+ PefRecord.severity = PEF_SEV_CRIT;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x20; /* OS Critical Stop */
+ PefRecord.sensor_no = 0xff;
+ PefRecord.event_trigger = 0x6f;
+ PefRecord.data1 = 0xff;
+ PefRecord.mask1 = 0x00;
+ }
+ else if ((idx == pefnum + 1) && /* new Power Redundancy entry */
+ (PefRecord.sensor_type == 0)) {
+ // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost
+ PefRecord.severity = PEF_SEV_WARN;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x09; /* Power Unit */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x0b; /* event trigger */
+ PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */
+ PefRecord.mask1 = 0x00;
+ }
+ else if (fSetPEFOks && idx == (pefnum + 2)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x0b; /* event trigger */
+ PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */
+ PefRecord.mask1 = 0x00;
+ }
+ else if (fSetPEFOks && idx == (pefnum + 3)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x01; /* Temp OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x81; /* event trigger */
+ PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
+ PefRecord.mask1 = 0x0a;
+ }
+ else if (fSetPEFOks && idx == (pefnum + 4)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x02; /* Voltage OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x81; /* event trigger */
+ PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
+ PefRecord.mask1 = 0x0a;
+ }
+ else if (fCustomPEF && idx == (pefnum + pefadd)) {
+ /* user entered 10 or 18 PEF entry bytes */
+ PefRecord.action = custPEF[0];
+ PefRecord.policy = custPEF[1];
+ PefRecord.severity = custPEF[2];
+ PefRecord.genid1 = custPEF[3];
+ PefRecord.genid2 = custPEF[4];
+ PefRecord.sensor_type = custPEF[5];
+ PefRecord.sensor_no = custPEF[6];
+ PefRecord.event_trigger = custPEF[7];
+ PefRecord.data1 = custPEF[8];
+ PefRecord.mask1 = custPEF[9];
+ memcpy (&PefRecord.action, custPEF, 18);
+ }
+ else {
+ memcpy (&PefRecord.rec_id, pef_array[idx - 1], sizeof (PEF_RECORD));
+ if (PefRecord.sensor_type == 0)
+ continue; /* if reserved, skip it */
+ }
+ if (fdebug && (PefRecord.rec_id != idx)) {
+ /* memcpy from pef_defaults or pef_array clobbered rec_id */
+ printf ("Warning: SetPef idx=%d, rec_id=%d\n", idx,
+ PefRecord.rec_id);
+ PefRecord.rec_id = (uchar) idx; /*fix it */
+ }
+ if (fdisable) {
+ /* Disable all PEF rules */
+ if (idx >= pefnum)
+ PefRecord.fconfig = 0x00; /*disabled, software */
+ else
+ PefRecord.fconfig = 0x40; /*disabled, preset */
+ PefRecord.action = 0x00;
+ PefRecord.policy = 0x00;
+ }
+ else { /*fenable */
+ if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */
+ /* Enable all non-empty PEF rules */
+ if (fCustomPEF && (idx == (pefnum + pefadd))) {
+ PefRecord.action = custPEF[0];
+ PefRecord.policy = custPEF[1];
}
- if (ival == 1) {
- authmask = pc[0]; /* auth type support mask */
- /* if (fmBMC) authmask is usually 0x15, else 0x14 */
- } else if (ival == 3) {
- if (IpIsValid(pc)) memcpy(bmcmyip,pc,4);
- } else if (ival == 5) {
- if (MacIsValid(pc)) memcpy(bmcmymac,pc,MAC_LEN);
- } else if (ival == 6) {
- if (SubnetIsValid(pc)) memcpy(bmcsubnet,pc,4);
- /* else if invalid, leave default as 255.255.255.0 */
- //} else if (ival == 7) {
- // if (pc[0] >= 30) memcpy(bparm7,pc,3);
- } else if (ival == 17) { /* num dest */
- ndest = pc[0]; /* save the number of destinations */
- } else if (ival == 12) { /* gateway addr */
- if (IpIsValid(pc)) memcpy(bmcgwyip,pc,4);
- } else if (ival == 13) { /* gateway mac */
- if (MacIsValid(pc)) memcpy(bmcgwymac,pc,MAC_LEN);
- } else if (ival == 19) { /* dest addr */
- if (IpIsValid(&pc[3])) memcpy(bmcdestip,&pc[3],4);
- if (MacIsValid(&pc[7])) memcpy(bmcdestmac,&pc[7],MAC_LEN);
- } else if (ival == 22) { /*Cipher Suite Support*/
- nciphers = pc[0];
+ else {
+ PefRecord.action = 0x01; /*Alert */
+ PefRecord.policy = 0x01; /*see Alert Policy #1 */
}
- /* now start to display data */
- if (ival == 16) { printf("%s \n",pc); /* string */
- } else if (ival == 194 && vend_id == VENDOR_KONTRON) {
- printf("%s \n",pc); /* string */
- } else if (ival == 201) { ; /* did it above */
- } else { /* print results for all other ival's */
- pstr = ""; /*interpreted meaning*/
- if (fcanonical) {
- switch(ival) {
- case 4: /*param 4, ip src*/
- if (pc[0] == SRC_STATIC) pstr = "Static"; /*0x01*/
- else if (pc[0] == SRC_DHCP) pstr = "DHCP"; /*0x02*/
- else if (pc[0] == SRC_BIOS) pstr = "BIOS"; /*0x03*/
- else pstr = "Other";
- printf("%s\n",pstr);
- break;
- case 5: /*param 5, mac addr*/
- case 13: /*param 6, def gwy mac*/
- printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
- pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]);
- break;
- case 3: /*param 4, ip address*/
- case 6: /*param 6, subnet mask*/
- case 12: /*param 12, def gwy ip*/
- case 14: /*param 14, sec gwy ip*/
- case 192: /*param 192, DHCP svr ip*/
- printf("%d.%d.%d.%d\n",pc[0], pc[1], pc[2], pc[3]);
- break;
- case 19: /*param 19, dest address*/
- if (idest == 1) {
- printf("IP=%d.%d.%d.%d "
- "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
- pc[3], pc[4], pc[5], pc[6],
- pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]);
- }
- break;
- case 102: /*param 102, IPv6 enable*/
- if (pc[0] == 0x01) printf("enabled\n");
- else printf("disabled\n");
- break;
- default:
- printf("%02x \n",pc[0]);
- break;
- }
- } else { /*not canonical */
- if (ival == 3 || ival == 6 || ival == 12 || ival == 14
- || ival == 192) {
- printf("%d.%d.%d.%d",pc[0], pc[1], pc[2], pc[3]);
- } else if (ival == 23) { /*Cipher Suites*/
- for (i = 1; i <= nciphers; i++) {
- if (pc[i] == 0) ncipher0 = pc[i];
- printf("%2d ",pc[i]);
- }
- } else if (ival == 24) { /*Cipher Suite Privi Levels*/
- j = 0;
- for (i = 1; i < 9; i++) {
- char c1, c2;
- char *p;
- p = parse_priv((pc[i] & 0x0f));
- c1 = p[0];
- p = parse_priv((pc[i] & 0xf0) >> 4);
- c2 = p[0];
- rgciphers[j++] = (pc[i] & 0x0f);
- rgciphers[j++] = ((pc[i] & 0xf0) >> 4);
- if ((i*2) >= nciphers) c2 = ' ';
- printf(" %c %c ",c1,c2);
- if ((i*2) > nciphers) break;
- }
- } else
- for (i = 0; i < sz; i++)
- {
- /* print in hex, decimal, or string, based on ival */
- if (ival == 1) { /* Auth type support */
- pstr = &mystr[0];
- getauthstr(authmask,pstr);
- printf("%02x ",authmask);
- } else if (ival == 4) { /* IP addr source */
- if (pc[i] == SRC_STATIC) pstr = "Static"; /*0x01*/
- else if (pc[i] == SRC_DHCP) pstr = "DHCP"; /*0x02*/
- else if (pc[i] == SRC_BIOS) pstr = "BIOS"; /*0x03*/
- else pstr = "Other";
- printf("%02x ",pc[i]);
- } else if (ival == 10) { /* grat ARP */
- mystr[0] = 0;
- if (pc[i] == 0) strcat(mystr,"ARP disabled ");
- else if (pc[i] & 0x01) strcat(mystr,"Grat-ARP enabled");
- else strcat(mystr,"Grat-ARP disabled");
- if (pc[i] & 0x02) strcat(mystr,", ARP-resp enabled");
- pstr = &mystr[0];
- printf("%02x ",pc[i]);
- } else if (ival == 11) { /* grat ARP interval */
- float f;
- f = (float)pc[i] / (float)2; /*500msec increments*/
- sprintf(mystr,"%.1f sec",f);
- pstr = &mystr[0];
- printf("%02x ",pc[i]);
- } else if (ival == 19) { /* dest addr */
- if (i > 2 && i < 7) {
- char *sepstr;
- if (i == 3) printf("[");
- if (i == 6) sepstr = "] ";
- else if (i >=3 && i < 6) sepstr = ".";
- else sepstr = " ";
- printf("%d%s",pc[i],sepstr); /* IP address in dec */
- }
- else printf("%02x ",pc[i]); /* show mac/etc. in hex */
- }
- else printf("%02x ",pc[i]); /* show in hex */
- } /*end for*/
- if (ival == 2) { /*Auth type enables*/
- pstr = &mystr[0];
- i = 0;
- if (lan_ch > 0) i = lan_ch - 1;
- getauthstr(pc[i],pstr);
- }
- if (pstr[0] != 0) printf(": %s\n",pstr);
- else printf("\n");
- } /*end-else not canonical*/
- } /*end-else others*/
- if (ival == 18 || ival == 19) {
- if (idest < ndest) {
- idest++;
- idx--; /* repeat this param*/
- } else idest = 1;
+ if (idx < pefnum) { /* special handling for presets, 1 thru 11 */
+ PefRecord.fconfig = 0x80; /* enabled, software */
+ ret = SetPefEntry (&PefRecord);
+ if (fdebug)
+ printf ("SetPefEntry(%d/80) ret=%d\n", PefRecord.rec_id, ret);
+ // if (ret != 0) { nerrs++; lasterr = ret; }
+ // else ngood++;
+ PefRecord.fconfig = 0xC0; /* enabled, preset */
}
- } else { /* ret != 0 */
- if (ival >= 20 && ival <= 25) { /*if errors, optional*/
- if (fdebug) printf("GetLanEntry(%d), ret = %d\n",ival,ret);
- } else
- printf("GetLanEntry(%d), ret = %d\n",ival,ret);
- if (ival == 17) ndest = 0; /*error getting num dest*/
- }
- } /*end for*/
- if (fRomley || fGrantley) { /*get LAN Failover param*/
- uchar b;
- ret = lan_failover_intel(0xFF,(uchar *)&b);
- if (ret != 0)
- printf("Intel Lan Failover, ret = %d\n",ret);
- else {
- if (b == 1) pstr = "enabled";
- else pstr = "disabled";
- if (fcanonical)
- printf("Intel Lan Failover %s%c %s\n",
- pspace3, bdelim,pstr);
- else printf("Intel Lan Failover %s%c %02x %c %s\n",
- pspace2, bdelim,b,bdelim,pstr);
- }
- }
- if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
- ret = oem_supermicro_get_lan_port(&bset);
- if (ret == 0) {
- pstr = oem_supermicro_lan_port_string(bset);
- if (fcanonical)
- printf("SuperMicro Lan Interface %s%c %s\n",
- pspace2, bdelim,pstr);
- else printf("SuperMicro Lan Interface %c %02x %c %s\n",
- bdelim,bset,bdelim,pstr);
- } else {
- if (fdebug) printf("oem_supermicro_get_lan_port error %d\n",ret);
- ret = 0; /*may not be supported on all smc plaforms*/
- }
- }
- // if (fmBMC) lan_access = 0x04; /*Admin*/
- // else lan_access = 0x04; /*Admin*/
- if (!fIPMI10) { /* Get SOL params */
- ret = GetSerialOverLan(lan_ch,0,0);
- if (ret != 0) printf("GetSOL error %d\n",ret);
- }
- for (i = 1; i <= show_users; i++)
- GetUser((uchar)i);
-
- if (fgetser && !fcanonical) {
- printf("\n%s, GetSerEntry ...\n",progname);
- if (fmBMC) /* mBMC doesn't support serial */
- printf("No serial channel support on this platform\n");
- else
- for (idx = 0; idx < NSER; idx++) {
- int ival;
- // if (idx == 9) continue; /* not implemented */
- ival = serparams[idx].cmd;
- if (ival == 201) {
- ret = GetChanAcc(ser_ch, 0x40, &LanRecord);
- } else {
- ret = GetSerEntry((uchar)ival, &LanRecord);
- }
- if (ret == 0) { // Show the SER record
- pc = (uchar *)&LanRecord;
- sz = serparams[idx].sz;
- printf("Serial Param(%d) %s: ",ival,serparams[idx].desc);
- if (idx == 10) { /* modem init string */
- pc[sz] = 0;
- printf("%02x %s\n",pc[0],&pc[1]);
- }
- else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */
- printf("%s\n",pc);
- }
- else {
- for (i = 0; i < sz; i++) {
- printf("%02x ",pc[i]); /* show in hex */
- }
- printf("\n");
- } /*end else*/
- }
- } /*end for*/
- } /*endif fgetser*/
-
- if (!freadonly) /* Set IPMI LAN enable/disable params. */
- {
- if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */
- printf("\nWarning: Setting LAN %d params while using a LAN channel.\n", lan_ch);
-
- {
- if (fenable && (fsharedMAC==0) && !lan_dhcp) {
- /* must have an IP from -I option */
- if (!IpIsValid(rgmyip)) { /* if not user-specified */
- if (IpIsValid(bmcmyip)) {
- memcpy(rgmyip,bmcmyip,4);
- if (fdebug) printf("Using current IP %d.%d.%d.%d\n",
- bmcmyip[0], bmcmyip[1],
- bmcmyip[2], bmcmyip[3]);
- } else {
- printf("\nNot shared BMC LAN, must specify a unique "
- "IP address via -I\n");
- ret = ERR_BAD_PARAM;
- goto do_exit;
- }
- }
- }
- /* Set LAN parameters. fenable or fdisable */
- printf("\n%s, SetLanEntry for channel %d ...\n",progname,lan_ch);
- /* use ifname to resolve MAC addresses below */
- if (fdisable) {
- if (!fIPMI10) {
- ret = DisablePef(alertnum);
- printf("DisablePef, ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- if (lan_user != 0) {
- j = DisableUser(lan_user); /*disable this lan user*/
- printf("DisableUser(%d), ret = %d\n",lan_user,j);
- if (j != 0) { nerrs++; lasterr = j; }
- else ngood++;
- }
- LanRecord.data[0] = 0x01; /* static IP address source */
- ret = SetLanEntry(4, &LanRecord, 1);
- printf("SetLanEntry(4), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- /* clear the BMC IP address */
- memset(&LanRecord,0,4);
- ret = SetLanEntry(3, &LanRecord, 4);
- printf("SetLanEntry(3), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- /* clear the gateway IP address */
- memset(&LanRecord,0,4);
- ret = SetLanEntry(12, &LanRecord, 4);
- printf("SetLanEntry(12), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- /* clear the gateway MAC address */
- memset(&LanRecord,0,6);
- ret = SetLanEntry(13, &LanRecord, 6);
- printf("SetLanEntry(13), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- } else if (fdisableSOL) {
- ret = SetupSerialOverLan(0); /*disable*/
- SELprintf("SetupSerialOverLan: ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- } else { /*fenable*/
- uchar chanctl;
- if (bmcpefctl != 0) chanctl = chan_pefon; /*previously on*/
- else chanctl = chan_pefoff;
- ret = SetChanAcc(lan_ch, 0x80, chanctl);
- if (fdebug) printf("SetChanAcc(lan/active), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- ret = SetChanAcc(lan_ch, 0x40, chanctl);
- if (fdebug) printf("SetChanAcc(lan/nonvol), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (flansecure) {
- j = DisableUser(0); /*disable the default null user*/
- printf("DisableUser(0), ret = %d\n",j);
- }
- ret = SetUser(lan_user,myuser,passwordData);
- printf("SetUser(%d), ret = %d\n",lan_user,ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- if (fdisable && (vend_id == VENDOR_SUPERMICROX
- || vend_id == VENDOR_SUPERMICRO) ) {
- failover_enable = 0; /*dedicated*/
- ret = oem_supermicro_set_lan_port(failover_enable);
- printf("Set SuperMicro Lan port to %s, ret = %d\n",
- oem_supermicro_lan_port_string(failover_enable),ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- }
-
- if (fdisable || fdisableSOL) {
- // if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs);
- goto do_exit;
- }
-
- if (authmask == 0) authmask = 0x17; /*if none from GetLanEntry(1)*/
- LanRecord.data[0] = (bAuth & authmask); /*Callback level*/
- LanRecord.data[1] = (bAuth & authmask); /*User level */
- LanRecord.data[2] = (bAuth & authmask); /*Operator level*/
- LanRecord.data[3] = (bAuth & authmask); /*Admin level */
- LanRecord.data[4] = 0; /*OEM level*/
- if (fdebug) printf("SetLanEntry(2): %02x %02x %02x %02x %02x\n",
- LanRecord.data[0],LanRecord.data[1],LanRecord.data[2],
- LanRecord.data[3],LanRecord.data[4]);
- ret = SetLanEntry(2, &LanRecord, 5);
- printf("SetLanEntry(2), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
-
- /* Get the values to use from Linux eth0, etc. */
- ret = Get_IPMac_Addr();
- if (lan_dhcp) { /* use DHCP */
- LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */
- /* = SRC_BIOS; * address source = BIOS using DHCP */
- ret = SetLanEntry(4, &LanRecord, 1);
- printf("SetLanEntry(4), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (MacIsValid(rgmymac)) {
- memcpy(&LanRecord,rgmymac,6);
- ret = SetLanEntry(5, &LanRecord, 6);
- if (ret == 0x82) { /*BMC may not allow the MAC to be set*/
- if (fdebug)
- printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret);
- } else {
- printf("SetLanEntry(5), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- }
-
- /* DHCP also relates to OEM LAN params 192, 193, 194 */
- if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC)
- { /*DHCP params 192-194 are Intel only*/
- if (IpIsValid(rgmyip))
- {
- /* Set DHCP Server IP in param 192 from -I param. */
- memcpy(&LanRecord,rgmyip,4);
- ret = SetLanEntry(192, &LanRecord, 4);
- printf("SetLanEntry(192), ret = %d\n",ret);
- if (!MacIsValid(rgdhcpmac)) /* if MAC not set yet */
- ret = Get_Mac(rgmyip,rgdhcpmac,NULL);
- if (ret == 0) {
- memcpy(&LanRecord,rgdhcpmac,MAC_LEN);
- ret = SetLanEntry(193, &LanRecord, MAC_LEN);
- printf("SetLanEntry(193), ret = %d\n",ret);
- }
- }
- LanRecord.data[0] = 0x01; /*enable DHCP*/
- ret = SetLanEntry(194, &LanRecord, 1);
- printf("SetLanEntry(194), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- } else { /* use static IP */
- printf("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
- lan_ch,ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
- rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3],
- rgmymac[4], rgmymac[5]);
- if (IpIsValid(rgmyip)) {
- if (lan_ch != gcm_ch) { /*skip if gcm*/
- LanRecord.data[0] = 0x00; /*disable grat arp while setting IP*/
- ret = SetLanEntry(10, &LanRecord, 1);
- if (fdebug) printf("SetLanEntry(10,0), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
+ else {
+ PefRecord.fconfig = 0x80; /* enabled, software */
}
- LanRecord.data[0] = 0x01; /* static IP address source */
- ret = SetLanEntry(4, &LanRecord, 1);
- printf("SetLanEntry(4), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- memcpy(&LanRecord,rgmyip,4);
- ret = SetLanEntry(3, &LanRecord, 4);
- printf("SetLanEntry(3), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (MacIsValid(rgmymac)) {
- memcpy(&LanRecord,rgmymac,6);
- ret = SetLanEntry(5, &LanRecord, 6);
- if (ret == 0x82) {
- /* Do not show anything, not an error if BMC does not
- allow the BMC MAC to be changed. */
- if (fdebug)
- printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret);
- } else {
- printf("SetLanEntry(5), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- }
- if (!SubnetIsValid(rgsubnet)) /* not specified, use previous */
- memcpy(rgsubnet,bmcsubnet,4);
- memcpy(&LanRecord,rgsubnet,4);
- ret = SetLanEntry(6, &LanRecord, 4);
- printf("SetLanEntry(6), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (vend_id != VENDOR_PEPPERCON) {
- /* may want to check bparm7 here */
- LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */
- LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */
- LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */
- ret = SetLanEntry(7, &LanRecord, 3);
- printf("SetLanEntry(7), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ } /*endif not empty */
+ }
+ { // Show the new PEF record before setting it.
+ pc = (uchar *) & PefRecord;
+ sz = 21;
+ printf ("PEFilter(%d): ", PefRecord.rec_id);
+ for (i = 0; i < sz; i++)
+ printf ("%02x ", pc[i]);
+ printf ("\n");
+ }
+ ret = SetPefEntry (&PefRecord);
+ if (fdebug)
+ printf ("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id, ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ } /*end for */
+ }
+ } /*end if not fIPMI10 */
+
+ if (!fcanonical)
+ printf ("\n%s, GetLanEntry for channel %d ...\n", progname, lan_ch);
+ idest = 1;
+ for (idx = 0; idx < NLAN; idx++) {
+ int ival;
+ if (fcanonical && (canon_param[idx] == 0))
+ continue;
+ if (idx == 8 || idx == 9)
+ continue; /* not implemented */
+ ival = lanparams[idx].cmd;
+ if (ival >= 96 && ival <= 98)
+ continue; /* not implemented */
+ if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters */
+ if (fipv6 == 0)
+ continue; /*skip these */
+ }
+ if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm */
+ lanparams[idx].sz = 36;
+ strcpy (lanparams[idx].desc, "IPMI Hostname");
+ }
+ else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters */
+ if (vend_id != VENDOR_INTEL)
+ continue;
+ if (fmBMC || fiBMC || fcanonical)
+ continue; /*skip these */
+ }
+ if (ival >= 20 && ival <= 25) {
+ if (!fIPMI20)
+ continue; /*VLAN params 20-25, fIPMI20 only/opt */
+ }
+ if ((ndest == 0) && (ival >= 18 && ival <= 19))
+ continue; /*skip dest */
+ if (ival == 11) { /*grat arp interval */
+ if (vend_id == VENDOR_SUPERMICROX)
+ continue;
+ if (vend_id == VENDOR_SUPERMICRO)
+ continue;
+ }
+ if (ival == 14 || ival == 15) { /*secondary gateway is optional */
+ if (vend_id == VENDOR_KONTRON)
+ continue;
+ }
+ if (ival == 201) { /*Get Channel Access */
+ ret = ShowChanAcc (lan_ch);
+ }
+ else {
+ if (ival == 18 || ival == 19) { /*dest params */
+ if (ndest == 0)
+ continue; /*skip if ndest==0 */
+ bset = (uchar) idest; /* dest id = 1 thru n */
+ }
+ else
+ bset = 0;
+ ret = GetLanEntry ((uchar) ival, bset, &LanRecord);
+ }
+ if (ret == 0) { // Show the LAN record
+ pc = (uchar *) & LanRecord;
+ sz = lanparams[idx].sz;
+ if (ival == 18) { /*skip if invalid dest type param */
+ if ((idest > 1) && (pc[2] == 0)) {
+ idest = 1;
+ continue;
+ }
+ }
+ else if (ival == 19) { /*skip if invalid dest addr param */
+ if ((idest > 1) && !IpIsValid (&pc[3])) {
+ idest = 1;
+ continue;
+ }
+ }
+ if (ival == 201); /* did it above */
+ else {
+ if (fcanonical) {
+ if ((ival == 19) && (idest > 1)); /*skip it */
+ else {
+ j = strlen_ (lanparams[idx].desc);
+ // (ival < 7) || (ival == 19) || ival == 102)
+ if (j <= 12)
+ pstr = pspace3;
+ else
+ pstr = pspace2;
+ printf ("Channel %d %s %s%c ", lan_ch,
+ lanparams[idx].desc, pstr, bdelim);
+ }
+ }
+ else
+ printf ("Lan Param(%d) %s: ", ival, lanparams[idx].desc);
+ }
+ if (ival == 1) {
+ authmask = pc[0]; /* auth type support mask */
+ /* if (fmBMC) authmask is usually 0x15, else 0x14 */
+ }
+ else if (ival == 3) {
+ if (IpIsValid (pc))
+ memcpy (bmcmyip, pc, 4);
+ }
+ else if (ival == 5) {
+ if (MacIsValid (pc))
+ memcpy (bmcmymac, pc, MAC_LEN);
+ }
+ else if (ival == 6) {
+ if (SubnetIsValid (pc))
+ memcpy (bmcsubnet, pc, 4);
+ /* else if invalid, leave default as 255.255.255.0 */
+ //} else if (ival == 7) {
+ // if (pc[0] >= 30) memcpy(bparm7,pc,3);
+ }
+ else if (ival == 17) { /* num dest */
+ ndest = pc[0]; /* save the number of destinations */
+ }
+ else if (ival == 12) { /* gateway addr */
+ if (IpIsValid (pc))
+ memcpy (bmcgwyip, pc, 4);
+ }
+ else if (ival == 13) { /* gateway mac */
+ if (MacIsValid (pc))
+ memcpy (bmcgwymac, pc, MAC_LEN);
+ }
+ else if (ival == 19) { /* dest addr */
+ if (IpIsValid (&pc[3]))
+ memcpy (bmcdestip, &pc[3], 4);
+ if (MacIsValid (&pc[7]))
+ memcpy (bmcdestmac, &pc[7], MAC_LEN);
+ }
+ else if (ival == 22) { /*Cipher Suite Support */
+ nciphers = pc[0];
+ }
+ /* now start to display data */
+ if (ival == 16) {
+ printf ("%s \n", pc); /* string */
+ }
+ else if (ival == 194 && vend_id == VENDOR_KONTRON) {
+ printf ("%s \n", pc); /* string */
+ }
+ else if (ival == 201) {; /* did it above */
+ }
+ else { /* print results for all other ival's */
+ pstr = ""; /*interpreted meaning */
+ if (fcanonical) {
+ switch (ival) {
+ case 4: /*param 4, ip src */
+ if (pc[0] == SRC_STATIC)
+ pstr = "Static"; /*0x01 */
+ else if (pc[0] == SRC_DHCP)
+ pstr = "DHCP"; /*0x02 */
+ else if (pc[0] == SRC_BIOS)
+ pstr = "BIOS"; /*0x03 */
+ else
+ pstr = "Other";
+ printf ("%s\n", pstr);
+ break;
+ case 5: /*param 5, mac addr */
+ case 13: /*param 6, def gwy mac */
+ printf ("%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]);
+ break;
+ case 3: /*param 4, ip address */
+ case 6: /*param 6, subnet mask */
+ case 12: /*param 12, def gwy ip */
+ case 14: /*param 14, sec gwy ip */
+ case 192: /*param 192, DHCP svr ip */
+ printf ("%d.%d.%d.%d\n", pc[0], pc[1], pc[2], pc[3]);
+ break;
+ case 19: /*param 19, dest address */
+ if (idest == 1) {
+ printf ("IP=%d.%d.%d.%d "
+ "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pc[3], pc[4], pc[5], pc[6],
+ pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]);
}
- /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */
- if (lan_ch != gcm_ch) { /*skip if gcm*/
- /* 01=enable grat arp, 02=enable arp resp, 03=both */
- LanRecord.data[0] = arp_ctl; /*grat arp*/
- ret = SetLanEntry(10, &LanRecord, 1);
- printf("SetLanEntry(10,%x), ret = %d\n",arp_ctl,ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ break;
+ case 102: /*param 102, IPv6 enable */
+ if (pc[0] == 0x01)
+ printf ("enabled\n");
+ else
+ printf ("disabled\n");
+ break;
+ default:
+ printf ("%02x \n", pc[0]);
+ break;
+ }
+ }
+ else { /*not canonical */
+ if (ival == 3 || ival == 6 || ival == 12 || ival == 14
+ || ival == 192) {
+ printf ("%d.%d.%d.%d", pc[0], pc[1], pc[2], pc[3]);
+ }
+ else if (ival == 23) { /*Cipher Suites */
+ for (i = 1; i <= nciphers; i++) {
+ if (pc[i] == 0)
+ ncipher0 = pc[i];
+ printf ("%2d ", pc[i]);
}
- LanRecord.data[0] = arp_interval; /*grat arp interval*/
- ret = SetLanEntry(11, &LanRecord, 1);
- printf("SetLanEntry(11), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) {
- LanRecord.data[0] = 0x00; /*disable DHCP*/
- ret = SetLanEntry(194, &LanRecord, 1);
- printf("SetLanEntry(194), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ }
+ else if (ival == 24) { /*Cipher Suite Privi Levels */
+ j = 0;
+ for (i = 1; i < 9; i++) {
+ char c1, c2;
+ char *p;
+ p = parse_priv ((pc[i] & 0x0f));
+ c1 = p[0];
+ p = parse_priv ((pc[i] & 0xf0) >> 4);
+ c2 = p[0];
+ rgciphers[j++] = (pc[i] & 0x0f);
+ rgciphers[j++] = ((pc[i] & 0xf0) >> 4);
+ if ((i * 2) >= nciphers)
+ c2 = ' ';
+ printf (" %c %c ", c1, c2);
+ if ((i * 2) > nciphers)
+ break;
}
- } else { /* error, don't continue */
- printf("Missing IP Address, can't continue. Use -I to specify\n");
- ret = ERR_BAD_PARAM;
- goto do_exit;
}
- if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) {
- /* set the IPMI Hostname if specified */
- sz = strlen_(rghostname);
- /* LanRecord is larger than rghostname, bounds ok */
- strncpy((char *)&LanRecord.data,rghostname,sz);
- ret = SetLanEntry(194, &LanRecord, sz);
- printf("SetLanEntry(194), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else {
- LanRecord.data[0] = 0x31;
- ret = SetLanEntry(195, &LanRecord, 1); /*re-read hostname*/
- // printf("SetLanEntry(195), ret = %d\n",ret);
- // if (ret != 0) { nerrs++; lasterr = ret; }
+ else
+ for (i = 0; i < sz; i++) {
+ /* print in hex, decimal, or string, based on ival */
+ if (ival == 1) { /* Auth type support */
+ pstr = &mystr[0];
+ getauthstr (authmask, pstr);
+ printf ("%02x ", authmask);
+ }
+ else if (ival == 4) { /* IP addr source */
+ if (pc[i] == SRC_STATIC)
+ pstr = "Static"; /*0x01 */
+ else if (pc[i] == SRC_DHCP)
+ pstr = "DHCP"; /*0x02 */
+ else if (pc[i] == SRC_BIOS)
+ pstr = "BIOS"; /*0x03 */
+ else
+ pstr = "Other";
+ printf ("%02x ", pc[i]);
+ }
+ else if (ival == 10) { /* grat ARP */
+ mystr[0] = 0;
+ if (pc[i] == 0)
+ strcat (mystr, "ARP disabled ");
+ else if (pc[i] & 0x01)
+ strcat (mystr, "Grat-ARP enabled");
+ else
+ strcat (mystr, "Grat-ARP disabled");
+ if (pc[i] & 0x02)
+ strcat (mystr, ", ARP-resp enabled");
+ pstr = &mystr[0];
+ printf ("%02x ", pc[i]);
+ }
+ else if (ival == 11) { /* grat ARP interval */
+ float f;
+ f = (float) pc[i] / (float) 2; /*500msec increments */
+ sprintf (mystr, "%.1f sec", f);
+ pstr = &mystr[0];
+ printf ("%02x ", pc[i]);
+ }
+ else if (ival == 19) { /* dest addr */
+ if (i > 2 && i < 7) {
+ char *sepstr;
+ if (i == 3)
+ printf ("[");
+ if (i == 6)
+ sepstr = "] ";
+ else if (i >= 3 && i < 6)
+ sepstr = ".";
+ else
+ sepstr = " ";
+ printf ("%d%s", pc[i], sepstr); /* IP address in dec */
+ }
+ else
+ printf ("%02x ", pc[i]); /* show mac/etc. in hex */
+ }
+ else
+ printf ("%02x ", pc[i]); /* show in hex */
+ } /*end for */
+ if (ival == 2) { /*Auth type enables */
+ pstr = &mystr[0];
+ i = 0;
+ if (lan_ch > 0)
+ i = lan_ch - 1;
+ getauthstr (pc[i], pstr);
+ }
+ if (pstr[0] != 0)
+ printf (": %s\n", pstr);
+ else
+ printf ("\n");
+ } /*end-else not canonical */
+ } /*end-else others */
+ if (ival == 18 || ival == 19) {
+ if (idest < ndest) {
+ idest++;
+ idx--; /* repeat this param */
+ }
+ else
+ idest = 1;
+ }
+ }
+ else { /* ret != 0 */
+ if (ival >= 20 && ival <= 25) { /*if errors, optional */
+ if (fdebug)
+ printf ("GetLanEntry(%d), ret = %d\n", ival, ret);
+ }
+ else
+ printf ("GetLanEntry(%d), ret = %d\n", ival, ret);
+ if (ival == 17)
+ ndest = 0; /*error getting num dest */
+ }
+ } /*end for */
+ if (fRomley || fGrantley) { /*get LAN Failover param */
+ uchar b;
+ ret = lan_failover_intel (0xFF, (uchar *) & b);
+ if (ret != 0)
+ printf ("Intel Lan Failover, ret = %d\n", ret);
+ else {
+ if (b == 1)
+ pstr = "enabled";
+ else
+ pstr = "disabled";
+ if (fcanonical)
+ printf ("Intel Lan Failover %s%c %s\n", pspace3, bdelim, pstr);
+ else
+ printf ("Intel Lan Failover %s%c %02x %c %s\n",
+ pspace2, bdelim, b, bdelim, pstr);
+ }
+ }
+ if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
+ ret = oem_supermicro_get_lan_port (&bset);
+ if (ret == 0) {
+ pstr = oem_supermicro_lan_port_string (bset);
+ if (fcanonical)
+ printf ("SuperMicro Lan Interface %s%c %s\n", pspace2, bdelim, pstr);
+ else
+ printf ("SuperMicro Lan Interface %c %02x %c %s\n",
+ bdelim, bset, bdelim, pstr);
+ }
+ else {
+ if (fdebug)
+ printf ("oem_supermicro_get_lan_port error %d\n", ret);
+ ret = 0; /*may not be supported on all smc plaforms */
+ }
+ }
+ // if (fmBMC) lan_access = 0x04; /*Admin*/
+ // else lan_access = 0x04; /*Admin*/
+ if (!fIPMI10) { /* Get SOL params */
+ ret = GetSerialOverLan (lan_ch, 0, 0);
+ if (ret != 0)
+ printf ("GetSOL error %d\n", ret);
+ }
+ for (i = 1; i <= show_users; i++)
+ GetUser ((uchar) i, lan_ch);
+
+ if (fgetser && !fcanonical) {
+ printf ("\n%s, GetSerEntry ...\n", progname);
+ if (fmBMC) /* mBMC doesn't support serial */
+ printf ("No serial channel support on this platform\n");
+ else
+ for (idx = 0; idx < NSER; idx++) {
+ int ival;
+ // if (idx == 9) continue; /* not implemented */
+ ival = serparams[idx].cmd;
+ if (ival == 201) {
+ ret = GetChanAcc (ser_ch, 0x40, &LanRecord);
+ }
+ else {
+ ret = GetSerEntry ((uchar) ival, &LanRecord);
+ }
+ if (ret == 0) { // Show the SER record
+ pc = (uchar *) & LanRecord;
+ sz = serparams[idx].sz;
+ printf ("Serial Param(%d) %s: ", ival, serparams[idx].desc);
+ if (idx == 10) { /* modem init string */
+ pc[sz] = 0;
+ printf ("%02x %s\n", pc[0], &pc[1]);
+ }
+ else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */
+ printf ("%s\n", pc);
+ }
+ else {
+ for (i = 0; i < sz; i++) {
+ printf ("%02x ", pc[i]); /* show in hex */
}
+ printf ("\n");
+ } /*end else */
+ }
+ } /*end for */
+ } /*endif fgetser */
+
+ if (!freadonly) { /* Set IPMI LAN enable/disable params. */
+ if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */
+ printf ("\nWarning: Setting LAN %d params while using a LAN channel.\n",
+ lan_ch);
+
+ {
+ if (fenable && (fsharedMAC == 0) && !lan_dhcp) {
+ /* must have an IP from -I option */
+ if (!IpIsValid (rgmyip)) { /* if not user-specified */
+ if (IpIsValid (bmcmyip)) {
+ memcpy (rgmyip, bmcmyip, 4);
+ if (fdebug)
+ printf ("Using current IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1], bmcmyip[2], bmcmyip[3]);
}
- if (IpIsValid(rggwyip)) {
- if (!MacIsValid(rggwymac)) /* if gwy MAC not set by user */
- ret = Get_Mac(rggwyip,rggwymac,NULL);
- printf("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
- rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3],
- rggwymac[0], rggwymac[1], rggwymac[2], rggwymac[3],
- rggwymac[4], rggwymac[5]);
- if (!SubnetIsSame(rgmyip,rggwyip,rgsubnet)) {
- printf("WARNING: IP Address and Gateway are not on the same subnet,"
- " setting Gateway to previous value\n");
- memcpy(rggwyip,bmcgwyip,4);
- memcpy(rggwymac,bmcgwymac,6);
+ else {
+ printf ("\nNot shared BMC LAN, must specify a unique "
+ "IP address via -I\n");
+ ret = ERR_BAD_PARAM;
+ goto do_exit;
+ }
+ }
+ }
+ /* Set LAN parameters. fenable or fdisable */
+ printf ("\n%s, SetLanEntry for channel %d ...\n", progname, lan_ch);
+ /* use ifname to resolve MAC addresses below */
+ if (fdisable) {
+ if (!fIPMI10) {
+ ret = DisablePef (alertnum);
+ printf ("DisablePef, ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ if (lan_user != 0) {
+ j = DisableUser (lan_user, lan_ch); /*disable this lan user */
+ printf ("DisableUser(%d), ret = %d\n", lan_user, j);
+ if (j != 0) {
+ nerrs++;
+ lasterr = j;
+ }
+ else
+ ngood++;
+ }
+ LanRecord.data[0] = 0x01; /* static IP address source */
+ ret = SetLanEntry (4, &LanRecord, 1);
+ printf ("SetLanEntry(4), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ /* clear the BMC IP address */
+ memset (&LanRecord, 0, 4);
+ ret = SetLanEntry (3, &LanRecord, 4);
+ printf ("SetLanEntry(3), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ /* clear the gateway IP address */
+ memset (&LanRecord, 0, 4);
+ ret = SetLanEntry (12, &LanRecord, 4);
+ printf ("SetLanEntry(12), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ /* clear the gateway MAC address */
+ memset (&LanRecord, 0, 6);
+ ret = SetLanEntry (13, &LanRecord, 6);
+ printf ("SetLanEntry(13), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ else if (fdisableSOL) {
+ ret = SetupSerialOverLan (0); /*disable */
+ SELprintf ("SetupSerialOverLan: ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ else { /*fenable */
+ uchar chanctl;
+ if (bmcpefctl != 0)
+ chanctl = chan_pefon; /*previously on */
+ else
+ chanctl = chan_pefoff;
+ ret = SetChanAcc (lan_ch, 0x80, chanctl);
+ if (fdebug)
+ printf ("SetChanAcc(lan/active), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ ret = SetChanAcc (lan_ch, 0x40, chanctl);
+ if (fdebug)
+ printf ("SetChanAcc(lan/nonvol), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ if (flansecure) {
+ j = DisableUser (0, lan_ch); /*disable the default null user */
+ printf ("DisableUser(0), ret = %d\n", j);
+ }
+ ret = SetUser (lan_user, myuser, passwordData, lan_ch);
+ printf ("SetUser(%d), ret = %d\n", lan_user, ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ if (fdisable && (vend_id == VENDOR_SUPERMICROX
+ || vend_id == VENDOR_SUPERMICRO)) {
+ failover_enable = 0; /*dedicated */
+ ret = oem_supermicro_set_lan_port (failover_enable);
+ printf ("Set SuperMicro Lan port to %s, ret = %d\n",
+ oem_supermicro_lan_port_string (failover_enable), ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ }
+
+ if (fdisable || fdisableSOL) {
+// if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs);
+ goto do_exit;
+ }
+
+ if (authmask == 0)
+ authmask = 0x17; /*if none from GetLanEntry(1) */
+ LanRecord.data[0] = (bAuth & authmask); /*Callback level */
+ LanRecord.data[1] = (bAuth & authmask); /*User level */
+ LanRecord.data[2] = (bAuth & authmask); /*Operator level */
+ LanRecord.data[3] = (bAuth & authmask); /*Admin level */
+ LanRecord.data[4] = 0; /*OEM level */
+ if (fdebug)
+ printf ("SetLanEntry(2): %02x %02x %02x %02x %02x\n",
+ LanRecord.data[0], LanRecord.data[1], LanRecord.data[2],
+ LanRecord.data[3], LanRecord.data[4]);
+ ret = SetLanEntry (2, &LanRecord, 5);
+ printf ("SetLanEntry(2), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+
+ /* Get the values to use from Linux eth0, etc. */
+ ret = Get_IPMac_Addr ();
+ if (lan_dhcp) { /* use DHCP */
+ LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */
+ /* = SRC_BIOS; * address source = BIOS using DHCP */
+ ret = SetLanEntry (4, &LanRecord, 1);
+ printf ("SetLanEntry(4), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ if (MacIsValid (rgmymac)) {
+ memcpy (&LanRecord, rgmymac, 6);
+ ret = SetLanEntry (5, &LanRecord, 6);
+ if (ret == 0x82) { /*BMC may not allow the MAC to be set */
+ if (fdebug)
+ printf ("SetLanEntry(5), ret = %x cannot modify MAC\n", ret);
+ }
+ else {
+ printf ("SetLanEntry(5), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
}
+ else
+ ngood++;
+ }
+ }
- /* Set the Default Gateway IP & MAC */
- memcpy(&LanRecord,rggwyip,4);
- ret = SetLanEntry(12, &LanRecord, 4);
- printf("SetLanEntry(12), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (!MacIsValid(rggwymac)) { /* if gwy MAC not resolved */
- printf(" Warning: Gateway MAC address was not resolved! "
- "Check %s interface, use -i ethN, or use -H gwymac.\n",
- ifname);
- memcpy(&LanRecord,bmcgwymac,6);
- } else {
- memcpy(&LanRecord,rggwymac,6);
+ /* DHCP also relates to OEM LAN params 192, 193, 194 */
+ if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) { /*DHCP params 192-194 are Intel only */
+ if (IpIsValid (rgmyip)) {
+ /* Set DHCP Server IP in param 192 from -I param. */
+ memcpy (&LanRecord, rgmyip, 4);
+ ret = SetLanEntry (192, &LanRecord, 4);
+ printf ("SetLanEntry(192), ret = %d\n", ret);
+ if (!MacIsValid (rgdhcpmac)) /* if MAC not set yet */
+ ret = Get_Mac (rgmyip, rgdhcpmac, NULL);
+ if (ret == 0) {
+ memcpy (&LanRecord, rgdhcpmac, MAC_LEN);
+ ret = SetLanEntry (193, &LanRecord, MAC_LEN);
+ printf ("SetLanEntry(193), ret = %d\n", ret);
}
- ret = SetLanEntry(13, &LanRecord, 6);
- printf("SetLanEntry(13), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
}
- if (IpIsValid(rggwy2ip)) {
- if (!MacIsValid(rggwy2mac)) /* if gwy2 MAC not set by user */
- ret = Get_Mac(rggwy2ip,rggwy2mac,NULL);
- /* Set the Secondary Gateway IP & MAC */
- memcpy(&LanRecord,rggwy2ip,4);
- ret = SetLanEntry(14, &LanRecord, 4);
- printf("SetLanEntry(14), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- memcpy(&LanRecord,rggwy2mac,6);
- ret = SetLanEntry(15, &LanRecord, 6);
- printf("SetLanEntry(15), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ LanRecord.data[0] = 0x01; /*enable DHCP */
+ ret = SetLanEntry (194, &LanRecord, 1);
+ printf ("SetLanEntry(194), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
}
- } /* end-else static IP */
- if (flansecure) { /* disable cipher 0 */
- char c1, c2;
- memset(&LanRecord,0,12);
- j = 1;
- for (i = 0; i < nciphers; i+=2) {
- c1 = rgciphers[i];
- c2 = rgciphers[i+1];
- /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */
- if (i == ncipher0) c1 = 0x00;
- if ((i+1) == ncipher0) c2 = 0x00;
- LanRecord.data[j++] = (c2 << 4) | c1;
+ else
+ ngood++;
+ }
+ }
+ else { /* use static IP */
+ printf
+ ("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ lan_ch, ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+ rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3], rgmymac[4],
+ rgmymac[5]);
+ if (IpIsValid (rgmyip)) {
+ if (lan_ch != gcm_ch) { /*skip if gcm */
+ LanRecord.data[0] = 0x00; /*disable grat arp while setting IP */
+ ret = SetLanEntry (10, &LanRecord, 1);
+ if (fdebug)
+ printf ("SetLanEntry(10,0), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
}
- ret = SetLanEntry(24, &LanRecord, 9);
- printf("SetLanEntry(24) disable cipher0, ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- }
- ret = SetupSerialOverLan(1); /*enable*/
- SELprintf("SetupSerialOverLan: ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- if (!IpIsValid(rgdestip) && IpIsValid(bmcdestip)) {
- memcpy(rgdestip,bmcdestip,4);
- if (fdebug) printf("Using current dest IP %d.%d.%d.%d\n",
- bmcdestip[0], bmcdestip[1],
- bmcdestip[2], bmcdestip[3]);
- }
- if (ndest == 0) {
- if (fdebug) printf("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n",
- alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3]);
- printf("alert dest \tnot supported\n");
- } else if (!IpIsValid(rgdestip)) {
- printf("alert dest \taddress not specified\n");
- } else { /* valid alert dest ip */
- if (!MacIsValid(rgdestmac)) /* if dest MAC not set by user */
- ret = Get_Mac(rgdestip,rgdestmac,NULL); /*try to resolve MAC */
- if (!MacIsValid(rgdestmac)) { /* if dest MAC not resolved */
- printf(" Warning: Alert mac address was not resolved!"
- " Check %s interface or use -i.\n",ifname);
- /* use existing BMC alert dest mac (as best guess) */
- memcpy(rgdestmac,bmcdestmac,6);
+ }
+ LanRecord.data[0] = 0x01; /* static IP address source */
+ ret = SetLanEntry (4, &LanRecord, 1);
+ printf ("SetLanEntry(4), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ memcpy (&LanRecord, rgmyip, 4);
+ ret = SetLanEntry (3, &LanRecord, 4);
+ printf ("SetLanEntry(3), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ if (MacIsValid (rgmymac)) {
+ memcpy (&LanRecord, rgmymac, 6);
+ ret = SetLanEntry (5, &LanRecord, 6);
+ if (ret == 0x82) {
+
+ /* Do not show anything, not an error if BMC does not
+ allow the BMC MAC to be changed. */
+ if (fdebug)
+
+ printf ("SetLanEntry(5), ret = %x cannot modify MAC\n", ret);
}
- /* show destination data */
- printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
- alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
- rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
- rgdestmac[4], rgdestmac[5]);
- printf("snmp community \t%s\n",rgcommunity);
- /* Only need the SNMP community if there is an Alert Destination */
- memset(&LanRecord.data[0], 0, 18); /* make sure zero-filled */
- strcpy((char *)&LanRecord.data[0],rgcommunity);
- ret = SetLanEntry(16, &LanRecord, 18);
- printf("SetLanEntry(16), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- /* Set Alert Destination Type */
- LanRecord.data[0] = alertnum; /* dest id = 1 */
- LanRecord.data[1] = 0x00; /* dest type = PET, no ack */
- LanRecord.data[2] = 0x01; /* ack timeout / retry interval */
- LanRecord.data[3] = 0x00; /* no retries */
- // LanRecord.data[4] = 0x69;
- ret = SetLanEntry(18, &LanRecord, 4);
- printf("SetLanEntry(18), ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- {
- /* Set the Alert Destination IP & MAC (param 19) */
- LanRecord.data[0] = alertnum; /* dest id = 1 */
- LanRecord.data[1] = 0x00;
- LanRecord.data[2] = 0x00;
- memcpy(&LanRecord.data[3],rgdestip,4);
- memcpy(&LanRecord.data[7],rgdestmac,6);
- ret = SetLanEntry(19, &LanRecord, 13);
- printf("SetLanEntry(19), ret = %d\n", ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ else {
+
+ printf ("SetLanEntry(5), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
}
- } /*endif valid alert*/
-
- /* Now enable PEF since we have an Alert destination. */
- if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable*/
- ret = EnablePef(alertnum);
- printf("EnablePef, ret = %d\n",ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- /* ChanAcc changed, so show it again */
- j = ShowChanAcc(lan_ch);
- }
-
- if ((vlan_enable != PARM_INIT) && (fIPMI20)) {
- if (vlan_enable == 0) { /*disable vlan*/
- LanRecord.data[0] = 0x00;
- LanRecord.data[1] = 0x00;
- ret = SetLanEntry(20, &LanRecord, 2);
- printf("SetLanEntry(20,disable) ret = %d\n", ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- } else { /*vlan_enable == 1, enable vlan with id */
- LanRecord.data[0] = (vlan_id & 0x00ff);
- LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80;
- ret = SetLanEntry(20, &LanRecord, 2);
- printf("SetLanEntry(20,%d), ret = %d\n", vlan_id,ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
- LanRecord.data[0] = vlan_prio;
- ret = SetLanEntry(21, &LanRecord, 1);
- printf("SetLanEntry(21), ret = %d\n", ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- else ngood++;
+ }
+ if (!SubnetIsValid (rgsubnet)) /* not specified, use previous */
+ memcpy (rgsubnet, bmcsubnet, 4);
+ memcpy (&LanRecord, rgsubnet, 4);
+ ret = SetLanEntry (6, &LanRecord, 4);
+ printf ("SetLanEntry(6), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ if (vend_id != VENDOR_PEPPERCON) {
+ /* may want to check bparm7 here */
+ LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */
+ LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */
+ LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */
+ ret = SetLanEntry (7, &LanRecord, 3);
+ printf ("SetLanEntry(7), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
}
- }
- if (failover_enable != PARM_INIT) {
- if (fRomley || fGrantley) {
- if (failover_enable > 1) failover_enable = 0; /*default*/
- ret = lan_failover_intel(failover_enable,(uchar *)&i);
- printf("Set Intel Lan Failover (%d), ret = %d\n",
- failover_enable,ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- } else if (vend_id == VENDOR_SUPERMICROX
- || vend_id == VENDOR_SUPERMICRO) {
- if (failover_enable > 2) failover_enable = 2; /*default*/
- ret = oem_supermicro_set_lan_port(failover_enable);
- printf("Set SuperMicro Lan port to %s, ret = %d\n",
- oem_supermicro_lan_port_string(failover_enable),ret);
- if (ret != 0) { nerrs++; lasterr = ret; }
- }
- } /*endif failover specified*/
- } /*end-else not via ipmi_lan*/
- } /*endif not readonly*/
-
- if (flanstats)
- { /* get BMC LAN Statistics */
+ else
+ ngood++;
+ }
+ /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */
+ if (lan_ch != gcm_ch) { /*skip if gcm */
+ /* 01=enable grat arp, 02=enable arp resp, 03=both */
+ LanRecord.data[0] = arp_ctl; /*grat arp */
+ ret = SetLanEntry (10, &LanRecord, 1);
+ printf ("SetLanEntry(10,%x), ret = %d\n", arp_ctl, ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ LanRecord.data[0] = arp_interval; /*grat arp interval */
+ ret = SetLanEntry (11, &LanRecord, 1);
+ printf ("SetLanEntry(11), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) {
+ LanRecord.data[0] = 0x00; /*disable DHCP */
+ ret = SetLanEntry (194, &LanRecord, 1);
+ printf ("SetLanEntry(194), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ }
+ else { /* error, don't continue */
+ printf ("Missing IP Address, can't continue. Use -I to specify\n");
+ ret = ERR_BAD_PARAM;
+ goto do_exit;
+ }
+ if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) {
+ /* set the IPMI Hostname if specified */
+ sz = strlen_ (rghostname);
+ /* LanRecord is larger than rghostname, bounds ok */
+ strncpy ((char *) &LanRecord.data, rghostname, sz);
+ ret = SetLanEntry (194, &LanRecord, sz);
+ printf ("SetLanEntry(194), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else {
+ LanRecord.data[0] = 0x31;
+ ret = SetLanEntry (195, &LanRecord, 1); /*re-read hostname */
+ // printf("SetLanEntry(195), ret = %d\n",ret);
+ // if (ret != 0) { nerrs++; lasterr = ret; }
+ }
+ }
+ if (IpIsValid (rggwyip)) {
+ if (!MacIsValid (rggwymac)) /* if gwy MAC not set by user */
+ ret = Get_Mac (rggwyip, rggwymac, NULL);
+ printf
+ ("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3], rggwymac[0],
+ rggwymac[1], rggwymac[2], rggwymac[3], rggwymac[4], rggwymac[5]);
+ if (!SubnetIsSame (rgmyip, rggwyip, rgsubnet)) {
+ printf
+ ("WARNING: IP Address and Gateway are not on the same subnet,"
+ " setting Gateway to previous value\n");
+ memcpy (rggwyip, bmcgwyip, 4);
+ memcpy (rggwymac, bmcgwymac, 6);
+ }
+
+ /* Set the Default Gateway IP & MAC */
+ memcpy (&LanRecord, rggwyip, 4);
+ ret = SetLanEntry (12, &LanRecord, 4);
+ printf ("SetLanEntry(12), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ if (!MacIsValid (rggwymac)) { /* if gwy MAC not resolved */
+ printf (" Warning: Gateway MAC address was not resolved! "
+ "Check %s interface, use -i ethN, or use -H gwymac.\n",
+ ifname);
+ memcpy (&LanRecord, bmcgwymac, 6);
+ }
+ else {
+ memcpy (&LanRecord, rggwymac, 6);
+ }
+ ret = SetLanEntry (13, &LanRecord, 6);
+ printf ("SetLanEntry(13), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ if (IpIsValid (rggwy2ip)) {
+ if (!MacIsValid (rggwy2mac)) /* if gwy2 MAC not set by user */
+ ret = Get_Mac (rggwy2ip, rggwy2mac, NULL);
+ /* Set the Secondary Gateway IP & MAC */
+ memcpy (&LanRecord, rggwy2ip, 4);
+ ret = SetLanEntry (14, &LanRecord, 4);
+ printf ("SetLanEntry(14), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ memcpy (&LanRecord, rggwy2mac, 6);
+ ret = SetLanEntry (15, &LanRecord, 6);
+ printf ("SetLanEntry(15), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ } /* end-else static IP */
+ if (flansecure) { /* disable cipher 0 */
+ char c1, c2;
+ memset (&LanRecord, 0, 12);
+ j = 1;
+ for (i = 0; i < nciphers; i += 2) {
+ c1 = rgciphers[i];
+ c2 = rgciphers[i + 1];
+ /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */
+ if (i == ncipher0)
+ c1 = 0x00;
+ if ((i + 1) == ncipher0)
+ c2 = 0x00;
+ LanRecord.data[j++] = (c2 << 4) | c1;
+ }
+ ret = SetLanEntry (24, &LanRecord, 9);
+ printf ("SetLanEntry(24) disable cipher0, ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ ret = SetupSerialOverLan (1); /*enable */
+ SELprintf ("SetupSerialOverLan: ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else ngood++;
+ if (!IpIsValid (rgdestip) && IpIsValid (bmcdestip)) {
+ memcpy (rgdestip, bmcdestip, 4);
+ if (fdebug)
+ printf ("Using current dest IP %d.%d.%d.%d\n",
+ bmcdestip[0], bmcdestip[1], bmcdestip[2], bmcdestip[3]);
+ }
+ if (ndest == 0) {
+ if (fdebug)
+ printf ("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n",
+ alertnum, rgdestip[0], rgdestip[1], rgdestip[2],
+ rgdestip[3]);
+ printf ("alert dest \tnot supported\n");
+ }
+ else if (!IpIsValid (rgdestip)) {
+ printf ("alert dest \taddress not specified\n");
+ }
+ else { /* valid alert dest ip */
+ if (!MacIsValid (rgdestmac)) /* if dest MAC not set by user */
+ ret = Get_Mac (rgdestip, rgdestmac, NULL); /*try to resolve MAC */
+ if (!MacIsValid (rgdestmac)) { /* if dest MAC not resolved */
+ printf (" Warning: Alert mac address was not resolved!"
+ " Check %s interface or use -i.\n", ifname);
+ /* use existing BMC alert dest mac (as best guess) */
+ memcpy (rgdestmac, bmcdestmac, 6);
+ }
+ /* show destination data */
+ printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
+ rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
+ rgdestmac[4], rgdestmac[5]);
+ printf ("snmp community \t%s\n", rgcommunity);
+ /* Only need the SNMP community if there is an Alert Destination */
+ memset (&LanRecord.data[0], 0, 18); /* make sure zero-filled */
+ strcpy ((char *) &LanRecord.data[0], rgcommunity);
+ ret = SetLanEntry (16, &LanRecord, 18);
+ printf ("SetLanEntry(16), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ /* Set Alert Destination Type */
+ LanRecord.data[0] = alertnum; /* dest id = 1 */
+ LanRecord.data[1] = 0x00; /* dest type = PET, no ack */
+ LanRecord.data[2] = 0x01; /* ack timeout / retry interval */
+ LanRecord.data[3] = 0x00; /* no retries */
+ // LanRecord.data[4] = 0x69;
+ ret = SetLanEntry (18, &LanRecord, 4);
+ printf ("SetLanEntry(18), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else ngood++;
+ {
+ /* Set the Alert Destination IP & MAC (param 19) */
+ LanRecord.data[0] = alertnum; /* dest id = 1 */
+ LanRecord.data[1] = 0x00;
+ LanRecord.data[2] = 0x00;
+ memcpy (&LanRecord.data[3], rgdestip, 4);
+ memcpy (&LanRecord.data[7], rgdestmac, 6);
+ ret = SetLanEntry (19, &LanRecord, 13);
+ printf ("SetLanEntry(19), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else ngood++;
+ }
+ } /*endif valid alert */
+
+ /* Now enable PEF since we have an Alert destination. */
+ if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable */
+ ret = EnablePef (alertnum);
+ printf ("EnablePef, ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ /* ChanAcc changed, so show it again */
+ j = ShowChanAcc (lan_ch);
+ }
+
+ if ((vlan_enable != PARM_INIT) && (fIPMI20)) {
+ if (vlan_enable == 0) { /*disable vlan */
+ LanRecord.data[0] = 0x00;
+ LanRecord.data[1] = 0x00;
+ ret = SetLanEntry (20, &LanRecord, 2);
+ printf ("SetLanEntry(20,disable) ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ else { /*vlan_enable == 1, enable vlan with id */
+ LanRecord.data[0] = (vlan_id & 0x00ff);
+ LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80;
+ ret = SetLanEntry (20, &LanRecord, 2);
+ printf ("SetLanEntry(20,%d), ret = %d\n", vlan_id, ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ LanRecord.data[0] = vlan_prio;
+ ret = SetLanEntry (21, &LanRecord, 1);
+ printf ("SetLanEntry(21), ret = %d\n", ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ else
+ ngood++;
+ }
+ }
+ if (failover_enable != PARM_INIT) {
+ if (fRomley || fGrantley) {
+ if (failover_enable > 1)
+ failover_enable = 0; /*default */
+ ret = lan_failover_intel (failover_enable, (uchar *) & i);
+ printf ("Set Intel Lan Failover (%d), ret = %d\n",
+ failover_enable, ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ }
+ else if (vend_id == VENDOR_SUPERMICROX
+ || vend_id == VENDOR_SUPERMICRO) {
+ if (failover_enable > 2)
+ failover_enable = 2; /*default */
+ ret = oem_supermicro_set_lan_port (failover_enable);
+ printf ("Set SuperMicro Lan port to %s, ret = %d\n",
+ oem_supermicro_lan_port_string (failover_enable), ret);
+ if (ret != 0) {
+ nerrs++;
+ lasterr = ret;
+ }
+ }
+ } /*endif failover specified */
+ } /*end-else not via ipmi_lan */
+ } /*endif not readonly */
+
+ if (flanstats) { /* get BMC LAN Statistics */
#ifdef METACOMMAND
- j = get_lan_stats(lan_ch);
+ j = get_lan_stats (lan_ch);
#else
- uchar idata[2];
- uchar rdata[20];
- int rlen;
- uchar cc;
- idata[0] = lan_ch;
- idata[1] = 0x00; /*do not clear stats*/
- rlen = sizeof(rdata);
- j = ipmi_cmd(GET_LAN_STATS, idata,2, rdata,&rlen, &cc, fdebug);
- if (j == 0) { /*show BMC LAN stats*/
- ushort *rw;
- rw = (ushort *)&rdata[0];
- printf("IPMI LAN channel %d statistics: \n",lan_ch);
- printf(" \tReceived IP Packets = %d\n",rw[0]);
- printf(" \tRecvd IP Header errors = %d\n",rw[1]);
- printf(" \tRecvd IP Address errors = %d\n",rw[2]);
- printf(" \tRecvd IP Fragments = %d\n",rw[3]);
- printf(" \tTransmitted IP Packets = %d\n",rw[4]);
- printf(" \tReceived UDP Packets = %d\n",rw[5]);
- printf(" \tReceived Valid RMCP Pkts = %d\n",rw[6]);
- printf(" \tReceived UDP Proxy Pkts = %d\n",rw[7]);
- printf(" \tDropped UDP Proxy Pkts = %d\n",rw[8]);
- }
+ uchar idata[2];
+ uchar rdata[20];
+ int rlen;
+ uchar cc;
+ idata[0] = lan_ch;
+ idata[1] = 0x00; /*do not clear stats */
+ rlen = sizeof (rdata);
+ j = ipmi_cmd (GET_LAN_STATS, idata, 2, rdata, &rlen, &cc, fdebug);
+ if (j == 0) { /*show BMC LAN stats */
+ ushort *rw;
+ rw = (ushort *) & rdata[0];
+ printf ("IPMI LAN channel %d statistics: \n", lan_ch);
+ printf (" \tReceived IP Packets = %d\n", rw[0]);
+ printf (" \tRecvd IP Header errors = %d\n", rw[1]);
+ printf (" \tRecvd IP Address errors = %d\n", rw[2]);
+ printf (" \tRecvd IP Fragments = %d\n", rw[3]);
+ printf (" \tTransmitted IP Packets = %d\n", rw[4]);
+ printf (" \tReceived UDP Packets = %d\n", rw[5]);
+ printf (" \tReceived Valid RMCP Pkts = %d\n", rw[6]);
+ printf (" \tReceived UDP Proxy Pkts = %d\n", rw[7]);
+ printf (" \tDropped UDP Proxy Pkts = %d\n", rw[8]);
+ }
#endif
- }
+ }
do_exit:
- ipmi_close_();
- if (foptmsg) {
- if (fset_ip != 0)
- printf("WARNING: IP address options were specified, but no -e,-l,-d option.\n");
- else
- printf("WARNING: %d options were specified, but no -e,-l,-d option.\n",
- nopts);
- printf("Read-only usage assumed.\n");
- }
- if (nerrs > 0) {
- printf("Warning: %d ok, %d errors occurred, last error = %d\n",ngood,nerrs,lasterr);
- ret = lasterr;
- }
- // show_outcome(progname,ret);
- return(ret);
-} /* end main()*/
+ ipmi_close_ ();
+ if (foptmsg) {
+ if (fset_ip != 0)
+ printf
+ ("WARNING: IP address options were specified, but no -e,-l,-d option.\n");
+ else
+ printf ("WARNING: %d options were specified, but no -e,-l,-d option.\n",
+ nopts);
+ printf ("Read-only usage assumed.\n");
+ }
+ if (nerrs > 0) {
+ printf ("Warning: %d ok, %d errors occurred, last error = %d\n", ngood,
+ nerrs, lasterr);
+ ret = lasterr;
+ }
+ // show_outcome(progname,ret);
+ return (ret);
+} /* end main() */
/* end ilan.c */
diff --git a/util/ilan.c~ b/util/ilan.c~
new file mode 100644
index 0000000..7d91d55
--- /dev/null
+++ b/util/ilan.c~
@@ -0,0 +1,5242 @@
+/*---------------------------------------------------------------------------
+ * Filename: ilan.c (was pefconfig.c)
+ *
+ * Author: arcress at users.sourceforge.net
+ * Copyright (c) 2009 Kontron America, Inc.
+ *
+ * Abstract:
+ * This tool sets up the custom Platform Event Filter for the panicSEL
+ * record (0x20, OS Critical Stop) to send a PEF SNMP alert for Linux
+ * panics. It also configures the BMC LAN parameters, which are needed
+ * to support PEF alerts.
+ *
+ * ----------- Change History -----------------------------------------------
+ * 10/16/01 Andy Cress - created
+ * 10/24/01 Andy Cress - mods for SetPefEntry(0c)
+ * 11/02/01 Andy Cress - added option to disable a given PefEntry
+ * 11/15/01 Andy Cress - added function to GetLanEntry
+ * 11/19/01 Andy Cress - added function to SetLanEntry
+ * 01/18/02 Andy Cress - added GetCfgData function
+ * 01/31/02 Andy Cress - converted to use ipmi_cmd_ia
+ * 02/06/02 Andy Cress - removed GetCfgData
+ * 02/06/02 Andy Cress - added ipmi_cmd_va
+ * 02/08/02 Andy Cress - added GetChanAcc
+ * 02/14/02 Andy Cress - added Get_IPMac_Addr()
+ * 02/21/02 Andy Cress - added Alert IP/MAC logic to Get_IPMac_Addr()
+ * 03/21/02 Andy Cress - do SetChanAcc(0x80) with every SetChanAcc(0x40)
+ * 04/15/02 Andy Cress v1.2 - fix bug with user-specified Alert IP:
+ * (ccode=c7 on SetLanEntry(16 & 18), also
+ * added Get_Mac() for user-specified Alert IP.
+ * 04/16/02 Andy Cress v1.3 added SetUser() to set password if specified,
+ * also changed unset mac[0] to be 0xFF, not 0.
+ * 05/09/02 Andy Cress v1.4 fixed bug 504 gwymac[0]=00 (mymac overwrote it),
+ * also fixed alert scan to pick last trapsink
+ * 05/31/02 Andy Cress v1.5 for gwy mac, changed arping -c 1 to -c 2,
+ * also get com2sec community from snmpd.conf,
+ * set dest type for no ack, no retry,
+ * special handling to set preset PEF entries
+ * 07/02/02 Andy Cress v1.6 added more Usage text
+ * 07/08/02 Andy Cress v1.7 SetUserAccess length change
+ * 08/02/02 Andy Cress v1.8 moved common ipmi_cmd() code to ipmicmd.c
+ * 08/27/02 Andy Cress v1.9 fixed 0xc7 on SETUSER_ACCESS with pefconfig -P "",
+ * show message if alert dest not found
+ * 09/10/02 Andy Cress v1.10 make channel nums into defines (16)
+ * 09/17/02 Andy Cress v1.11 decode Dest Addr IP (19) in decimal,
+ * fix enable user padding in SetUser,
+ * display new community string when setting
+ * 12/09/02 Andy Cress v1.12 fix error w -C & snmpd.conf conflict
+ * 01/29/03 Andy Cress v1.13 added MV OpenIPMI support
+ * 02/05/03 Andy Cress v1.14 show pef entry descriptions,
+ * added EnablePef routine
+ * show correct Alert dest mac if -A only
+ * 04/04/03 Andy Cress v1.15 add eth interface option (-i)
+ * 05/13/03 Andy Cress v1.16 fix EnablePef if startup delay not supported
+ * 06/19/03 Andy Cress v1.17 added errno.h (email from Travers Carter)
+ * 07/25/03 Andy Cress v1.18 add SerialOverLan configuration
+ * mod to SetUser, added GetBmcEthDevice,
+ * use 'arping -I' if eth1.
+ * 08/18/03 Andy Cress v1.19 Don't abort if IPMI 1.0, just skip PEF,
+ * SetLanEntry(10 & 11) for bmc grat arp,
+ * SetLanEntry(2) to 0x17 for auth priv
+ * 09/10/03 Andy Cress v1.20 Don't enable a PEF entry if it is empty,
+ * added -L lan_ch parameter,
+ * scan for lan_ch in GetBmcEthDevice
+ * 09/22/03 Andy Cress v1.21 Add DHCP option (-D), from Jerry Yu.
+ * 12/05/03 Andy Cress v1.22 Fix auth type enables for ServerConfig
+ * 12/16/03 Andy Cress v1.23 Allow flexible auth types via authmask
+ * 03/19/04 Andy Cress v1.24 Change default pefnum for mBMC to 10
+ * 04/15/04 Andy Cress v1.25 Init each response for channel info, avoids
+ * 0xcc error with /dev/ipmi0 due to wrong lan_ch
+ * 05/05/04 Andy Cress v1.26 call ipmi_close before exit. Note that
+ * Get_IPMac_Addr and GetBmcEthDevice
+ * routines need more work for WIN32.
+ * 05/24/04 Andy Cress v1.27 added CHAN_ACC params for ia64
+ * 06/28/04 Andy Cress v1.28 added parsing to get community from trapsink
+ * 07/23/04 Andy Cress v1.29 use lan_ch variable to set Alert Policy Table
+ * 08/23/04 Andy Cress v1.30 fixed decoding of PE Table entries,
+ * added -e option (same as no params)
+ * 08/25/04 Andy Cress v1.31 added some WIN32 logic to Get_Mac, Get_IPMac_Addr
+ * 11/01/04 Andy Cress v1.32 add -N / -R for remote nodes
+ * added -U for remote username
+ * 11/18/04 Andy Cress v1.33 added -u to configure a lan username (user 2)
+ * 11/23/04 Andy Cress v1.34 added pef_defaults if first 11 empty
+ * 01/11/05 Andy Cress v1.35 allow scan for BMC LAN if fIPMI10
+ * 01/20/05 Andy Cress v1.36 fix to allow IPMI 2.0
+ * 02/16/05 Andy Cress v1.37 added IPMI 2.0 VLAN parameters,
+ * if DHCP, can set DHCP Server via -I param
+ * 03/02/05 Andy Cress v1.38 show Serial-Over-Lan params,
+ * fix -L with lan_ch_parm. mods to GetBmcEthDevice
+ * 03/18/05 Andy Cress v1.39 fix GetBmcEthDevice for invalid MAC compares
+ * 06/03/05 Andy Cress v1.40 For my MAC in BMC, check user-specified, then
+ * check existing BMC MAC, then check OS MAC.
+ * 06/10/05 Andy Cress v1.41 Display multiple Alert Destinations,
+ * handle fSOL20 commands
+ * 07/07/05 Andy Cress v1.42 Fix GetBmcEthDevice for TIGI2U to skip GCM ch 3
+ * 07/08/05 Andy Cress v1.43 Mods to handle Intel NSI2U miniBMC,
+ * 08/01/05 Andy Cress v1.44 added -t option to test if BMC LAN configured
+ * 08/10/05 Andy Cress v1.45 truncate extra string chars,
+ * decode more PEF params
+ * 09/07/05 Andy Cress v1.46 enable mBMC PEF entries 26 thru 30
+ * 04/06/06 Andy Cress v1.47 show "gcm" as ifname if -L 3.
+ * 06/20/06 Andy Cress v1.48 fix strcmp(gcm), show all 4 alert policies,
+ * add PefDesc() for misc vendor pefdesc, add -a.
+ * 08/08/06 Andy Cress v1.49 add Alcolu to fsharedMAC
+ * 09/29/06 Andy Cress v1.52 use bmcmymac if valid, use bmcmyip if ok,
+ * added -q for user number,
+ * enhanced Get_IPMac_Addr for Windows
+ * 10/12/06 Andy Cress v1.53 FindEthNum updates, always use gwy iface for mac
+ * 11/02/06 Andy Cress v1.55 add user names, EnablePef mods for non-Intel.
+ * 05/02/07 Brian Johnson v1.65 add fpefenable flag to not do SetPefEntry
+ * if no Alert Destination. Previously did
+ * SetPefEntry but not EnablePef in this case.
+ * 05/04/07 Andy Cress v1.65 Use 0x02 for DHCP source instead of 0x03,
+ * fix 1714748 missing "X:" in getopt line
+ * 05/23/07 Jakub Gorgolewski
+ * v1.66 Use iphlpapi for Windows detection
+ * 10/31/07 Andy Cress v2.3 Fixed PEF entry for Power Redundancy Lost
+ * 11/15/07 Andy Cress v2.4 Move custom PEF to #14, add to usage,
+ * Allow broadcast MAC for -X
+ * 12/17/07 Andy Cress v2.5 Add fSetPEFOks & secondary Gateway
+ */
+/*M*
+ *---------------------------------------------------------------------------
+Copyright (c) 2009 Kontron America, 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:
+
+ a.. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b.. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ c.. Neither the name of Kontron nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *---------------------------------------------------------------------------
+ *M*/
+#ifdef WIN32
+#include <winsock2.h>
+#include <iphlpapi.h>
+#include <windows.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "getopt.h"
+#elif defined(DOS)
+#include <dos.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "getopt.h"
+#else
+/* Linux or similar */
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#if defined(HPUX)
+/* getopt is defined in stdio.h */
+#elif defined(MACOS)
+/* getopt is defined in unistd.h */
+#include <unistd.h>
+#else
+#include <getopt.h>
+#endif
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <errno.h>
+#endif
+#ifdef LINUX
+#include <unistd.h>
+#endif
+#ifdef SOLARIS
+#include <sys/sockio.h>
+#define SIOCGIFHWADDR SIOCGENADDR
+#define ifr_netmask ifr_ifru.ifru_addr
+// #define ifr_hwaddr.sa_data ifr_ifru.ifru_enaddr
+#elif defined(BSD)
+#include <sys/sockio.h>
+#define SIOCGIFHWADDR SIOCGIFMAC
+#define ifr_netmask ifr_ifru.ifru_addr
+// #define ifr_hwaddr.sa_data ifr_ifru.ifru_addr
+#elif defined(MACOS)
+#include <sys/sockio.h>
+#define ifr_netmask ifr_ifru.ifru_addr
+#endif
+#include "ipmicmd.h"
+#include "oem_intel.h"
+#include "oem_supermicro.h"
+
+#define SELprintf printf
+#define RTF_UP 0x0001 /* route usable */
+
+#define SOL_ENABLE_FLAG 0x01
+#define SOL_DISABLE_FLAG 0x00
+#define SOL_PRIVILEGE_LEVEL_USER 0x02
+#define SOL_PRIVILEGE_LEVEL_OPERATOR 0x03
+#define SOL_PRIVILEGE_LEVEL_ADMIN 0x04
+#define SOL_PREFERRED_BAUD_RATE 0x0a /*115.2k*/
+/* For IPMI 1.5, use Intel SOL commands & subfunctions */
+#define SOL_ENABLE_PARAM 0x01
+#define SOL_AUTHENTICATION_PARAM 0x02
+#define SOL_ACC_INTERVAL_PARAM 0x03
+#define SOL_RETRY_PARAM 0x04
+#define SOL_BAUD_RATE_PARAM 0x05 /*non-volatile*/
+#define SOL_VOL_BAUD_RATE_PARAM 0x06 /*volatile*/
+/* For IPMI 2.0, use IPMI SOL commands & subfunctions */
+#define SOL_ENABLE_PARAM2 0x08
+#define SOL_AUTHENTICATION_PARAM2 0x09
+#define SOL_BAUD_RATE_PARAM2 0x11
+
+/* IPMI 2.0 SOL PAYLOAD commands */
+#define SET_PAYLOAD_ACCESS 0x4C
+#define GET_PAYLOAD_ACCESS 0x4D
+#define GET_PAYLOAD_SUPPORT 0x4E
+
+/* Channel Access values */
+#define CHAN_ACC_DISABLE 0x20 /* PEF off, disabled*/
+#define CHAN_ACC_PEFON 0x02 /* PEF on, always avail */
+#define CHAN_ACC_PEFOFF 0x22 /* PEF off, always avail*/
+/* special channel access values for ia64 */
+#define CHAN_ACC_PEFON64 0x0A /* PEF on, always avail, UserLevelAuth=off */
+#define CHAN_ACC_PEFOFF64 0x2A /* PEF off, always avail, UserLevelAuth=off */
+#define OS_LINUX 1
+#define OS_WINDOWS 2
+#define OS_SOLARIS 3
+#define OS_BSD 4
+#define OS_HPUX 5
+
+ /* TSRLT2 Channels: 0=IPMB, 1=Serial/EMP, 6=LAN2, 7=LAN1 */
+ /* S5000 Channels: 0=IPMB, 1=LAN1, 2=LAN2, 3=RMM2, 4=Serial, 6=pci, 7=sys */
+ /* For TIGPT1U/mBMC: 1=LAN channel, no serial */
+#define LAN_CH 1
+#define SER_CH 4
+#define MAXCHAN 12 /*was 16, reduced for gnu ipmi_lan*/
+#define NUM_DEVICES_TO_CHECK 32 /*for GetBmcEthDevice()*/
+#define MAC_LEN 6 /*length of MAC Address*/
+#define PSW_LEN 16 /* see also PSW_MAX =20 in ipmicmd.h*/
+/* Note: The optional IPMI 2.0 20-byte passwords are not supported here,
+ * due to back-compatibility issues. */
+
+ /* IP address source values */
+#define SRC_STATIC 0x01
+#define SRC_DHCP 0x02 /* BMC running DHCP */
+#define SRC_BIOS 0x03 /* BIOS, sometimes DHCP */
+#define SRC_OTHER 0x04
+
+/* PEF event severities */
+#define PEF_SEV_UNSPEC 0x00
+#define PEF_SEV_MON 0x01
+#define PEF_SEV_INFO 0x02
+#define PEF_SEV_OK 0x04
+#define PEF_SEV_WARN 0x08
+#define PEF_SEV_CRIT 0x10
+#define PEF_SEV_NORECOV 0x20
+#define FLAG_INIT 99 /*initial value of char flag, beyond scope*/
+#define PARM_INIT 0xff
+
+typedef struct
+{ /* See IPMI Table 15-2 */
+ uchar rec_id;
+ uchar fconfig;
+ uchar action;
+ uchar policy;
+ uchar severity;
+ uchar genid1;
+ uchar genid2;
+ uchar sensor_type;
+ uchar sensor_no;
+ uchar event_trigger;
+ uchar data1;
+ uchar mask1;
+ uchar res[9];
+} PEF_RECORD;
+
+typedef struct
+{ /* See IPMI Table 19-3 */
+ uchar data[36];
+} LAN_RECORD; /*LanRecord*/
+
+#ifdef METACOMMAND
+extern int get_lan_stats(uchar chan); /*see bmchealth.c */
+extern char *get_sensor_type_desc(uchar stype); /*from ievents.c*/
+#endif
+
+#define MYIP 0x01
+#define GWYIP 0x02
+#define DESTIP 0x04
+#define MAXPEF 41 /* max pefnum offset = 40 (41 entries) */
+/*
+ * Global variables
+ */
+static char * progver = "3.03";
+static char * progname = "ilan";
+static char fdebug = 0;
+static char fipmilan = 0;
+static char fIPMI10 = 0; /* =1 if IPMI v1.0 or less */
+static char fIPMI20 = 0; /* =1 if IPMI v2.0 or greater */
+static char fSOL20 = 1; /* =1 if use Serial-Over-Lan 2.0 w IPMI 2.0 */
+static char fsharedMAC = 0; /* =1 if special shared-MAC BMC LAN port */
+static char fAdjustPefNum = 0; /* =1 adjust pefnum to first empty index */
+static char fUserPefNum = 0; /* =1 if user specified a valid pefnum value*/
+static char freadonly = 1; /* =1 to only read LAN & PEF parameters */
+static char fcanonical = 0; /* =1 to show only canonical output */
+static char flansecure = 0; /* =1 set lan security: no null, cipher0 off*/
+static char bdelim = BCOLON; /* delimiter ':' or '|' if canonical output*/
+static char ftestonly = 0;
+static char fprivset = 0;
+static char flanstats = 0; /* =1 to show the IPMI LAN statistics */
+static char foptmsg = 0; /* =1 to show the option warning msg */
+static char fshowchan = 0; /* =1 to show the IPMI channels */
+static char nopts = 0; /* number of pefconfig options specified*/
+static int nerrs = 0; /* number of errors during processing */
+static int ngood = 0; /* number of good results */
+static int lasterr = 0; /* value of the last error */
+static char fCustomPEF = 0; /* =1 if -j to input a custom PEF record */
+static char fSetPEFOks = 0; /* =1 if -k to set PEF OK rules */
+static char fdisable = 0;
+static char fenable = 0; /* =1 to config BMC LAN and PEF */
+static char fpefenable = 0; /* =1 enable PEF if Alert Dest is specified*/
+static char fdisableSOL = 0;
+static char fgetser = 0;
+static char fsetifn = 0; /* =1 if user specified ifname[] with -i */
+static char fethfound = 0; /* =1 if FindEthNum successful */
+static char fset_ip = 0; /* !=0 if options used to specify an IP addr*/
+static char fpassword = 0; /* =1 user-specified a password, so set it. */
+static uchar fmBMC = 0; /* =1 mini-BMC, =0 Sahalee BMC */
+static uchar fiBMC = 0; /* =1 Intel iBMC */
+static uchar fRomley = 0; /* =1 Intel Romley BMC */
+static uchar fGrantley = 0;
+static uchar fipv6 = 0; /* =1 if BMC supports IPv6 */
+static uchar bmcpefctl = 0; /* existing BMC PEF Control, !0 = enabled */
+static char alertnum = 1; /* alert dest num (usu 1 thru 4) */
+static char alertmax = 9; /* alert dest num max (usu 4, error if >9) */
+static char pefnum = 12; /* 11 pre-defined entries, adding 12th */
+static char pefadd = 0; /* num PEF rules added (usu 2, could be 5 */
+static char pefmax = MAXPEF; /* 20 for Sahalee, 30 for miniBMC */
+static char *myuser = NULL; /* username to set, specified by -u */
+static uchar usernum = 0; /* set non-zero to specify user number */
+static uchar rgmyip[4] = {0,0,0,0};
+static uchar rggwyip[4] = {0,0,0,0};
+static uchar rggwy2ip[4] = {0,0,0,0};
+static uchar rgdestip[4] = {0,0,0,0};
+static uchar rgsubnet[4] = {0,0,0,0};
+static uchar bmcsubnet[4] = {255,255,255,0}; /* default subnet */
+static uchar ossubnet[4] = {0,0,0,0};
+static uchar osmyip[4] = {0,0,0,0};
+static uchar bmcmyip[4] = {0,0,0,0};
+static uchar bmcdestip[4] = {0,0,0,0};
+static uchar bmcdestmac[6]= {0xff,0,0,0,0,0};
+static uchar bmcgwyip[4] = {0,0,0,0};
+static uchar bmcgwymac[6]= {0xff,0,0,0,0,0};
+static uchar bmcmymac[6] = {0xff,0,0,0,0,0};
+static uchar rgmymac[6] = {0xff,0,0,0,0,0};
+static uchar osmymac[6] = {0xff,0,0,0,0,0};
+static uchar rggwymac[6] = {0xff,0,0,0,0,0};
+static uchar rggwy2mac[6] = {0xff,0,0,0,0,0};
+static uchar rgdestmac[6] = {0xff,0,0,0,0,0};
+static uchar rgdhcpmac[6] = {0xff,0,0,0,0,0};
+static int nciphers = 16;
+static int ncipher0 = 0;
+static uchar rgciphers[16] = {0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+static char rghostname[32] = {'\0'};
+static uchar custPEF[20]; /* max used = 18 bytes */
+static char rgcommunity[19] = "public"; /* default community */
+static char fsetcommunity = 0; /* =1 if user-specified community */
+static char passwordData[PSW_MAX+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+static uchar authmask = 0; /* usu 0x17, mBMC = 0x15 */
+static uchar bAuth = 0x16; /*exclude auth=None for security*/
+static uchar arp_interval = 0x04; /* in 500 ms increments, 0-based */
+static uchar arp_ctl = 0x01; /* 01=grat arp, 02=arp resp, 03=both*/
+static uchar fsetarp = 0; /* 1=user-specified arp_ctl */
+#ifdef WIN32
+static uchar ostype = OS_WINDOWS; /*windows*/
+static char ifname[64] = "Local Area Connection "; /* interface name */
+static char ifpattn[25] = "Local Area Connection ";
+#elif SOLARIS
+/* for i86pc use "e1000g0", but for sun4u(sparc) this might be "eri0" */
+static uchar ostype = OS_SOLARIS;
+#ifdef __SPARC__
+static char ifname[16] = "eri0"; /* SPARC interface name */
+static char ifname0[16] = "eri0";
+static char ifpattn[14] = "eri";
+#else
+static char ifname[16] = "e1000g0"; /* Solaris x86 interface name */
+static char ifname0[16] = "e1000g0";
+static char ifpattn[14] = "e1000g";
+#endif
+#elif defined(BSD)
+static uchar ostype = OS_BSD;
+static char ifname[16] = "em0"; /* interface name */
+static char ifname0[16] = "em0";
+static char ifpattn[14] = "em";
+#elif defined(HPUX)
+static uchar ostype = OS_HPUX;
+static char ifname[16] = "lan0"; /* interface name */
+static char ifname0[16] = "lan0";
+static char ifpattn[14] = "lan";
+#else
+static uchar ostype = OS_LINUX;
+static char ifname[16] = "eth0"; /* interface name */
+static char ifname0[16] = "eth0";
+static char ifpattn[14] = "eth";
+#endif
+static char *pspace1 = "\t"; /*used for fcanonical output*/
+static char *pspace2 = "\t\t";
+static char *pspace3 = "\t\t\t";
+static char *pspace4 = "\t\t\t\t";
+static int vend_id;
+static int prod_id;
+static int lan_dhcp = 0; /*=1 if using DHCP for bmc lan channel*/
+static uchar ser_ch = SER_CH;
+static uchar gcm_ch = PARM_INIT;
+static uchar failover_enable = PARM_INIT;
+static uchar vlan_enable = PARM_INIT;
+static uchar vlan_prio = 0; /*default = 0*/
+static ushort vlan_id = 0; /*max 12 bits used*/
+static uchar lan_access = 0x04; /* -v usu 4=Admin, 3=Operator, 2=User */
+static uchar lan_user = 0x02; /* -u if specified, default to user 2 */
+static uchar lan_ch_parm = PARM_INIT; /* -L to set, unused if PARM_INIT */
+static uchar lan_ch = LAN_CH; /* default=LAN_CH=1 */
+static uchar max_users = 5; /* set in GetUser(1); */
+static uchar enabled_users = 0; /* set in GetUser(1); */
+static uchar show_users = 5; /* default, adjusted based on DeviceID */
+static uchar fnewbaud = 0; /* =1 if user specified baud */
+static uchar sol_baud = SOL_PREFERRED_BAUD_RATE; /*115.2k default*/
+static uchar sol_accum[2] = { 0x04, 0x32 };
+static uchar sol_retry[2] = { 0x06, 0x14 };
+static uchar sol_bvalid = 0; /* =1 if SOL baud is valid */
+static uchar chan_pefon = CHAN_ACC_PEFON;
+static uchar chan_pefoff = CHAN_ACC_PEFOFF;
+static uchar SessInfo[18]; /* Session Info data */
+// static uchar bparm7[3] = {0x00, 0x00, 0x00}; /*ipv4 header before*/
+static uchar iparm7[3] = {0x1E, 0x00, 0x00}; /*intel ipv4 TTL,Flags,Service*/
+static uchar oparm7[3] = {0x40, 0x40, 0x10}; /*other ipv4 TTL,Flags,Service*/
+static uchar *parm7 = &oparm7[0];
+#define MAX_PEFPARAMS 14 /* max pef params = 14 */
+uchar peflen[MAX_PEFPARAMS] = {0,1,1,1,1,1,21,2,1,4,17,1,3,18}; /*for ShowPef*/
+uchar pef_array[MAXPEF][21]; /* array of all PEF entries read, */
+ /* sizeof(PEF_RECORD) = 21 */
+uchar pef_defaults[11][21] = { /* array of first 11 default PEF entries */
+{0x01,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x01,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Temp*/
+{0x02,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x02,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Volt*/
+{0x03,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x04,0xff,0x01,0x95,0x0a,0,0,0,0,0,0,0,0,0}, /*Fan*/
+{0x04,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x05,0x05,0x03,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*Chass*/
+{0x05,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x08,0xff,0x6f,0x06,0x00,0,0,0,0,0,0,0,0,0}, /*PS*/
+{0x06,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x0c,0x08,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0}, /*ECC*/
+{0x07,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x0f,0x06,0x6f,0x01,0x00,0,0,0,0,0,0,0,0,0}, /*FRB*/
+{0x08,0x80,1,1,PEF_SEV_WARN,0xff,0xff,0x07,0xff,0x6f,0x1c,0x00,0,0,0,0,0,0,0,0,0}, /*POST*/
+{0x09,0x80,1,1,PEF_SEV_CRIT,0xff,0xff,0x13,0xff,0x6f,0x3e,0x03,0,0,0,0,0,0,0,0,0}, /*NMI*/
+{0x0a,0x80,1,1,PEF_SEV_INFO,0xff,0xff,0x23,0x03,0x6f,0x0e,0x00,0,0,0,0,0,0,0,0,0}, /*WDT*/
+{0x0b,0x80,1,1,PEF_SEV_MON,0xff,0xff,0x12,0xff,0x6f,0x02,0x00,0,0,0,0,0,0,0,0,0} };/*Restart*/
+
+char **pefdesc;
+char *pefdesc1[MAXPEF] = { /* for Sahalee BMC */
+/* 0 0x00 */ "",
+/* 1 0x01 */ "Temperature Sensor",
+/* 2 0x02 */ "Voltage Sensor",
+/* 3 0x04 */ "Fan Failure",
+/* 4 0x05 */ "Chassis Intrusion",
+/* 5 0x08 */ "Power Supply Fault",
+/* 6 0x0c */ "Memory ECC Error",
+/* 7 0x0f */ "BIOS POST Error",
+/* 8 0x07 */ "FRB Failure",
+/* 9 0x13 */ "Fatal NMI",
+/*10 0x23 */ "Watchdog Timer Reset",
+/*11 0x12 */ "System Restart",
+/*12 0x20 */ "OS Critical Stop",
+/*13 0x09 */ "Power Redundancy Lost",
+/*14 0x00 */ "reserved",
+/*15 0x00 */ "reserved",
+/*16 0x00 */ "reserved",
+/*17 */ "reserved",
+/*18 */ "reserved",
+/*19 */ "reserved",
+/*20 */ "reserved",
+/*21 */ "reserved",
+/*22 */ "reserved",
+/*23 */ "reserved",
+/*24 */ "reserved",
+/*25 */ "reserved",
+/*26 */ "reserved",
+/*27 */ "reserved",
+/*28 */ "reserved",
+/*29 */ "unused",
+/*30 */ "unused" };
+
+char *pefdesc2[MAXPEF] = { /* for NSC miniBMC */
+/* 0 */ "",
+/* 1 0x02*/ "Voltage Sensor Assert",
+/* 2 0x23*/ "Watchdog FRB Timeout", /* was "Proc FRB Thermal", */
+/* 3 0x02*/ "Voltage Sensor Deassert",
+/* 4 0x07*/ "Proc1 IERR",
+/* 5 0xff*/ "Digital Sensor OK",
+/* 6 0x14*/ "Chassis Identify",
+/* 7 0x13*/ "NMI Button",
+/* 8 0x14*/ "Clear CMOS via Panel",
+/* 9 0x0f*/ "OS Load POST Code",
+/*10 0x20*/ "OS Critical Stop",
+/*11 0x09 */ "Power Redundancy Lost",
+/*12 0x00*/ "reserved",
+/*13 */ "reserved",
+/*14 */ "reserved",
+/*15 */ "reserved",
+/*16 */ "reserved",
+/*17 */ "reserved",
+/*18 */ "reserved",
+/*19 */ "reserved",
+/*20 */ "reserved",
+/*21 */ "reserved",
+/*22 */ "reserved",
+/*23 */ "reserved",
+/*24 */ "reserved",
+/*25 */ "reserved",
+/*26 0x05*/ "Chassis Intrusion",
+/*27 0x0f*/ "POST Code Error",
+/*28 0x02*/ "Voltage Failure",
+/*29 0x04*/ "Fan Failure",
+/*30 0x01*/ "Temperature Failure"};
+
+#define NLAN 39
+char canon_param[NLAN] = { 0,0,0,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,0,1,
+ 0,0,0,0,0,0,1,1,1,1};
+struct {
+ int cmd;
+ int sz;
+ char desc[28];
+} lanparams[NLAN] = { /* see IPMI Table 19-4 */
+ /* 0 */ { 0, 1, "Set in progress"},
+ /* 1 */ { 1, 1, "Auth type support"},
+ /* 2 */ { 2, 5, "Auth type enables"},
+ /* 3 */ { 3, 4, "IP address"},
+ /* 4 */ { 4, 1, "IP addr src"}, /* (DHCP/Static) */
+ /* 5 */ { 5, 6, "MAC addr"},
+ /* 6 */ { 6, 4, "Subnet mask"},
+ /* 7 */ { 7, 3, "IPv4 header"},
+ /* 8 */ { 8, 2, "Prim RMCP port"},
+ /* 9 */ { 9, 2, "Sec RMCP port"},
+ /* 10 */ {10, 1, "BMC grat ARP"},
+ /* 11 */ {11, 1, "grat ARP interval"},
+ /* 12 */ {12, 4, "Def gateway IP"},
+ /* 13 */ {13, 6, "Def gateway MAC"},
+ /* 14 */ {14, 4, "Sec gateway IP"},
+ /* 15 */ {15, 6, "Sec gateway MAC"},
+ /* 16 */ {16,18, "Community string"},
+ /* 17 */ {17, 1, "Num dest"},
+ /* 18 */ {18, 5, "Dest type"},
+ /* 19 */ {19, 13, "Dest address"},
+ /* 20 */ {20, 2, "VLAN ID"},
+ /* 21 */ {21, 1, "VLAN Priority"},
+ /* 22 */ {22, 1, "Cipher Suite Support"},
+ /* 23 */ {23,17, "Cipher Suites "},
+ /* 24 */ {24, 9, "Cipher Suite Priv"},
+ /* 25 */ {25, 4, "VLAN Dest Tag"},
+ /* 26 */ {96, 28, "OEM Alert String"},
+ /* 27 */ {97, 1, "Alert Retry Algorithm"},
+ /* 28 */ {98, 3, "UTC Offset"},
+ /* 29 */ {102, 1, "IPv6 Enable"},
+ /* 30 */ {103, 1, "IPv6 Addr Source"},
+ /* 31 */ {104,16, "IPv6 Address"},
+ /* 32 */ {105, 1, "IPv6 Prefix Len"},
+ /* 33 */ {106,16, "IPv6 Default Gateway"},
+ /* 34 */ {108,17, "IPv6 Dest address"},
+ /* 35 */ {192, 4, "DHCP Server IP"},
+ /* 36 */ {193, 6, "DHCP MAC Address"},
+ /* 37 */ {194, 1, "DHCP Enable"},
+ /* 38 */ {201, 2, "Channel Access Mode(Lan)"}
+};
+
+#define NSER 22 /* max=32 */
+struct {
+ int cmd;
+ int sz;
+ char desc[28];
+} serparams[NSER] = { /* see IPMI Table 20-4 */
+ /* 0 */ { 0, 1, "Set in progress"},
+ /* 1 */ { 1, 1, "Auth type support"},
+ /* 2 */ { 2, 5, "Auth type enables"},
+ /* 3 */ { 3, 1, "Connection Mode"},
+ /* 4 */ { 4, 1, "Sess Inactiv Timeout"},
+ /* 5 */ { 5, 5, "Channel Callback"},
+ /* 6 */ { 6, 1, "Session Termination"},
+ /* 7 */ { 7, 2, "IPMI Msg Comm"},
+ /* 8 */ { 8, 2, "Mux Switch"},
+ /* 9 */ { 9, 2, "Modem Ring Time"},
+ /* 10 */ {10,17, "Modem Init String"},
+ /* 11 */ {11, 5, "Modem Escape Seq"},
+ /* 12 */ {12, 8, "Modem Hangup Seq"},
+ /* 13 */ {13, 8, "Modem Dial Command"},
+ /* 14 */ {14, 1, "Page Blackout Interval"},
+ /* 15 */ {15,18, "Community String"},
+ /* 16 */ {16, 1, "Num of Alert Dest"},
+ /* 17 */ {17, 5, "Destination Info"},
+ /* 18 */ {18, 1, "Call Retry Interval"},
+ /* 19 */ {19, 3, "Destination Comm Settings"},
+ /* 20 */ {29, 2, "Terminal Mode Config"},
+ /* 21 */ {201, 2,"Channel Access Mode (Ser)"}
+};
+
+static void getauthstr(uchar auth, char *s)
+{
+ if (s == NULL) return;
+ s[0] = 0;
+ if (auth & 0x01) strcat(s,"None ");
+ if (auth & 0x02) strcat(s,"MD2 ");
+ if (auth & 0x04) strcat(s,"MD5 ");
+ if (auth & 0x10) strcat(s,"Pswd ");
+ if (auth & 0x20) strcat(s,"OEM ");
+ return;
+}
+
+static int GetDeviceID(LAN_RECORD *pLanRecord)
+{ /*See also ipmi_getdeviceid( pLanRecord, sizeof(LAN_RECORD),fdebug); */
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (pLanRecord == NULL) return(-1);
+
+ status = ipmi_cmd(GET_DEVICE_ID, inputData, 0, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ SELprintf("GetDeviceID: completion code=%x\n",
+ completionCode);
+ status = completionCode;
+ } else {
+ memcpy(pLanRecord,&responseData[0],responseLength);
+ set_mfgid(&responseData[0],responseLength);
+ return(0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return(status);
+} /*end GetDeviceID() */
+
+static int GetChanAcc(uchar chan, uchar parm, LAN_RECORD *pLanRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (pLanRecord == NULL) return(-1);
+ responseLength = 3;
+ inputData[0] = chan;
+ inputData[1] = parm; /* 0x80 = active, 0x40 = non-volatile */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_CHANNEL_ACC, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ SELprintf("GetChanAcc: completion code=%x\n",
+ completionCode);
+ status = completionCode;
+ } else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ memcpy(pLanRecord,&responseData[0],responseLength);
+ return(0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return(status);
+} /*GetChanAcc()*/
+
+static int SetChanAcc(uchar chan, uchar parm, uchar val)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar inputData[24];
+ uchar completionCode;
+
+ if (fmBMC) return(0); /* mBMC doesn't support this */
+ /* parm: 0x80 = active, 0x40 = set non-vol*/
+ responseLength = 1;
+ inputData[0] = chan; /* channel */
+ inputData[1] = (parm & 0xc0) | (val & 0x3F);
+ inputData[2] = (parm & 0xc0) | lan_access; /* set priv level to Admin */
+
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_CHANNEL_ACC, inputData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ SELprintf("SetChanAcc: completion code=%x\n",
+ completionCode);
+ status = completionCode;
+ } else {
+ return(0); // successful, done
+ }
+ } /* endif */
+ /* if get here, error */
+ return(status);
+} /*SetChanAcc()*/
+
+int SetPasswd(int unum, char *uname, char *upswd, uchar chan, uchar priv)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status, i, psw_len;
+ uchar completionCode;
+ uchar inputData[24];
+ int ret = 0;
+
+ inputData[0] = (uchar)unum; /*user 1 = null user */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ SELprintf("GET_USERNAME: %x %x %x, status = %x, ccode=%x\n",
+ responseData[0],responseData[1],responseData[2],
+ status,completionCode);
+ if (fdebug) {
+ char aname[17];
+ printf("User %d: ",unum);
+ for (i = 0; i < responseLength; i++) {
+ printf("%02x ",responseData[i]);
+ if (responseData[i] < 0x20) aname[i] = '.';
+ else aname[i] = responseData[i];
+ }
+ aname[16] = 0;
+ printf(" %s\n",aname);
+ }
+
+ if (unum != 1)
+ { /* user specified a lan username */
+ if (fiBMC && (unum == 2)) {
+ /* cannot set user 2 name */
+ if (uname != NULL) {
+ if (strcmp(uname,"root") != 0)
+ printf("SETUSERNAME - user2 name %s must be root\n",uname);
+ }
+ } else if (unum == 2 && (vend_id == VENDOR_SUPERMICROX ||
+ vend_id == VENDOR_SUPERMICRO) ) {
+ /* cannot set user 2 name */
+ if (uname != NULL) {
+ if (strcmp(uname,"ADMIN") != 0)
+ printf("SETUSERNAME - user2 name %s must be ADMIN\n",uname);
+ }
+ } else if (uname != NULL) {
+ inputData[0] = (uchar)unum;
+ memset(&inputData[1],0,16);
+ memcpy(&inputData[1],uname,strlen(uname));
+ status = ipmi_cmd(SET_USER_NAME, inputData, 17, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (completionCode == 0xCC)
+ status = 0; /*setting username to previous gives 0xCC, ok*/
+ else {
+ SELprintf("SETUSERNAME - %x %x %x status = %x, ccode=%x\n",
+ inputData[0],inputData[1],inputData[2],
+ status,completionCode);
+ if (status == 0) status = completionCode;
+ if (status != 0) ret = status;
+ }
+ }
+ }
+
+ if ((unum != 1) && (uname == NULL)) {
+ ; /* if no username, do not enable user */
+ } else {
+ inputData[0] = (uchar)unum;
+ inputData[1] = 0x01; /*enable user*/
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ printf("SETUSERENAB - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0],inputData[1],inputData[2],
+ status,completionCode);
+ if (status == 0) status = completionCode;
+ if (status != 0) ret = status;
+ }
+
+ if (upswd != NULL) {
+ inputData[0] = (uchar)unum;
+ inputData[1] = 0x02; /*set password*/
+ psw_len = PSW_LEN; /*=16 change if 20-byte passwords supported */
+ memset(&inputData[2],0,psw_len);
+ strcpy((char *)&inputData[2],upswd);
+ if (fdebug) {
+ char apsw[PSW_MAX+1];
+ char c;
+ printf("Pswd %d: ",unum);
+ for (i = 0; i < psw_len; i++) {
+ c = inputData[i+2];
+ printf("%02x ",(unsigned char)c);
+ if (c < 0x20) apsw[i] = '.';
+ else apsw[i] = c;
+ }
+ apsw[psw_len] = 0;
+ printf(" %s\n",apsw);
+ }
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len,
+ responseData,&responseLength, &completionCode,fdebug);
+ SELprintf("SETUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0],inputData[1],inputData[2],
+ status,completionCode);
+ if (status == 0) status = completionCode;
+ if (status != 0) ret = status;
+
+ inputData[0] = (uchar)unum; /*user 1 = null user */
+ inputData[1] = 0x03; /*test password*/
+ memset(&inputData[2],0,psw_len);
+ if (upswd != NULL)
+ strcpy((char *)&inputData[2],upswd);
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_USER_PASSWORD, inputData, 2+psw_len,
+ responseData,&responseLength, &completionCode,fdebug);
+ SELprintf("TESTUSERPSW - inputData %x %x %x, status = %x, ccode=%x\n",
+ inputData[0],inputData[1],inputData[2],
+ status,completionCode);
+ }
+
+ if (fiBMC && (unum == 2)) { /*iBMC doesn't support this on user 2*/
+ if (fdebug)
+ printf("skipping SETUSER_ACCESS on iBMC for user %d\n",unum);
+ } else {
+ inputData[0] = 0x90 | chan; /* = 0x97 for chan=lan_ch=7 */
+ inputData[1] = (uchar)unum; /* user num */
+ inputData[2] = priv; /* usu priv=lan_access is admin */
+ inputData[3] = 0x00; /* User Session Limit, 0=not limited*/
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ printf("SETUSER_ACCESS - inputData %x %x %x, status = %x ccode=%x\n",
+ (uchar)inputData[0],inputData[1],inputData[2],
+ status,completionCode);
+ if (status == 0) status = completionCode;
+ if (status != 0) ret = status;
+ }
+
+ return(ret);
+} /*end SetPswd()*/
+
+int SetUser(int unum, char *uname, char *passwd, uchar chan)
+{
+ int ret = 0;
+ /* if the user specified a username or password, set it. */
+ if ((fpassword) || (uname != NULL)) {
+ /* set username and password */
+ ret = SetPasswd(unum, uname,passwd, chan, lan_access);
+ }
+ return(ret);
+} /*end SetUser()*/
+
+int
+DisableUser(int unum, uchar chan)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar inputData[24];
+
+ inputData[0] = 0x80 | chan; /* = 0x87, no IPMI */
+ inputData[1] = (uchar)unum; /* user 1 */
+ inputData[2] = 0x0F; /* No access */
+ inputData[3] = 0x00; /* User Session Limit, 0=not limited*/
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(SET_USER_ACCESS, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == 0) status = completionCode;
+ return(status);
+}
+
+static char *parse_priv(uchar c)
+{
+ char *p;
+ c = (c & 0x0f);
+ switch(c) {
+ case 1: p = "Callback"; break;
+ case 2: p = "User "; break;
+ case 3: p = "Operator"; break;
+ case 4: p = "Admin "; break;
+ case 5: p = "OEM "; break;
+ case 0x0f: p = "No access"; break;
+ default: p = "Reserved"; /*usually =0*/
+ }
+ return(p);
+}
+
+static void show_priv(uchar c)
+{
+ char *privstr;
+ privstr = parse_priv(c);
+ printf("%s",privstr);
+}
+
+static int valid_priv(int c)
+{
+ int rv;
+ switch(c) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 0x0f:
+ rv = 1;
+ break;
+ default:
+ rv = 0;
+ break;
+ }
+ return rv;
+}
+
+/* GetUserINfo - get user configuration info for user subfunction */
+int GetUserInfo(uchar unum, uchar chan, uchar *enab, uchar *priv, char *uname)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status, rv;
+ uchar completionCode;
+ uchar inputData[24];
+ uchar upriv;
+
+ if (enab == NULL || priv == NULL) return(-2);
+ inputData[0] = chan; /*lan_ch*/
+ inputData[1] = unum; /* user number for IPMI LAN */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ rv = status;
+ if (status == 0 && completionCode != 0) rv = completionCode;
+ if (rv == 0) {
+ if (unum == 1) { /*get max_users and enabled_users*/
+ max_users = responseData[0] & 0x3f;
+ enabled_users = responseData[1] & 0x3f;
+ }
+ upriv = responseData[3];
+ inputData[0] = unum; /* usually = 1 for BMC LAN */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != 0 || completionCode != 0)
+ responseData[0] = 0; /*empty user name */
+ responseData[PSW_MAX-1] = 0; /*for safety*/
+ *priv = upriv;
+ if ((responseData[1] & 0x80) == 0) *enab = 0;
+ else *enab = 1;
+ if (uname != NULL) strcpy(uname,responseData);
+ }
+ return(rv);
+}
+
+/* GetUser - get and show user configuration */
+int GetUser(uchar user_num, uchar chan)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar inputData[24];
+
+ inputData[0] = chan; /*lan_ch*/
+ inputData[1] = user_num; /* usually = 1 for BMC LAN */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_USER_ACCESS, inputData, 2, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == 0 && completionCode == 0) {
+ uchar c;
+ if (user_num == 1) { /*get max_users and enabled_users*/
+ max_users = responseData[0] & 0x3f;
+ enabled_users = responseData[1] & 0x3f;
+ if (enabled_users > show_users) show_users = enabled_users;
+ if (show_users > max_users) show_users = max_users;
+ if (!fcanonical)
+ SELprintf("Users: showing %d of max %d users (%d enabled)\n",
+ show_users,max_users,enabled_users);
+ }
+ if (fcanonical)
+ SELprintf("Channel %d User %d Access %s%c ", chan, user_num,
+ pspace2,bdelim);
+ else
+ SELprintf("User Access(chan%d,user%d): %02x %02x %02x %02x : ",
+ chan, user_num, (uchar)responseData[0],
+ responseData[1],responseData[2], responseData[3]);
+ c = responseData[3];
+ inputData[0] = user_num; /* usually = 1 for BMC LAN */
+ responseLength = sizeof(responseData);
+ status = ipmi_cmd(GET_USER_NAME, inputData, 1, responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != 0 || completionCode != 0)
+ responseData[0] = 0;
+ if (c & 0x10) printf("IPMI, ");
+ show_priv(c);
+ printf(" (%s)\n",responseData); /*show user name */
+ } else
+ SELprintf("Get User Access(%d,%d), status=%x, ccode=%x\n",
+ chan, user_num, status, completionCode);
+ return(status);
+} /*end ShowUser()*/
+
+static int GetSerEntry(uchar subfunc, LAN_RECORD *pLanRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status;
+ uchar completionCode;
+ uchar chan; uchar bset;
+
+ if (pLanRecord == NULL)
+ {
+ if (fdebug)
+ printf("GetSerEntry(%d): error, output buffer is NULL\n",subfunc);
+ return (-1);
+ }
+
+ chan = ser_ch; /* 1=EMP, 0=IPMB, 6=LAN2, 7=LAN1 */
+ bset = 0;
+
+ inputData[0] = chan; // flags, channel 3:0 (1=EMP)
+ inputData[1] = subfunc; // Param selector
+ inputData[2] = bset; // Set selector
+ inputData[3] = 0; // Block selector
+ if (subfunc == 10) {
+ inputData[2] = 0;
+ inputData[3] = 1;
+ }
+
+ status = ipmi_cmd(GET_SER_CONFIG, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ if (fdebug)
+ SELprintf("GetSerEntry(%d,%d): completion code=%x\n",
+ chan,subfunc,completionCode);
+ } else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ memcpy(pLanRecord,&responseData[1],responseLength-1);
+ pLanRecord->data[responseLength-1] = 0;
+ //successful, done
+ return(0);
+ }
+ }
+
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf("GetSerEntry(%d,%d): ipmi_cmd status=%x ccode=%x\n",
+ chan,subfunc,status,completionCode);
+ return -1;
+}
+
+static int GetLanEntry(uchar subfunc, uchar bset, LAN_RECORD *pLanRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status, n;
+ uchar completionCode;
+ uchar chan;
+
+ if (pLanRecord == NULL)
+ {
+ if (fdebug)
+ printf("GetLanEntry: error, output buffer is NULL\n");
+ return (-1);
+ }
+
+ chan = lan_ch; /* LAN 1 = 7 */
+
+ inputData[0] = chan; // flags, channel 3:0 (LAN 1)
+ inputData[1] = subfunc; // Param selector (3 = ip addr)
+ inputData[2] = bset; // Set selector
+ inputData[3] = 0; // Block selector
+
+ status = ipmi_cmd(GET_LAN_CONFIG, inputData, 4, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ if (fdebug)
+ SELprintf("GetLanEntry: completion code=%x\n",
+ completionCode);
+ status = completionCode;
+ } else {
+ // dont copy first byte (Parameter revision, usu 0x11)
+ if (responseLength > 0) {
+ n = responseLength-1;
+ memcpy(pLanRecord,&responseData[1],n);
+ } else n = 0;
+ pLanRecord->data[n] = 0;
+ //successful, done
+ return(0);
+ }
+ }
+
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf("GetLanEntry: ipmi_cmd status=%d completionCode=%x\n",
+ status,completionCode);
+ return status;
+} /* end GetLanEntry() */
+
+static int SetLanEntry(uchar subfunc, LAN_RECORD *pLanRecord, int reqlen)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24];
+ int status;
+ uchar completionCode;
+
+ if (pLanRecord == NULL)
+ {
+ if (fdebug)
+ printf("SetLanEntry(%d): error, input buffer is NULL\n",subfunc);
+ return (-1);
+ }
+ if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
+ /* SUPERMICRO cannot set grat arp or grat arp interval */
+ if (subfunc == 10 || subfunc == 11) return(0);
+ }
+
+ inputData[0] = lan_ch; // flags, channel 3:0 (LAN 1)
+ inputData[1] = subfunc; // Param selector (3 = ip addr)
+ memcpy(&inputData[2],pLanRecord,reqlen);
+
+ status = ipmi_cmd(SET_LAN_CONFIG, inputData, (uchar)(reqlen+2),
+ responseData, &responseLength,&completionCode,fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ if (fdebug)
+ SELprintf("SetLanEntry(%d): completion code=%x\n",
+ subfunc,completionCode); // responseData[0]);
+ return(completionCode);
+ } else {
+ //successful, done
+ return(0);
+ }
+ }
+
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf("SetLanEntry(%d): ipmi_cmd status=%d ccode=%x\n",
+ subfunc,status,completionCode);
+ return status;
+} /* end SetLanEntry() */
+
+int GetPefEntry(uchar subfunc, ushort rec_id, PEF_RECORD *pPefRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[24]; /* only use 3 bytes for input */
+ int status, n;
+ uchar completionCode;
+
+ if (pPefRecord == NULL)
+ {
+ if (fdebug)
+ printf("GetPefEntry(%d): error, output buffer is NULL\n",subfunc);
+ return (-1);
+ }
+
+ inputData[0] = subfunc; // Parameter = Evt Filter Table
+ inputData[1] = (uchar)rec_id;
+ inputData[2] = 0;
+
+ status = ipmi_cmd(GET_PEF_CONFIG, inputData, 3, responseData,
+ &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ if (fdebug)
+ SELprintf("GetPefEntry(%d/%d): completion code=%x\n",
+ subfunc,rec_id,completionCode);
+ status = completionCode;
+ } else {
+ /* expect PEF record to be >=21 bytes */
+ if (responseLength > 1) n = responseLength-1;
+ else n = 0;
+ if (n > 21) n = 21; /*only use 21 bytes*/
+ if ((subfunc == 6) && (n < 21)) {
+ if (fdebug)
+ printf("GetPefEntry(%d/%d): length %d too short\n",
+ subfunc,rec_id,responseLength);
+ }
+ // dont copy first byte (Parameter revision, usu 0x11)
+ if (n == 0) memset(pPefRecord,0,21);
+ else memcpy(pPefRecord,&responseData[1],n);
+ //successful, done
+ return(0);
+ }
+ }
+
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf("GetPefEntry: ipmi_cmd status=%x completionCode=%x\n",
+ status, completionCode);
+ return status;
+} /* end GetPefEntry() */
+
+int SetPefEntry(PEF_RECORD *pPefRecord)
+{
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ uchar inputData[32]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ int status;
+ uchar completionCode;
+ uchar subfunc;
+
+ subfunc = 0x06; // Parameter = Evt Filter Table
+
+ if (pPefRecord == NULL) {
+ if (fdebug)
+ printf("SetPefEntry: error, output buffer is NULL\n");
+ return (-1);
+ }
+
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
+ // 06 0c 80 01 01 00 ff ff 20 ff 6f ff 00 00 00 00 00 00 00 00 00 00
+ // memset(&inputData[0],0,requestData.dataLength);
+ inputData[0] = subfunc;
+ memcpy(&inputData[1],pPefRecord,sizeof(PEF_RECORD));
+
+ status = ipmi_cmd(SET_PEF_CONFIG, inputData, sizeof(PEF_RECORD)+1,
+ responseData, &responseLength, &completionCode, fdebug);
+
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ if (fdebug)
+ SELprintf("SetPefEntry: completion code=%x\n",
+ completionCode); // responseData[0]);
+ status = completionCode;
+ } else {
+ //successful, done
+ return(0);
+ }
+
+ }
+
+ // we are here because completionCode is not COMPLETION_CODE_OK
+ if (fdebug)
+ SELprintf("SetPefEntry: ipmi_cmd status=%d completion code=%x\n",
+ status,completionCode);
+ return(status);
+
+} /* end SetPefEntry() */
+
+int DisablePef(int anum)
+{
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status;
+
+ if (fmBMC) {
+ SELprintf("mini-BMC does not support disabling BMC LAN\n");
+ return(-1);
+ } else {
+ status = SetChanAcc(lan_ch, 0x80, CHAN_ACC_DISABLE);
+ if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status);
+ status = SetChanAcc(lan_ch, 0x40, CHAN_ACC_DISABLE);
+ SELprintf("SetChanAcc(lan), ret = %d\n",status);
+ if (status != 0) return(status);
+ }
+
+ iData[0] = 0x01; /* PEF Control Param */
+ iData[1] = 0x00; /* PEF disable */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc);
+ return(-1);
+ }
+
+ if (anum != 0) {
+ iData[0] = 0x09; /* PEF Alert Policy Table */
+ iData[1] = (uchar)anum; /* Policy number (default 0x01) */
+ iData[2] = 0x10; /* PEF LAN, policy disable */
+ iData[3] = 0x00; /* LAN_CH=00, default dest=00 */
+ iData[4] = 0x00; /* No alert string */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("DisablePef[%d]: completion code=%x\n",iData[0],cc);
+ return(-1);
+ }
+ }
+ return(status);
+}
+
+int ShowPef(void)
+{
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status, i,j;
+
+ for (j = 1; j < MAX_PEFPARAMS; j++) {
+ if (j == 4 && fmBMC) {
+ /* fmBMC gets cc=0x80 for param 4, so skip it. */
+ continue;
+ }
+ iData[0] = (uchar)j; /* PEF Control Param */
+ if (j == 6 || j == 7 || j == 9) iData[1] = 1;
+ else iData[1] = 0x00; /* PEF Set Selector */
+ if (j == 13) iData[2] = 1;
+ else iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (status == 0 && cc == 0) {
+ SELprintf("PefParam[%d]: ",iData[0]);
+ if (rLength > 0)
+ for (i=0;i<peflen[j];i++) SELprintf("%02x ", rData[1+i]);
+ SELprintf("\n");
+ } else
+ SELprintf("PefParam[%d]: GET_PEF status=%d cc=%x\n",
+ iData[0],status,cc);
+ }
+ return(status);
+}
+
+int EnablePef(int anum)
+{
+ uchar iData[24]; /* sizeof(PEF_RECORD) = 21 +1=22 */
+ uchar rData[MAX_BUFFER_SIZE];
+ int rLength = MAX_BUFFER_SIZE;
+ uchar cc;
+ int status;
+ uchar sdelay;
+
+ status = SetChanAcc(lan_ch, 0x80, chan_pefon);
+ if (fdebug) SELprintf("SetChanAcc(lan/active), ret = %d\n",status);
+ status = SetChanAcc(lan_ch, 0x40, chan_pefon);
+ SELprintf("SetChanAcc(lan), ret = %d\n",status);
+ if (status != 0) return(status);
+
+ {
+ iData[0] = 0x01; /* PEF Control Param */
+ iData[1] = 0x00; /* PEF Set Selector */
+ iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0 || cc != 0) sdelay = 0;
+ else sdelay = rData[1];
+ if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, control=%02x\n",
+ iData[0],cc,sdelay);
+ iData[0] = 0x01; /* PEF Control Param (0x01 or 0x05) */
+ iData[1] = 0x01; /* PEF enable, & no startup delay */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
+ return(-1);
+ }
+
+#ifdef TEST
+ iData[0] = 0x01; /* Serial Channel */
+ iData[1] = 0x13; /* Dest Com settings = 19. */
+ iData[2] = 0x01; /* POL Default Dest */
+ iData[3] = 0x60;
+ iData[4] = 0x07;
+ status = ipmi_cmd(SET_SER_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
+#endif
+
+ iData[0] = 0x02; /* PEF Action Param */
+ iData[1] = 0x00; /* PEF Set Selector */
+ iData[2] = 0x00; /* PEF Block Selector */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(GET_PEF_CONFIG, iData, 3, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug) SELprintf("EnablePef[%d]: get cc=%x, val=%02x\n",
+ iData[0],cc,rData[1]);
+ iData[0] = 0x02; /* PEF Action Param */
+ if (vend_id == VENDOR_INTEL)
+ iData[1] = 0x2f; /* enable alerts, reset, power cycle/down, diag*/
+ else
+ iData[1] = 0x0f; /* enable alerts, reset, power cycle/down */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
+ return(-1);
+ }
+
+ if ((sdelay & 0x04) != 0) { /* startup delay is supported */
+ iData[0] = 0x03; /* PEF Startup Delay Param */
+ iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0],iData[1],cc);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
+ // return(-1);
+ }
+ iData[0] = 0x04; /* PEF Alert Startup Delay Param */
+ iData[1] = 0x00; /* 0 seconds, default is 0x3c (60 sec) */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 2, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0],iData[1],cc);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
+ // return(-1);
+ }
+ } /*endif sdelay*/
+
+ iData[0] = 0x09; /* PEF Alert Policy Table */
+ iData[1] = (uchar)anum; /* Policy number (default 0x01) */
+ iData[2] = 0x18; /* PEF LAN, always alert, policy enable */
+ iData[3] = (lan_ch << 4) + anum; /* LAN_CH=70, default dest=01 */
+ iData[4] = 0x00; /* No alert string */
+ rLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(SET_PEF_CONFIG, iData, 5, rData, &rLength,
+ &cc, fdebug);
+ if (fdebug) SELprintf("EnablePef[%d]: set val=%02x cc=%x\n",
+ iData[0],iData[1],cc);
+ if (status != 0) return(status);
+ if( cc ) {
+ SELprintf("EnablePef[%d]: completion code=%x\n",iData[0],cc);
+ return(-1);
+ }
+ } /*endif IPMI 1.5 */
+
+ return(status);
+} /* end EnablePef */
+
+#define NBAUDS 10
+static struct {
+ unsigned char val;
+ char str[8];
+ } mapbaud[NBAUDS] = {
+ { 6, "9600" },
+ { 6, "9.6K" },
+ { 7, "19.2K" },
+ { 7, "19200" },
+ { 8, "38.4K" },
+ { 8, "38400" },
+ { 9, "57.6K" },
+ { 9, "57600" },
+ { 10, "115.2K" },
+ { 10, "115200" }
+ };
+
+static unsigned char Str2Baud(char * str)
+{
+ unsigned char baud = 0;
+ int i, n, len;
+ len = strlen_(str);
+ for (i = 0; i < len; i++) /*toupper*/
+ if (str[i] >= 'a' && str[i] <= 'z') str[i] &= 0x5F;
+ for (i = 0; i < NBAUDS; i++) {
+ n = strlen_(mapbaud[i].str);
+ if (strncmp(str,mapbaud[i].str,n) == 0) {
+ baud = mapbaud[i].val;
+ break;
+ }
+ }
+ if (i == NBAUDS || baud == 0) {
+ printf("Invalid -B parameter value (%s), using 19.2K.\n",str);
+ i = 1; /* default is 19.2K */
+ baud = mapbaud[i].val; /* =7 */
+ }
+ if (fdebug) printf("new baud = %02x (%s)\n",baud,mapbaud[i].str);
+ return(baud);
+}
+
+static char *Baud2Str(unsigned char bin)
+{
+ char *baudstr;
+ unsigned char b;
+ b = bin & 0x0f;
+ switch(b) {
+ case 6: baudstr = "9600 "; break;
+ case 7: baudstr = "19.2k"; break;
+ case 8: baudstr = "38.4k"; break;
+ case 9: baudstr = "57.6k"; break;
+ case 10: baudstr = "115.2k"; break;
+ default: baudstr = "nobaud";
+ }
+ return(baudstr);
+}
+
+static int BaudValid(unsigned char b)
+{
+ int val = 0;
+ switch(b) {
+ case 6: val = 1; break;
+ case 7: val = 1; break;
+ case 8: val = 1; break;
+ case 9: val = 1; break;
+ case 10: val = 1; break;
+ default: val = 0; break;
+ }
+ return(val);
+}
+
+/*
+ * atomac - converts ASCII string to binary MAC address (array).
+ * Accepts input formatted as 11:22:33:44:55:66 or 11-22-33-44-55-66.
+ */
+void atomac(uchar *array, char *instr)
+{
+ int i,j,n;
+ char *pi;
+ j = 0;
+ pi = instr;
+ n = strlen_(instr);
+ for (i = 0; i <= n; i++) {
+ if (instr[i] == ':') {
+ array[j++] = htoi(pi);
+ pi = &instr[i+1];
+ } else if (instr[i] == '-') {
+ array[j++] = htoi(pi);
+ pi = &instr[i+1];
+ } else if (instr[i] == 0) {
+ array[j++] = htoi(pi);
+ }
+ if (j >= MAC_LEN) break; /*safety valve*/
+ }
+ if (fdebug)
+ printf("atomac: %02x %02x %02x %02x %02x %02x\n",
+ array[0],array[1],array[2],array[3], array[4],array[5]);
+} /*end atomac()*/
+
+/* extern void atoip(uchar *array,char *instr); *from subs.c*/
+void MacSetInvalid(uchar *mac)
+{
+ int i;
+ if (mac == NULL) return;
+ for (i = 0; i < MAC_LEN; i++) {
+ if (i == 0) mac[i] = 0xFF;
+ else mac[i] = 0x00;
+ }
+}
+
+int MacIsValid(uchar *mac)
+{
+ int fvalid = 0;
+ int i;
+ /* check for initial invalid value of FF:00:... */
+ if (mac[0] == 0xff && mac[1] == 0x00) /* marked as invalid */
+ return(fvalid);
+ /* check for all zeros */
+ for (i = 0; i < MAC_LEN; i++)
+ if (mac[i] != 0) { /* not all zeros */
+ fvalid = 1;
+ break;
+ }
+ return(fvalid);
+}
+
+int IpIsValid(uchar *ipadr)
+{
+ int fvalid = 1;
+ if (ipadr[0] == 0) fvalid = 0;
+ return(fvalid);
+}
+
+int SubnetIsValid(uchar *subnet)
+{
+ int fvalid = 0;
+ /* if masking off at least one bit, say valid */
+ if (subnet[0] != 0) fvalid = 1;
+ return(fvalid);
+}
+
+int SubnetIsSame(uchar *ip1, uchar *ip2, uchar *subnet)
+{
+ int i;
+ uchar c1, c2;
+ for (i = 0; i < 4; i ++) {
+ c1 = ip1[i] & subnet[i];
+ c2 = ip2[i] & subnet[i];
+ if (c1 != c2) return 0;
+ }
+ return 1; /*same, return true*/
+}
+
+#ifdef WIN32
+/*
+ * Obtain network adapter information (Windows).
+ */
+PIP_ADAPTER_ADDRESSES GetAdapters() {
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ ULONG OutBufferLength = 0;
+ ULONG RetVal = 0, i;
+
+ // The size of the buffer can be different
+ // between consecutive API calls.
+ // In most cases, i < 2 is sufficient;
+ // One call to get the size and one call to get the actual parameters.
+ // But if one more interface is added or addresses are added,
+ // the call again fails with BUFFER_OVERFLOW.
+ // So the number is picked slightly greater than 2.
+ // We use i <5 in the example
+ for (i = 0; i < 5; i++) {
+ RetVal = GetAdaptersAddresses(
+ AF_INET, 0, NULL,
+ AdapterAddresses,
+ &OutBufferLength);
+
+ if (RetVal != ERROR_BUFFER_OVERFLOW) {
+ break;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free(AdapterAddresses);
+ }
+
+ AdapterAddresses = (PIP_ADAPTER_ADDRESSES) malloc(OutBufferLength);
+ if (AdapterAddresses == NULL) {
+ RetVal = GetLastError();
+ break;
+ }
+ }
+ if (RetVal == NO_ERROR) {
+ // If successful, return pointer to structure
+ return AdapterAddresses;
+ }
+ else {
+ LPVOID MsgBuf;
+
+ printf("Call to GetAdaptersAddresses failed.\n");
+ if (FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ RetVal,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) &MsgBuf,
+ 0,
+ NULL )) {
+ printf("\tError: %s", MsgBuf);
+ }
+ LocalFree(MsgBuf);
+ }
+ return NULL;
+}
+
+/*
+ * Set BMC MAC corresponding to current BMC IP address (Windows).
+ */
+int GetLocalMACByIP() {
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
+
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ addr = AdapterList->FirstUnicastAddress;
+ if (addr == NULL) si = NULL;
+ else si = (struct sockaddr_in*)addr->Address.lpSockaddr;
+ if (si != NULL) {
+ if(memcmp(&si->sin_addr.s_addr, rgmyip, 4) == 0) {
+ if (!MacIsValid(rgmymac))
+ memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ memcpy(osmyip, &si->sin_addr.s_addr, 4);
+ memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname));
+ result = 1;
+ break;
+ }
+ }
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free(AdapterAddresses);
+ }
+ return result;
+}
+
+/*
+ * Get First IP Address in Windows OS
+ * ipaddr is 4 bytes, macaddr is 6 bytes, ipname can be 64 bytes.
+ * (called by idiscover.c)
+ */
+int GetFirstIP(uchar *ipaddr, uchar *macadr, char *ipname, char fdbg)
+{
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ struct sockaddr_in *si;
+ uchar *psaddr;
+ int result = -1;
+
+ AdapterAddresses = GetAdapters();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+
+ addr = AdapterList->FirstUnicastAddress;
+ si = (struct sockaddr_in*)addr->Address.lpSockaddr;
+ psaddr = (uchar *)&si->sin_addr.s_addr;
+ if ((psaddr[0] != 0) && (psaddr[0] != 169)) {
+ if (fdbg) printf("found IP: s_addr=%d.%d.%d.%d\n",
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
+ if (ipaddr != NULL)
+ memcpy(ipaddr, &si->sin_addr.s_addr, 4);
+ if (macadr != NULL) {
+ memcpy(macadr, AdapterList->PhysicalAddress, MAC_LEN);
+ if (fdbg) printf("found MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ macadr[0], macadr[1], macadr[2], macadr[3],
+ macadr[4], macadr[5]);
+ }
+ if (ipname != NULL) {
+ wcstombs(ipname,AdapterList->FriendlyName, sizeof(ifname));
+ if (fdbg) printf("found Adapter: %d\n",ipname);
+ }
+ result = 0;
+ break;
+ }
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free(AdapterAddresses);
+ }
+ return result;
+}
+
+/*
+ * Set BMC MAC corresponding to current BMC IP address (Windows).
+ */
+int GetLocalIPByMAC(uchar *macadr) {
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
+
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters();
+ AdapterList = AdapterAddresses;
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ if(memcmp(AdapterList->PhysicalAddress, macadr, MAC_LEN) == 0) {
+ addr = AdapterList->FirstUnicastAddress;
+
+ si = (struct sockaddr_in*)addr->Address.lpSockaddr;
+ if (fdebug) {
+ uchar *psaddr;
+ psaddr = (uchar *)&si->sin_addr.s_addr;
+ printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d\n",
+ rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3]);
+ }
+ if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/
+ memcpy(rgmyip, &si->sin_addr.s_addr, 4);
+ memcpy(osmyip, &si->sin_addr.s_addr, 4);
+ memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ wcstombs(ifname,AdapterList->FriendlyName, sizeof(ifname));
+ result = 1;
+ break;
+ }
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free(AdapterAddresses);
+ }
+ return result;
+}
+/*
+ * Set MAC and IP address from given interface name (Windows).
+ */
+int GetLocalDataByIface() {
+ PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL;
+ PIP_ADAPTER_ADDRESSES AdapterList;
+ int result = 0;
+
+ size_t origsize, newsize, convertedChars;
+ wchar_t* wcstring;
+ struct sockaddr_in *si;
+
+ AdapterAddresses = GetAdapters();
+ AdapterList = AdapterAddresses;
+
+ origsize = strlen(ifname) + 1;
+ newsize = origsize;
+ convertedChars = 0;
+ wcstring = (wchar_t*) malloc(sizeof(wchar_t) * newsize) ;
+ if (wcstring == NULL) AdapterList = NULL; /*skip loop, do free*/
+ else mbstowcs(wcstring, ifname, origsize );
+
+ while (AdapterList) {
+ PIP_ADAPTER_UNICAST_ADDRESS addr;
+ if(wcsstr(AdapterList->FriendlyName, wcstring)) {
+ printf("Using interface: %S\n", AdapterList->FriendlyName);
+ printf("\t%S\n", AdapterList->Description);
+ addr = AdapterList->FirstUnicastAddress;
+
+ si = (struct sockaddr_in*)addr->Address.lpSockaddr;
+ if (fdebug) {
+ uchar *psaddr;
+ psaddr = (uchar *)&si->sin_addr.s_addr;
+ printf("mac match: rgmyip=%d.%d.%d.%d s_addr=%d.%d.%d.%d "
+ "fsharedMAC=%d\n",
+ rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+ psaddr[0], psaddr[1], psaddr[2], psaddr[3],
+ fsharedMAC);
+ }
+ if (!IpIsValid(rgmyip)) { /*IP not specified*/
+ memcpy(rgmyip, &si->sin_addr.s_addr, 4);
+ memcpy(rgmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ }
+ memcpy(osmyip, &si->sin_addr.s_addr, 4);
+ memcpy(osmymac, AdapterList->PhysicalAddress, MAC_LEN);
+ /* FriendlyName == ifname already */
+ result = 1;
+ break;
+ }
+ AdapterList = AdapterList->Next;
+ }
+
+ if (AdapterAddresses != NULL) {
+ free(AdapterAddresses);
+ }
+ return result;
+}
+
+int FindEthNum(uchar *macadrin)
+{
+ int i;
+ uchar macadr[MAC_LEN];
+ memcpy(macadr,macadrin,MAC_LEN);
+ if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
+ /* Intel factory assigns them this way, so use that to compare */
+ macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/
+ }
+ i = GetLocalIPByMAC(macadr);
+ if (i == 1) fethfound = 1;
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3],
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
+ /* The actual Windows ethernet interface is determined
+ * in Get_IPMac_Addr using ipconfig, so
+ * init eth interface number as eth0 for Windows. */
+ return(0);
+}
+#elif defined(HPUX)
+#define INSAP 22
+#define OUTSAP 24
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <ctype.h>
+#include <sys/stropts.h>
+#include <sys/poll.h>
+#include <sys/dlpi.h>
+
+#define bcopy(source, destination, length) memcpy(destination, source, length)
+#define AREA_SZ 5000 /*=* buffer length in bytes *=*/
+#define GOT_CTRL 1
+#define GOT_DATA 2
+#define GOT_BOTH 3
+#define GOT_INTR 4
+#define GOT_ERR 128
+static u_long ctl_area[AREA_SZ];
+static u_long dat_area[AREA_SZ];
+static struct strbuf ctl = {AREA_SZ, 0, (char *)ctl_area};
+static struct strbuf dat = {AREA_SZ, 0, (char *)dat_area};
+static char *dlpi_dev[] = {"/dev/dlpi", ""};
+
+/*=* get a message from a stream; return type of message *=*/
+static int get_msg(int fd)
+{
+ int flags = 0;
+ int res, ret;
+ ctl_area[0] = 0;
+ dat_area[0] = 0;
+ ret = 0;
+ res = getmsg(fd, &ctl, &dat, &flags);
+ if(res < 0) {
+ if(errno == EINTR) {
+ return(GOT_INTR);
+ } else {
+ return(GOT_ERR);
+ }
+ }
+ if(ctl.len > 0) {
+ ret |= GOT_CTRL;
+ }
+ if(dat.len > 0) {
+ ret |= GOT_DATA;
+ }
+ return(ret);
+}
+
+/*=* verify that dl_primitive in ctl_area = prim *=*/
+static int check_ctrl(int prim)
+{
+ dl_error_ack_t *err_ack = (dl_error_ack_t *)ctl_area;
+ if(err_ack->dl_primitive != prim) {
+ return GOT_ERR;
+ }
+ return 0;
+}
+
+/*=* put a control message on a stream *=*/
+static int put_ctrl(int fd, int len, int pri)
+{
+ ctl.len = len;
+ if(putmsg(fd, &ctl, 0, pri) < 0) {
+ return GOT_ERR;
+ }
+ return 0;
+}
+
+/*=* put a control + data message on a stream *=*/
+static int put_both(int fd, int clen, int dlen, int pri)
+{
+ ctl.len = clen;
+ dat.len = dlen;
+ if(putmsg(fd, &ctl, &dat, pri) < 0) {
+ return GOT_ERR;
+ }
+ return 0;
+}
+
+/*=* open file descriptor and attach *=*/
+static int dl_open(const char *dev, int ppa, int *fd)
+{
+ dl_attach_req_t *attach_req = (dl_attach_req_t *)ctl_area;
+ if((*fd = open(dev, O_RDWR)) == -1) {
+ return GOT_ERR;
+ }
+ attach_req->dl_primitive = DL_ATTACH_REQ;
+ attach_req->dl_ppa = ppa;
+ put_ctrl(*fd, sizeof(dl_attach_req_t), 0);
+ get_msg(*fd);
+ return check_ctrl(DL_OK_ACK);
+}
+
+/*=* send DL_BIND_REQ *=*/
+static int dl_bind(int fd, int sap, u_char *addr)
+{
+ dl_bind_req_t *bind_req = (dl_bind_req_t *)ctl_area;
+ dl_bind_ack_t *bind_ack = (dl_bind_ack_t *)ctl_area;
+ bind_req->dl_primitive = DL_BIND_REQ;
+ bind_req->dl_sap = sap;
+ bind_req->dl_max_conind = 1;
+ bind_req->dl_service_mode = DL_CLDLS;
+ bind_req->dl_conn_mgmt = 0;
+ bind_req->dl_xidtest_flg = 0;
+ put_ctrl(fd, sizeof(dl_bind_req_t), 0);
+ get_msg(fd);
+ if (GOT_ERR == check_ctrl(DL_BIND_ACK)) {
+ return GOT_ERR;
+ }
+ bcopy((u_char *)bind_ack + bind_ack->dl_addr_offset, addr,
+ bind_ack->dl_addr_length);
+ return 0;
+}
+
+int FindEthNum(uchar *addr)
+{ /* Need to use DLPI for HPUX */
+ /*See http://cplus.kompf.de/artikel/macaddr.html */
+ int fd;
+ int ppa;
+ u_char mac_addr[25];
+ char **dev;
+ int i = 0;
+
+ for (dev = dlpi_dev; **dev != ''; ++dev) {
+ for (ppa=0; ppa<10; ++ppa) {
+ if (GOT_ERR != dl_open(*dev, ppa, &fd)) {
+ if (GOT_ERR != dl_bind(fd, INSAP, mac_addr)) {
+ // bcopy( mac_addr, addr, 6);
+ i = ppa;
+ if (memcmp(mac_addr,addr,MAC_LEN) == 0) {
+ memcpy(osmymac, addr, MAC_LEN);
+ return(ppa);
+ }
+ }
+ }
+ close(fd);
+ }
+ }
+ return(i);
+}
+#else
+
+static char *get_ifreq_mac(struct ifreq *ifrq)
+{
+ char *ptr;
+#ifdef SOLARIS
+ ptr = (char *)&ifrq->ifr_ifru.ifru_enaddr[0];
+#elif BSD
+ ptr = (char *)&ifrq->ifr_ifru.ifru_addr.sa_data[0];
+#elif MACOS
+ static uchar mactmp[MAC_LEN];
+ ptr = &mactmp[0];
+ MacSetInvalid(ptr);
+#else
+ ptr = (char *)&ifrq->ifr_hwaddr.sa_data[0];
+#endif
+ return (ptr);
+}
+
+extern int find_ifname(char *ifname); /*see idiscover.c*/
+
+int FindEthNum(uchar *macadrin)
+{ /*only used for Linux*/
+ struct ifreq ifr;
+ int skfd;
+ int nCurDevice;
+ int devnum = -1;
+ int devos = 0;
+ uchar macadr[MAC_LEN];
+ uchar macsav[MAC_LEN];
+ uchar mactmp[MAC_LEN];
+ uchar ipsav[4];
+ char szDeviceName[ 16 ]; /* MAX_DEVICE_NAME_LENGTH + 1 */
+ uchar fipvalid = 0;
+ int n;
+
+ memcpy(macadr,macadrin,MAC_LEN);
+ if (fsharedMAC == 0 && vend_id == VENDOR_INTEL) {
+ /* Intel factory assigns them this way, so use that to compare */
+ macadr[MAC_LEN-1] -= 2; /*OS MAC = BMC MAC - 2*/
+ }
+#ifdef DBG
+ if (fdebug) {
+ uchar *pb;
+ pb = macadrin;
+ printf("input mac:%02x:%02x:%02x:%02x:%02x:%02x "
+ "tmp mac:%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pb[0],pb[1],pb[2],pb[3],pb[4],pb[5],
+ macadr[0],macadr[1],macadr[2],macadr[3],macadr[4],macadr[5]);
+ }
+#endif
+
+ n = find_ifname(szDeviceName);
+ if (n >= 0) {
+ n = strlen_(szDeviceName);
+ if (n < sizeof(ifpattn)) {
+ strcpy(ifpattn,szDeviceName);
+ ifpattn[n - 1] = 0; /*truncate last digit*/
+ }
+ if (fdebug)
+ printf("found ifname %s, pattern %s\n",szDeviceName,ifpattn);
+ }
+
+ if ( ( skfd = socket(AF_INET, SOCK_DGRAM, 0 ) ) < 0) {
+ if ( fdebug ) {
+ perror("socket");
+ return devnum;
+ }
+ }
+
+ for( nCurDevice = 0 ;
+ (nCurDevice < NUM_DEVICES_TO_CHECK) && (devnum == -1);
+ nCurDevice++ )
+ {
+ sprintf( szDeviceName, "%s%d", ifpattn, nCurDevice ); /*eth%d*/
+ memset((char *)&ifr,0,sizeof(ifr));
+ strcpy(ifr.ifr_name, szDeviceName );
+#ifdef SIOCGIFHWADDR
+ if (ioctl(skfd, SIOCGIFHWADDR, &ifr) > 0) {
+ if ( fdebug )
+ printf("FindEthNum: Could not get MAC address for %s\n",
+ szDeviceName);
+ } else
+#endif
+ {
+ uchar *pb;
+ pb = (uchar *)get_ifreq_mac(&ifr);
+#ifdef DBG
+ if (fdebug) {
+ printf("%s mac: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ szDeviceName, pb[0],pb[1],pb[2],pb[3],pb[4],pb[5]);
+ }
+#endif
+ memcpy(macsav, pb, MAC_LEN);
+ /* check if this device is configured for IP addr */
+ memset((char *)&ifr,0,sizeof(ifr));
+ strcpy(ifr.ifr_name, szDeviceName);
+ ifr.ifr_addr.sa_family = AF_INET;
+ if (ioctl(skfd, SIOCGIFADDR, &ifr) >= 0) {
+ fipvalid = 1;
+ memcpy(ipsav, &ifr.ifr_addr.sa_data[2], 4);
+ } else fipvalid = 0;
+ if (memcmp(macsav, macadr, MAC_LEN) == 0) { /*found match*/
+ devnum = nCurDevice;
+ memcpy(osmymac, macsav, MAC_LEN);
+ if (fipvalid) memcpy(osmyip, ipsav, 4);
+ break;
+ }
+ if (nCurDevice == 0) { /*set a default of eth0*/
+ devos = nCurDevice;
+ memcpy(osmymac,macsav, MAC_LEN);
+ if (fipvalid) memcpy(osmyip, ipsav, 4);
+ } else if (fipvalid) { /*check if NIC1 is eth1,2,3,...*/
+ memcpy(mactmp,osmymac,MAC_LEN);
+ mactmp[MAC_LEN-1] -= 1;
+ if (memcmp(mactmp,macsav,MAC_LEN) == 0) {
+ devos = nCurDevice;
+ memcpy(osmymac, macsav, MAC_LEN);
+ memcpy(osmyip, ipsav, 4);
+ }
+ }
+ } /*end else*/
+ }
+ if (!fsetifn) {
+ if (devnum == -1) { /*not found, use devos default*/
+ devnum = devos;
+ sprintf( ifname, "%s%d", ifpattn, devnum ); /*eth%d*/
+ } else { /* match was found, devnum set */
+ fethfound = 1;
+ strcpy(ifname, szDeviceName );
+ }
+ }
+ close(skfd);
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf("FindEth: OS %s IP=%d.%d.%d.%d MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ ifname, osmyip[0], osmyip[1], osmyip[2], osmyip[3],
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
+ return(devnum);
+}
+#endif
+
+int show_channels(void)
+{
+ int ret, rlen;
+ uchar iData[2];
+ uchar rData[10];
+ uchar cc, mtype;
+ int j;
+ int rv = -1;
+
+ for (j = 1; j < MAXCHAN; j++) {
+ rlen = sizeof(rData);
+ iData[0] = (uchar)j; /*channel #*/
+ memset(rData,0,9); /*initialize recv data*/
+ ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
+ if (rv != 0) rv = ret;
+ if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
+ continue;
+ if (ret != 0) {
+ if (fdebug) printf("get_chan_info rc = %x\n",ret);
+ break;
+ }
+ mtype = rData[1]; /* channel medium type */
+ switch(mtype) {
+ case 4: printf("channel[%d] type = lan\n",j); break; /*802.3 LAN type*/
+ case 5: printf("channel[%d] type = serial\n",j); break;
+ case 7: printf("channel[%d] type = pci_smbus\n",j); break;
+ case 12: printf("channel[%d] type = system_interface\n",j); break;
+ default: printf("channel[%d] type = other %d\n",j,mtype); break;
+ }
+ rv = 0;
+ } /*end for j*/
+ return(rv);
+}
+
+/*
+ * GetBmcEthDevice
+ * Attempt to auto-detect the BMC LAN channel and matching OS eth port.
+ * INPUT: lan_parm = lan channel from user -L option, 0xFF if not specified
+ * OUTPUT: lan_ch is set to BMC LAN channel number
+ * if success, returns index of OS eth port (0, 1, ...).
+ * if no lan channels found, returns -2.
+ * if other error, returns -1.
+ */
+int GetBmcEthDevice(uchar lan_parm, uchar *pchan)
+{
+ LAN_RECORD LanRecord;
+ int devnum = -1;
+ int ret;
+ uchar bmcMacAddress[ MAC_LEN ]; /*MAC_LEN = 6*/
+ int rlen;
+ uchar iData[2];
+ uchar rData[10];
+ uchar cc;
+ int i = 0;
+ int j, jstart, jend, jlan;
+ uchar mtype;
+ uchar *pb;
+ int fchgmac;
+ // int found = 0;
+
+ /* Find the LAN channel(s) via Channel Info */
+ if (lan_parm < MAXCHAN) { /* try user-specified channel only */
+ lan_ch = lan_parm;
+ jstart = lan_parm;
+ jend = lan_parm+1;
+ } else {
+ jstart = 1;
+ jend = MAXCHAN;
+ }
+ memset(bmcMacAddress,0xff,sizeof(bmcMacAddress)); /*initialize to invalid*/
+ for (j = jstart; j < jend; j++) {
+ rlen = sizeof(rData);
+ iData[0] = (uchar)j; /*channel #*/
+ memset(rData,0,9); /*initialize recv data*/
+ ret = ipmi_cmd(GET_CHANNEL_INFO, iData, 1, rData, &rlen, &cc, fdebug);
+ if (ret == 0xcc || cc == 0xcc) /* special case for ipmi_lan */
+ continue;
+ if (ret != 0) {
+ if (fdebug) printf("get_chan_info rc = %x\n",ret);
+ break;
+ }
+ mtype = rData[1]; /* channel medium type */
+ if (mtype == 4) { /* 802.3 LAN type*/
+ if (fdebug) printf("chan[%d] = lan\n",j);
+ jlan = lan_ch; /*save prev lan chan */
+ /* Get BMC MAC for this LAN channel. */
+ /* Note: BMC MAC may not be valid yet. */
+ lan_ch = (uchar)j; /*set lan channel for GetLanEntry*/
+ ret = GetLanEntry( 5 /*MAC_ADDRESS_LAN_PARAM*/,0, &LanRecord);
+ if ( ret != 0 ) {
+ lan_ch = (uchar)jlan; /*restore lan_ch*/
+ printf( "GetBmcEthDevice: GetLanEntry failed\n" );
+ return devnum;
+ } else {
+ pb = &LanRecord.data[0];
+ if (fdebug) printf("chan[%d] BMC MAC %x:%x:%x:%x:%x:%x\n",j,
+ pb[0], pb[1], pb[2], pb[3], pb[4], pb[5] );
+ fchgmac = 0;
+ /* use the lowest valid lan channel MAC address */
+ if (!MacIsValid(bmcMacAddress)) /* old MAC not valid*/
+ fchgmac = 1;
+ else if (MacIsValid(pb) && /* new MAC is valid and*/
+ (memcmp(bmcMacAddress,pb, sizeof(bmcMacAddress)) > 0))
+ fchgmac = 1; /* new MAC lower */
+ /* if no -L 3 and this is gcm, do not pick it. */
+ if ((j == gcm_ch) && (lan_parm == PARM_INIT))
+ fchgmac = 0;
+ if (fchgmac) { /* pick this channel & MAC */
+ memcpy(bmcMacAddress,pb,sizeof(bmcMacAddress));
+ lan_ch = (uchar)j;
+ } else lan_ch = (uchar)jlan; /*restore prev lan chan*/
+ }
+ i++; /* i = num lan channels found */
+ } else if (mtype == 5) { /* serial type*/
+ if (fdebug) printf("chan[%d] = serial\n",j);
+ ser_ch = (uchar)j; /* set to last serial channel */
+ } else if (mtype == 7) { /* PCI SMBus */
+ if (fdebug) printf("chan[%d] = pci_smbus\n",j);
+ } else if (mtype == 12) { /* system interface */
+ if (fdebug) printf("chan[%d] = system_interface\n",j);
+ } else if (mtype == 1) { /* IPMB */
+ if (fdebug) printf("chan[%d] = IPMB\n",j);
+ } else /* other channel medium types, see IPMI 1.5 Table 6-3 */
+ if (fdebug) printf("chan[%d] = %d\n",j,mtype);
+ }
+ if (i == 0) return(-2); /* no lan channels found */
+ if (fdebug) printf("lan_ch detected = %d\n",lan_ch);
+
+ /* This will work if the BMC MAC is shared with the OS */
+ /* Otherwise, wait until we get the eth dev from the gateway below */
+ devnum = FindEthNum(bmcMacAddress);
+ if ( fdebug )
+ printf("GetBmcEthDevice: channel %d, %s%d\n",lan_ch,ifpattn,devnum);
+ if (pchan != NULL) *pchan = lan_ch;
+ return devnum;
+}
+
+/* file_grep/findmatch - No longer used here, see ievents.c */
+
+/*
+ * Get_Mac
+ * This routine finds a MAC address from a given IP address.
+ * Usually for the Alert destination.
+ * It uses ARP cache to do this.
+ */
+#if defined(WIN32)
+int Get_Mac(uchar *ipadr,uchar *macadr, char *nodname)
+{
+ DWORD dwRetVal;
+ IPAddr DestIp = 0;
+ IPAddr SrcIp = 0; /* default for src ip */
+ ULONG MacAddr[2]; /* for 6-byte hardware addresses */
+ ULONG PhysAddrLen = MAC_LEN; /* default to length of six bytes */
+ BYTE *bPhysAddr;
+
+ if (!IpIsValid(ipadr)) {
+ if (fdebug) printf("Get_Mac: invalid IP addr\n");
+ return 1; /*error*/
+ }
+ memcpy(&DestIp, ipadr, 4);
+
+ /* invoke system ARP query */
+ dwRetVal = SendARP(DestIp, SrcIp, MacAddr, &PhysAddrLen);
+
+ if (dwRetVal == NO_ERROR)
+ { /* no error - get the MAC */
+ bPhysAddr = (BYTE *) & MacAddr;
+ if (PhysAddrLen) {
+ memcpy(macadr, bPhysAddr, MAC_LEN);
+ } else
+ printf("Warning: SendArp completed successfully, but returned length=0\n");
+ } else if (dwRetVal == ERROR_GEN_FAILURE)
+ { /* MAC not available in this network - get gateway MAC */
+ memcpy(macadr, rggwymac, MAC_LEN);
+ } else
+ { /* other errors */
+ printf("Error: SendArp failed with error: %d", dwRetVal);
+ switch (dwRetVal) {
+ case ERROR_INVALID_PARAMETER:
+ printf(" (ERROR_INVALID_PARAMETER)\n");
+ break;
+ case ERROR_INVALID_USER_BUFFER:
+ printf(" (ERROR_INVALID_USER_BUFFER)\n");
+ break;
+ case ERROR_BAD_NET_NAME:
+ printf(" (ERROR_GEN_FAILURE)\n");
+ break;
+ case ERROR_BUFFER_OVERFLOW:
+ printf(" (ERROR_BUFFER_OVERFLOW)\n");
+ break;
+ case ERROR_NOT_FOUND:
+ printf(" (ERROR_NOT_FOUND)\n");
+ break;
+ default:
+ printf("\n");
+ break;
+ }
+ return 1;
+ }
+ return 0;
+} /* end Get_Mac() for WIN32*/
+#elif defined(SOLARIS)
+int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
+{
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm;
+ int num, i;
+ int foundit = 0;
+ int ret = 0;
+
+ if (IpIsValid(ipadr)) { /* if valid IP address */
+ sprintf(arping_cmd,
+ "ping %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
+ ipadr[0],ipadr[1],ipadr[2],ipadr[3],
+ ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile);
+ } else if (nodename != NULL) { /*if valid nodename */
+ sprintf(arping_cmd,
+ "ping %s >/dev/null; arp -a |grep %s >%s\n",
+ nodename,nodename,alertfile);
+ } else ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug) printf("%s", arping_cmd);
+ system(arping_cmd);
+
+ fparp = fopen(alertfile,"r");
+ if (fparp == NULL) {
+ fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile,get_errno());
+ ret = -1;
+ } else {
+ /* sample output: */
+ /* e1000g0 cooper9 255.255.255.255 o 00:07:e9:06:55:c8 */
+ while (fgets(buff, 1023, fparp)) {
+ /* should only run through loop once */
+ num = strcspn(buff," \t"); /* skip 1st word ("e1000g0") */
+ i = strspn(&buff[num]," \t"); /* skip whitespace */
+ pb = &buff[num+i];
+ num = strcspn(pb," \t"); /* skip 2nd word (nodename/IP) */
+ i = strspn(&pb[num]," \t"); /* skip whitespace */
+ pb += (num+i);
+ pm = &pb[25]; /* Now pb[25] has the MAC address */
+ { /*validate new address?*/
+ if (fdebug) printf("Get_Mac: mac=%s\n",pm);
+ foundit = 1;
+ if (!MacIsValid(macadr)) atomac(macadr,pm);
+ break;
+ }
+ } /*end while*/
+ fclose(fparp);
+ } /*end else file opened*/
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid(rggwymac) && !MacIsValid(macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
+ }
+ return(ret);
+} /*end Get_Mac for Solaris*/
+#elif defined(BSD)
+int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
+{
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm;
+ int num, i, j;
+ int foundit = 0;
+ int ret = 0;
+
+ if (IpIsValid(ipadr)) { /* if valid IP address */
+ sprintf(arping_cmd,
+ "ping -c2 %d.%d.%d.%d >/dev/null; arp -a -n |grep %d.%d.%d.%d >%s\n",
+ ipadr[0],ipadr[1],ipadr[2],ipadr[3],
+ ipadr[0],ipadr[1],ipadr[2],ipadr[3], alertfile);
+ } else if (nodename != NULL) { /*if valid nodename */
+ sprintf(arping_cmd,
+ "ping -c2 %s >/dev/null; arp -a |grep %s >%s\n",
+ nodename,nodename,alertfile);
+ } else ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug) printf("%s", arping_cmd);
+ system(arping_cmd);
+
+ fparp = fopen(alertfile,"r");
+ if (fparp == NULL) {
+ fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile,get_errno());
+ ret = -1;
+ } else {
+ /* sample output of arp -a -n: */
+ /* ? (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
+ /* sample output of arp -a: */
+ /* telcoserv (192.168.1.200) at 00:0e:0c:e5:df:65 on em0 [ethernet] */
+ while (fgets(buff, 1023, fparp)) {
+ /* should only run through loop once */
+ pb = &buff[0];
+ for (j = 0; j < 3; j++) { /* skip 3 words */
+ num = strcspn(pb," \t"); /* skip jth word */
+ i = strspn(&pb[num]," \t"); /* skip whitespace */
+ pb += (num+i);
+ }
+ pm = &pb[0]; /* Now pb[0] has the MAC address */
+ { /* no need to validate new address*/
+ if (fdebug) printf("Get_Mac: mac=%s\n",pm);
+ foundit = 1;
+ if (!MacIsValid(macadr)) atomac(macadr,pm);
+ break;
+ }
+ } /*end while*/
+ fclose(fparp);
+ } /*end else file opened*/
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid(rggwymac) && !MacIsValid(macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
+ }
+ return(ret);
+} /*end Get_Mac for BSD */
+#else
+int Get_Mac(uchar *ipadr,uchar *macadr, char *nodename)
+{ /* Get_Mac for Linux */
+ FILE *fparp;
+ char buff[1024];
+ /* char arpfile[] = "/proc/net/arp"; */
+ char alertfile[] = "/tmp/dest.arping";
+ char arping_cmd[128];
+ char *pb, *pm, *px;
+ int num, i;
+ int foundit = 0;
+ int ret = 0;
+ char *_ifname;
+
+ if (strcmp(ifname,"gcm") == 0) _ifname = ifname0; /*see gcm_ch instead*/
+ else _ifname = ifname;
+
+ /* Get a MAC address for a given IP address or nodename */
+ if (IpIsValid(ipadr)) { /* if valid IP address */
+ sprintf(arping_cmd,
+ "arping -I %s -c 2 %d.%d.%d.%d |grep reply |tail -n1 >%s\n",
+ _ifname,ipadr[0],ipadr[1],ipadr[2],ipadr[3],alertfile);
+ } else if (nodename != NULL) { /*if valid nodename */
+ sprintf(arping_cmd,
+ "arping -I %s -c 2 %s |grep reply |tail -n1 >%s\n",
+ _ifname,nodename,alertfile);
+ } else ret = -1;
+
+ if (ret == 0) { /* if valid IP address */
+ /* make sure the destination is in the arp cache */
+ if (fdebug) printf("%s", arping_cmd);
+ ret = system(arping_cmd);
+
+ fparp = fopen(alertfile,"r");
+ if (fparp == NULL) {
+ fprintf(stdout,"Get_Mac: Cannot open %s, errno = %d\n",
+ alertfile,get_errno());
+ ret = -1;
+ } else {
+ ret = 0;
+ while (fgets(buff, 1023, fparp)) {
+ /* should only run through loop once */
+ num = strcspn(buff," \t"); /* skip 1st word ("Unicast") */
+ i = strspn(&buff[num]," \t");
+ pb = &buff[num+i];
+ if (strncmp(pb,"reply",5) == 0) { /* valid output */
+ /* Find the ip address */
+ pb += 6 + 5; /* skip "reply from " */
+ num = strcspn(pb," \t");
+ pb[num] = 0;
+ if (fdebug) printf("Get_Mac: ip=%s\n",pb);
+ /* IP address should already match input param */
+ if (!IpIsValid(ipadr)) /* had nodname only*/
+ atoip(ipadr,pb); /* fill in ipadr */
+ /* Now find the mac address */
+ pm = strchr(&pb[num+1],'[');
+ if (pm == NULL) pm = &pb[num+2]; /* just in case */
+ pm++;
+ px = strchr(pm,']');
+ if (px == NULL) px = pm + 17; /* just in case */
+ px[0] = 0;
+ if (fdebug) printf("Get_Mac: mac=%s\n",pm);
+ foundit = 1;
+ if (!MacIsValid(macadr)) atomac(macadr,pm);
+ break;
+ }
+ } /*end while*/
+ fclose(fparp);
+ } /*end else file opened*/
+ } /*endif valid IP */
+
+ if (foundit == 0) { /* no errors, but no mac reply */
+ if (MacIsValid(rggwymac) && !MacIsValid(macadr))
+ /* this is useful if the ipadr is not in the local subnet */
+ memcpy(macadr,rggwymac,6); /* get to it from the default gateway */
+ }
+ return(ret);
+} /* end Get_Mac() for Linux*/
+#endif
+
+#ifdef WIN32
+/*
+ * Set subnet mask based on current IP address (Windows).
+ */
+int SetSubnetMask() {
+ PMIB_IPADDRTABLE pIPAddrTable;
+ unsigned int i;
+ DWORD dwSize = 0, dwRetVal;
+ LPVOID lpMsgBuf;
+
+ pIPAddrTable = (MIB_IPADDRTABLE*) malloc( sizeof( MIB_IPADDRTABLE) );
+
+ if ( pIPAddrTable ) {
+ // Make an initial call to GetIpAddrTable to get the
+ // necessary size into the dwSize variable
+ if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
+ free( pIPAddrTable );
+ pIPAddrTable = (MIB_IPADDRTABLE *) malloc ( dwSize );
+ }
+ } else
+ printf("Memory allocation failed.\n");
+
+ if ( pIPAddrTable ) {
+ // Make a second call to GetIpAddrTable to get the
+ // actual data we want
+ if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) == NO_ERROR ) {
+ for(i = 0; i < pIPAddrTable->dwNumEntries; ++i) {
+ if(memcmp(&(pIPAddrTable->table[i].dwAddr), rgmyip, 4) == 0) {
+ memcpy(rgsubnet, &(pIPAddrTable->table[i].dwMask), 4);
+ free( pIPAddrTable );
+ return 1;
+ }
+ }
+ } else {
+ if (FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ dwRetVal,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL )) {
+ printf("\tError: %s", lpMsgBuf);
+ }
+
+ printf("Call to GetIpAddrTable failed.\n");
+ }
+ }
+
+ if ( pIPAddrTable )
+ free( pIPAddrTable );
+
+ return 0;
+}
+
+/*
+ * Extract gateway address from routing table (Windows).
+ */
+int SetDefaultGateway() {
+ PMIB_IPFORWARDTABLE pIpForwardTable;
+ DWORD dwRetVal, dwSize;
+
+ unsigned int nord_mask;
+ unsigned int nord_ip;
+ unsigned int nord_net;
+
+ unsigned int i;
+
+ nord_mask = *((unsigned int *)rgsubnet);
+ nord_ip = *((unsigned int *)rgmyip);
+
+ nord_net = nord_ip & nord_mask;
+
+ pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(sizeof(MIB_IPFORWARDTABLE));
+ if (pIpForwardTable == NULL) {
+ printf("Error allocating memory\n");
+ return 0;
+ }
+
+ dwSize = 0;
+ if (GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
+ free(pIpForwardTable);
+ pIpForwardTable = (MIB_IPFORWARDTABLE*) malloc(dwSize);
+ if (pIpForwardTable == NULL) {
+ printf("Error allocating memory\n");
+ return 0;
+ }
+ }
+
+ /*
+ * Note that the IPv4 addresses returned in
+ * GetIpForwardTable entries are in network byte order
+ */
+ if ((dwRetVal = GetIpForwardTable(pIpForwardTable, &dwSize, 0)) == NO_ERROR) {
+ for (i = 0; i < (int) pIpForwardTable->dwNumEntries; i++) {
+ unsigned int gwaddr = pIpForwardTable->table[i].dwForwardNextHop;
+ if(nord_net == (gwaddr & nord_mask) && nord_ip != gwaddr)
+ { /* searching for gateways from our network with different address than ours */
+ memcpy(rggwyip, &gwaddr, 4);
+ return 0;
+ }
+ }
+ free(pIpForwardTable);
+ return 1;
+ }
+ else {
+ printf("\tGetIpForwardTable failed.\n");
+ free(pIpForwardTable);
+ return 0;
+ }
+
+}
+/*endif WIN32*/
+#endif
+
+/*
+ * Get_IPMac_Addr
+ * This routine finds the IP and MAC for the local interface,
+ * the default gateway, and SNMP alert destination from the
+ * BMC and OS information.
+ *
+ * Linux snmpd.conf locations (see ipmiutil.spec):
+ * RedHat, MontaVista: /etc/snmp/snmpd.conf
+ * SuSE SLES 8: /etc/ucdsnmpd.conf
+ * SuSE SLES 9: /etc/snmpd.conf
+ */
+#ifdef WIN32
+int Get_IPMac_Addr()
+{ /*for Windows*/
+ char ipstr[] = "IP Address";
+ char macstr[] = "Physical Address";
+ char gwystr[] = "Default Gateway";
+ char substr[] = "Subnet Mask";
+ int found = 0;
+ char fgetmac;
+
+ if (IpIsValid(rgmyip))
+ { /* user-specified ip, get mac */
+ if (fdebug) printf("User IP was specified\n");
+ if (!MacIsValid(rgmymac))
+ { /* no user-specified MAC, get it from IP */
+ if (fdebug) printf("No user MAC specified\n");
+ if(!GetLocalMACByIP())
+ { /* couldn't get MAC from IP, get old one */
+ if (fdebug) printf("No MAC from IP, use old\n");
+ if(IpIsValid(bmcmyip) && MacIsValid(bmcmymac))
+ {
+ printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3],
+ bmcmymac[4], bmcmymac[5]);
+ memcpy(rgmymac,bmcmymac,MAC_LEN);
+ } else {
+ printf("Failed to obtain valid MAC\n");
+ }
+ } else {
+ printf("Using adapter MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ rgmymac[0], rgmymac[1],
+ rgmymac[2], rgmymac[3],
+ rgmymac[4], rgmymac[5]);
+ }
+ } else { /* user MAC available */
+ printf("Using user MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ rgmymac[0], rgmymac[1],
+ rgmymac[2], rgmymac[3],
+ rgmymac[4], rgmymac[5]);
+ }
+ } else { /* no user-specified IP */
+ if (fdebug) printf("No user IP specified\n");
+ if (!MacIsValid(rgmymac))
+ { /* no user-specified MAC, get it from interface */
+ if(!GetLocalDataByIface())
+ { /* use existing MAC an IP */
+ printf("Using current BMC IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1],
+ bmcmyip[2], bmcmyip[3]);
+ memcpy(rgmyip,bmcmyip,4);
+ printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3],
+ bmcmymac[4], bmcmymac[5]);
+ memcpy(rgmymac,bmcmymac,MAC_LEN);
+
+ }
+ } else { /* user-specified MAC */
+ if(!GetLocalIPByMAC(rgmymac))
+ { /* use existing MAC and IP */
+ printf("Using current BMC IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1],
+ bmcmyip[2], bmcmyip[3]);
+ memcpy(rgmyip,bmcmyip,4);
+ printf("Using current BMC MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+ bmcmymac[0], bmcmymac[1],
+ bmcmymac[2], bmcmymac[3],
+ bmcmymac[4], bmcmymac[5]);
+ memcpy(rgmymac,bmcmymac,MAC_LEN);
+ }
+ }
+ }
+
+ if (rghostname[0] == 0) { /*hostname not specified*/
+ if (!fipmilan)
+ gethostname(rghostname,sizeof(rghostname));
+ }
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
+ ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname,
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
+
+ if(!SubnetIsValid(rgsubnet)) {
+ SetSubnetMask();
+ }
+ if (!IpIsValid(rggwyip)) { /* if gwy ip not user-specified */
+ SetDefaultGateway();
+ }
+
+ if (lan_ch == gcm_ch) {
+ if (SubnetIsSame(rgmyip,rggwyip,rgsubnet)) fgetmac = 1;
+ else fgetmac = 0;
+ } else fgetmac = 1;
+
+ if (fgetmac) {
+ if (IpIsValid(rggwyip) && !MacIsValid(rggwymac)) /*gwy mac not specified*/
+ Get_Mac(rggwyip,rggwymac,NULL);
+
+ if (IpIsValid(rggwy2ip) && !MacIsValid(rggwy2mac)) /*gwy2 mac not valid*/
+ Get_Mac(rggwy2ip,rggwy2mac,NULL);
+ }
+
+ return(0);
+} /* end Get_IPMac_Addr for Windows */
+
+#elif defined(HPUX)
+int Get_IPMac_Addr()
+{ /*for HP-UX*/
+ return(-1);
+}
+#else
+int Get_IPMac_Addr()
+{ /*for Linux*/
+#if defined(SOLARIS)
+ char rtfile[] = "/tmp/route";
+ char snmpfile[] = "/etc/snmp/conf/snmpd.conf";
+#elif defined(BSD)
+ char rtfile[] = "/tmp/route";
+ char snmpfile[] = "/etc/snmpd.config";
+#else
+ char rtfile[] = "/proc/net/route";
+ char snmpfile[] = "/etc/snmp/snmpd.conf";
+#endif
+ // char alertfile[] = "/tmp/alert.arping";
+ // FILE *fparp;
+ FILE *fprt;
+ int fd = -1;
+ int skfd;
+ uchar *pc;
+ int rc = 0;
+ int i,j;
+ uchar bnetadr[4];
+ uchar bgateadr[4];
+ char gate_addr[128];
+ char iface[16];
+ char defcommunity[19] = "public";
+ char buff[1024];
+ char alertname[60];
+ int num, nmatch;
+ struct ifreq ifr;
+ char *_ifname;
+ char fgetmac;
+
+ /* Get the IP address and associated MAC address specified. */
+ /* Local for ethN; Default Gateway; Alert Destination */
+
+ /* Get the default gateway IP */
+#if defined(SOLARIS) || defined(BSD)
+ char rtcmd[80];
+ sprintf(rtcmd,"netstat -r -n |grep default |awk '{ print $2 }' >%s",rtfile);
+ system(rtcmd);
+ /* use rtfile output from netstat -r, see also /etc/defaultroute */
+ fprt = fopen(rtfile,"r");
+ if (fprt == NULL) {
+ fprintf(stdout,"netstat: Cannot open %s, errno = %d\n",rtfile,get_errno());
+ } else {
+ while (fgets(buff, 1023, fprt)) {
+ if ((buff[0] > '0') && (buff[0] <= '9')) { /*valid*/
+ atoip(bgateadr,buff);
+ if (fdebug)
+ printf("default gateway: %s, %d.%d.%d.%d %s\n",buff,
+ bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],ifname);
+ if (!IpIsValid(rggwyip)) /* if not user-specified */
+ memcpy(rggwyip,bgateadr,4);
+ break;
+ }
+ }
+ fclose(fprt);
+ } /*end-else good open */
+#else
+ /* cat /proc/net/route and save Gwy if Dest == 0 and Gateway != 0 */
+ fprt = fopen(rtfile,"r");
+ if (fprt == NULL) {
+ fprintf(stdout,"route: Cannot open %s, errno = %d\n",rtfile,get_errno());
+ } else {
+ char rtfmt[] = "%16s %128s %128s %X %d %d %d %128s %d %d %d\n";
+ int iflags, refcnt, use, metric, mss, window, irtt;
+ char mask_addr[128], net_addr[128];
+ uint *pnet;
+ uint *pgate;
+
+ pnet = (uint *)&bnetadr[0];
+ pgate = (uint *)&bgateadr[0];
+ while (fgets(buff, 1023, fprt)) {
+ num = sscanf(buff, rtfmt,
+ iface, net_addr, gate_addr,
+ &iflags, &refcnt, &use, &metric, mask_addr,
+ &mss, &window, &irtt);
+ if (num < 10 || !(iflags & RTF_UP))
+ continue;
+
+ j = 6;
+ for (i = 0; i < 4; i ++) {
+ bnetadr[i] = htoi(&net_addr[j]);
+ bgateadr[i] = htoi(&gate_addr[j]);
+ j -= 2;
+ }
+ if ((*pnet == 0) && (*pgate != 0)) { /* found default gateway */
+ if (fdebug)
+ printf("default gateway: %s, %d.%d.%d.%d %s\n",gate_addr,
+ bgateadr[0], bgateadr[1], bgateadr[2], bgateadr[3],iface);
+ if (!IpIsValid(rggwyip)) /* if not user-specified */
+ memcpy(rggwyip,bgateadr,4);
+ _ifname = iface; /*use this iface for gwy mac */
+ if (!fsetifn) strncpy(ifname,iface,16);
+ break;
+ }
+ } /*end while*/
+ fclose(fprt);
+ } /*end-else good open */
+#endif
+
+ /* Create a channel to the NET kernel. */
+ if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ perror("socket");
+ return(-3);
+ }
+
+ /* Find a valid local BMC MAC Address */
+ if (lan_ch == gcm_ch) {
+ /* GCM has its own unique mac address */
+ if (!MacIsValid(rgmymac)) {
+ if (MacIsValid(bmcmymac)) {
+ memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
+ } else { /*error*/
+ printf("invalid MAC address for gcm\n");
+ }
+ } /*else use rgmymac if specified*/
+ _ifname = iface; /*use the iface from gwy (e.g. eth0) */
+ fsharedMAC = 0; /*gcm has separate NIC, separate MAC*/
+
+ // fd = -1;
+ fd = skfd; // get_socket_for_af(AF_INET) below;
+ } else { /*else not gcm*/
+ if (!fsetifn && !fethfound) { /*do not have ifname yet*/
+ i = FindEthNum(bmcmymac);
+ if (i >= 0) sprintf(ifname,"%s%d",ifpattn,i);
+ }
+ ifr.ifr_addr.sa_family = AF_INET;
+ if (fdebug) printf("getipmac: ifname=%s\n",ifname);
+ _ifname = ifname;
+ strcpy(ifr.ifr_name, _ifname);
+
+#ifdef SIOCGIFHWADDR
+ /* Get the local if HWADDR (MAC Address) from OS */
+ if (ioctl(skfd, SIOCGIFHWADDR, &ifr) < 0) {
+ if (fdebug)
+ printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",_ifname,get_errno());
+ } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/
+#endif
+
+ if (memcmp(bmcmymac,osmymac,MAC_LEN) == 0) {
+ /* osmymac and ifname were set above by FindEthNum */
+ printf("\tBMC shares IP/MAC with OS NIC %s\n",_ifname);
+ fsharedMAC = 1;
+ } /* else fsharedMAC = 0; */
+
+ if (fsharedMAC == 0) { /* then BMC has separate MAC */
+ if (!MacIsValid(rgmymac) && MacIsValid(bmcmymac))
+ memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
+ } else { /* else OS & BMC share a MAC */
+ /* Use the local if HWADDR (MAC Address) from OS */
+ if (!MacIsValid(rgmymac)) { /* if not user-specified */
+ if (MacIsValid(bmcmymac))
+ memcpy(rgmymac,bmcmymac,MAC_LEN); /*use existing*/
+ else memcpy(rgmymac,osmymac,MAC_LEN); /*use OS mac*/
+ }
+ }
+ fd = skfd; // get_socket_for_af(AF_INET) below;
+ }
+
+ if (fd >= 0) { /* if valid fd, find OS IP */
+ strcpy(ifr.ifr_name, _ifname);
+ ifr.ifr_addr.sa_family = AF_INET;
+ /* Get the IFADDR (IP Address) from OS */
+ if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
+ int err;
+ err = get_errno();
+ /* errno 99 here means that eth0 is not enabled/up/defined. */
+ if (err == 99)
+ printf("ioctl(SIOCGIFADDR) error, %s not enabled\n",_ifname);
+ else if (fdebug)
+ printf("ioctl(SIOCGIFADDR,%s) error, errno=%d\n",_ifname,err);
+ } else { /* got the local OS IP successfully */
+ pc = (uchar *)&ifr.ifr_addr.sa_data[2];
+ if (fdebug)
+ printf("%s addr = %d.%d.%d.%d\n",_ifname,pc[0],pc[1],pc[2],pc[3]);
+ memcpy(osmyip, pc, 4);
+ if (!IpIsValid(rgmyip) && (fsharedMAC==1)) /*not specified, shared*/
+ memcpy(rgmyip, osmyip, 4);
+
+ /* get the local OS netmask */
+ strcpy(ifr.ifr_name, _ifname);
+ if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) {
+ if (fdebug)
+ printf("ioctl(SIOCGIFNETMASK) error, errno=%d\n",get_errno());
+ /* if leave invalid, will use default rgsubnet */
+ } else { // sizeof(struct sockaddr)
+ pc = (uchar *)&ifr.ifr_netmask.sa_data[2];
+ if (fdebug)
+ printf("subnet = %d.%d.%d.%d \n", pc[0],pc[1],pc[2],pc[3]);
+ memcpy(ossubnet, pc, 4);
+ if (!SubnetIsValid(rgsubnet) && fsharedMAC) /*not specified*/
+ memcpy(rgsubnet, pc, 4);
+ }
+
+#ifdef SIOCGIFHWADDR
+ /* Get the localhost OS HWADDR (MAC Address) */
+ if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
+ if (fdebug)
+ printf("ioctl(SIOCGIFHWADDR,%s) error, errno = %d\n",
+ _ifname,get_errno());
+ } else memcpy(osmymac,get_ifreq_mac(&ifr),MAC_LEN); /*OS mac*/
+#endif
+ }
+ }
+ close(skfd); /* done, close the socket */
+
+ if (rghostname[0] == 0) { /*hostname not specified*/
+ if (!fipmilan)
+ gethostname(rghostname,sizeof(rghostname));
+ }
+ if (fdebug) /* show the local OS eth if and MAC */
+ printf("OS %s IP=%d.%d.%d.%d %s MAC=%02x:%02x:%02x:%02x:%02x:%02x used for arp\n",
+ _ifname, osmyip[0],osmyip[1],osmyip[2],osmyip[3], rghostname,
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
+
+ if (!IpIsValid(rgmyip) && IpIsValid(bmcmyip)) {
+ /* If no user-specified IP and there is a valid IP already in the
+ * BMC LAN configuration, use the existing BMC LAN IP. */
+ memcpy(rgmyip,bmcmyip,4);
+ if (fdebug) printf("Using current IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1],
+ bmcmyip[2], bmcmyip[3]);
+ }
+
+ /* Get the default gateway MAC */
+ if (lan_ch == gcm_ch) {
+ if (SubnetIsSame(osmyip,rggwyip,ossubnet)) fgetmac = 1;
+ else { /* gateway is not on the same subnet as RMM/GCM */
+ fgetmac = 0; /*don't try to get mac if not the same subnet*/
+ if ((fset_ip & GWYIP) == 0) memset(rggwyip,0,4);
+ }
+ } else fgetmac = 1;
+ if (fgetmac && IpIsValid(rggwyip) && !MacIsValid(rggwymac))
+ Get_Mac(rggwyip,rggwymac,NULL); /*gwy mac not specified, so get mac*/
+
+ /* Get the Alert Destination IP */
+ /* By default, attempt to obtain this from /etc/snmp/snmpd.conf. */
+ /* cat /etc/snmp/snmpd.conf | grep trapsink |tail -n1 | cut -f2 -d' ' */
+ alertname[0] = 0; /* default to null string */
+ fprt = fopen(snmpfile,"r");
+ if (fprt == NULL) {
+ printf("snmp: Cannot open %s, errno = %d\n",snmpfile,get_errno());
+ } else {
+ // char snmpfmt[] = "%20s %60s\n";
+ // char *keywd, *value;
+ while (fgets(buff, 1023, fprt)) {
+ /* parse each line */
+ if (buff[0] == '#') continue; /*skip comment lines*/
+ /* skip leading whitespace here */
+ j = strspn(&buff[0]," \t");
+ if (strncmp(&buff[j],"com2sec",7) == 0) { /* found community line */
+ /* usu like this: "com2sec demouser default public" */
+ i = j + 7;
+ for (j = 0; j < 3; j++) {
+ num = strspn(&buff[i]," \t");
+ i += num;
+ num = strcspn(&buff[i]," \t\r\n");
+ if (j < 2) i += num;
+ }
+ buff[i+num] = 0;
+ if (fsetcommunity == 0) { /* if not user-specified */
+ strcpy(rgcommunity,&buff[i]);
+ strcpy(defcommunity,&buff[i]);
+ }
+ }
+#ifdef BSD
+ if (strncmp(&buff[j],"traphost :=",11) == 0) nmatch = 11;
+ else nmatch = 0;
+#else
+ if (strncmp(&buff[j],"trapsink",8) == 0) nmatch = 8;
+ else if (strncmp(&buff[j],"trap2sink",9) == 0) nmatch = 9;
+ else nmatch = 0;
+#endif
+ if (nmatch > 0) { /* found trapsink line match */
+ if (fdebug) printf("%s: %s",snmpfile,&buff[j]);
+ num = strspn(&buff[j+nmatch]," \t");
+ i = j + nmatch + num;
+ if (buff[i] == '`') continue;
+ num = strcspn(&buff[i]," \t\r\n");
+ strncpy(alertname,&buff[i],num); /* save alert destination */
+ alertname[num] = 0;
+ i += num;
+ num = strspn(&buff[i]," \t"); /*skip whitespace*/
+ i += num;
+ num = strcspn(&buff[i]," \t\r\n"); /*span next word*/
+ if (num != 0) { /* there is another word, that is community */
+ if (fsetcommunity == 0) { /* if not user-specified */
+ strncpy(rgcommunity,&buff[i],num); /* save community */
+ rgcommunity[num] = 0;
+ }
+ } else { /*have trapsink node with no community*/
+ /* use previously discovered default community from above */
+ strcpy(rgcommunity,defcommunity);
+ }
+ /* dont break, keep looking, use the last one */
+ }
+ } /*end while*/
+ fclose(fprt);
+ if (fdebug)
+ printf("snmp alertname=%s community=%s\n",alertname,rgcommunity);
+ } /*end else snmpfile*/
+
+ /* Get the Alert Destination MAC from the alertname. */
+ if (alertname[0] != 0) {
+#ifdef TEST
+ char arping_cmd[128];
+ char *pb, *pm, *px;
+ int num, i;
+ if (fdebug) printf("alert %s ip=%d.%d.%d.%d osip=%d.%d.%d.%d "
+ "mac=%02x:%02x:%02x:%02x:%02x:%02x "
+ "osmac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ alertname,
+ rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
+ osmyip[0], osmyip[1], osmyip[2], osmyip[3],
+ rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
+ rgdestmac[4], rgdestmac[5],
+ osmymac[0], osmymac[1], osmymac[2], osmymac[3],
+ osmymac[4], osmymac[5]);
+#endif
+ if (!IpIsValid(rgdestip)) { /* if not user-specified with -A */
+ if (IpIsValid(bmcdestip)) { /* use existing if valid */
+ memcpy(rgdestip,bmcdestip,4);
+ if (MacIsValid(bmcdestmac))
+ memcpy(rgdestmac,bmcdestmac,MAC_LEN);
+ }
+ else if ((strncmp(alertname,"localhost",9) == 0) )
+ { /* snmpd.conf = localhost (self) is the SNMP alert destination */
+ if (IpIsValid(osmyip))
+ memcpy(rgdestip,osmyip,4);
+ if (!MacIsValid(rgdestmac)) { /* if not user-specified */
+ // Get_Mac(rgdestip,rgdestmac,alertname); (wont work for local)
+ memcpy(rgdestmac,osmymac,MAC_LEN);
+ }
+ } /*endif local */
+ }
+ if (!MacIsValid(rgdestmac)) /* if MAC not vaild or user-specified */
+ {
+ /* Use arping to get MAC from alertname or IP */
+ Get_Mac(rgdestip,rgdestmac,alertname);
+ }
+ } /*endif have alertname*/
+
+ return(rc);
+} /* end Get_IPMac_Addr */
+#endif
+
+int ShowChanAcc(uchar bchan)
+{
+ LAN_RECORD LanRecord;
+ int ret = 0;
+ uchar access;
+ char *pstr;
+ uchar pb0, pb1;
+
+ if (bchan == lan_ch) pstr = "lan";
+ else if (bchan == ser_ch) pstr = "ser";
+ else pstr = "?";
+ ret = GetChanAcc(bchan, 0x40, &LanRecord);
+ if (fdebug)
+ printf(" GetChanAcc(%d), ret = %d, data = %02x %02x\n",
+ bchan,ret, LanRecord.data[0], LanRecord.data[1]);
+ pb0 = LanRecord.data[0];
+ pb1 = LanRecord.data[1];
+ if (fcanonical)
+ printf("Channel %d Access Mode %s%c ",bchan,pspace3,bdelim);
+ else
+ printf("Channel(%d=%s) Access Mode: %02x %02x : ",bchan,pstr,pb0,pb1);
+ access = pb0;
+ switch (access & 0x03) {
+ case 0: printf("Disabled, "); break;
+ case 1: printf("Pre-Boot, "); break;
+ case 2: printf("Always Avail, "); break;
+ case 3: printf("Shared, "); break;
+ }
+ if (access & 0x20) printf("PEF Alerts Disabled\n"); /*0*/
+ else printf("PEF Alerts Enabled\n"); /*1*/
+ return(ret);
+}
+
+static int GetSessionInfo(uchar *rData, int sz)
+{
+ int rv, rlen;
+ uchar ccode;
+ uchar iData[5];
+
+ iData[0] = 0x00; /*get data for this session*/
+ rlen = sz;
+ rv = ipmi_cmdraw(CMD_GET_SESSION_INFO,NETFN_APP, BMC_SA,PUBLIC_BUS,BMC_LUN,
+ iData,1,rData, &rlen, &ccode, fdebug);
+ if ((rv == 0) && (ccode != 0)) rv = ccode;
+ return(rv);
+}
+
+static int GetPefCapabilities(uchar *bmax)
+{
+ int rv, rlen;
+ uchar ccode;
+ uchar rData[MAX_BUFFER_SIZE];
+
+ rlen = sizeof(rData);
+ rv = ipmi_cmdraw(0x10, NETFN_SEVT, BMC_SA,PUBLIC_BUS,BMC_LUN,
+ NULL,0,rData, &rlen, &ccode, fdebug);
+ if ((rv == 0) && (ccode != 0)) rv = ccode;
+ if ((rv == 0) && (bmax != NULL))
+ *bmax = rData[2]; /*max num PEF table entries*/
+ return(rv);
+}
+
+int GetSerialOverLan( uchar chan, uchar bset, uchar block )
+{
+ uchar requestData[24];
+ uchar rData[MAX_BUFFER_SIZE];
+ int rlen;
+ int status, i;
+ uchar ccode;
+ uchar enable_parm, auth_parm, baud_parm;
+ ushort getsolcmd;
+ uchar user;
+
+ if (fIPMI20 && fSOL20) {
+ getsolcmd = GET_SOL_CONFIG2;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ } else {
+ getsolcmd = GET_SOL_CONFIG;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ chan = 0; /*override chan for IPMI 1.5*/
+ }
+ if (!fcanonical)
+ printf("%s, GetSOL for channel %d ...\n",progname,chan);
+
+ requestData[0] = chan; /*channel*/
+ requestData[1] = enable_parm;
+ requestData[2] = bset; /*set*/
+ requestData[3] = block; /*block*/
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd, requestData,4, rData, &rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ if (ccode == 0xC1) { /* unsupported command */
+ printf("Serial-Over-Lan not available on this platform\n");
+ return(status);
+ } else {
+ printf("SOL Enable ccode = %x\n",ccode);
+ status = ccode;
+ }
+ } else { /*success*/
+ if (fcanonical) {
+ printf("Channel %d SOL Enable %s",chan,pspace3);
+ } else {
+ printf("SOL Enable: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ }
+ if (rData[1] == 0x01) printf("%c enabled\n",bdelim);
+ else printf("%c disabled\n",bdelim);
+ }
+
+ if (!fcanonical)
+ {
+ requestData[0] = chan;
+ requestData[1] = auth_parm;
+ requestData[2] = bset; // selector
+ requestData[3] = block; // block
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ printf("SOL Auth ccode = %x\n",ccode);
+ status = ccode;
+ } else { /*success*/
+ printf("SOL Auth: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ printf(": ");
+ show_priv(rData[1]); /* priv level = User,Admin,... */
+ printf("\n");
+ }
+
+ requestData[0] = chan;
+ requestData[1] = SOL_ACC_INTERVAL_PARAM;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ printf("SOL Accum Interval ccode = %x\n",ccode);
+ status = ccode;
+ } else { /*success*/
+ printf("SOL Accum Interval: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ printf(": %d msec\n",(rData[1] * 5));
+ }
+
+ requestData[0] = chan;
+ requestData[1] = SOL_RETRY_PARAM;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ printf("SOL Retry ccode = %x\n",ccode);
+ status = ccode;
+ } else { /*success*/
+ printf("SOL Retry Interval: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ printf(": %d msec\n",(rData[2] * 10));
+ }
+ }
+
+ if (!fRomley)
+ {
+ requestData[0] = chan;
+ requestData[1] = baud_parm;
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd,requestData,4,rData, &rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ printf("SOL nvol Baud ccode = %x\n",ccode);
+ status = ccode;
+ } else { /*success*/
+ uchar b;
+ if (fcanonical) {
+ printf("Channel %d SOL Baud Rate%s",chan,pspace3);
+ } else {
+ printf("SOL nvol Baud Rate: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ }
+ /* if not user-specified and previously enabled, use existing */
+ b = (rData[1] & 0x0f);
+ if ((fnewbaud == 0) && BaudValid(b)) {
+ sol_baud = b;
+ sol_bvalid = 1;
+ }
+ printf("%c %s\n",bdelim,Baud2Str(b));
+ }
+
+ if (!fcanonical)
+ {
+ requestData[0] = chan;
+ requestData[1] = SOL_VOL_BAUD_RATE_PARAM; /*0x06*/
+ requestData[2] = bset;
+ requestData[3] = block;
+ rlen = sizeof(rData);
+ status = ipmi_cmd(getsolcmd,requestData,4,rData,&rlen,&ccode,fdebug);
+ if (status != 0) return(status);
+ if (ccode) {
+ printf("SOL vol Baud ccode = %x\n",ccode);
+ status = ccode;
+ } else { /*success*/
+ printf("SOL vol Baud Rate: ");
+ for (i = 1; i < rlen; i++) printf("%02x ",rData[i]);
+ printf("%c %s\n",bdelim,Baud2Str(rData[1]));
+ }
+ }
+ }
+ if (fIPMI20) {
+ if (vend_id != VENDOR_IBM) {
+ /* IBM 0x00DC returns invalid cmd for SOL Payload commands. */
+ if (!fcanonical) {
+ requestData[0] = chan;
+ rlen = sizeof(rData);
+ status = ipmi_cmdraw(GET_PAYLOAD_SUPPORT, NETFN_APP,
+ BMC_SA,PUBLIC_BUS,BMC_LUN,
+ requestData,1,rData, &rlen, &ccode, fdebug);
+ if ((status != 0) || (ccode != 0)) {
+ printf("SOL Payload Support error %d, ccode = %x\n",status,ccode);
+ if (status == 0) status = ccode;
+ } else { /*success*/
+ printf("SOL Payload Support(%d): ",chan);
+ for (i = 0; i < rlen; i++) printf("%02x ",rData[i]);
+ printf("\n");
+ }
+ } /*endif not canonical*/
+ /* get Payload Access for 4 users, not just lan_user */
+ for (user = 1; user <= show_users; user++)
+ {
+ /* mBMC doesn't support more than 1 user */
+ if (fmBMC && (user > 1)) break;
+ /* IPMI 2.0 has >= 4 users */
+ requestData[0] = chan;
+ requestData[1] = user;
+ rlen = sizeof(rData);
+ status = ipmi_cmdraw(GET_PAYLOAD_ACCESS, NETFN_APP,
+ BMC_SA,PUBLIC_BUS,BMC_LUN,
+ requestData,2,rData, &rlen, &ccode, fdebug);
+ if ((status != 0) || (ccode != 0)) {
+ printf("SOL Payload Access(%d,%d) error %d, ccode = %x\n",
+ chan,user,status,ccode);
+ if (status == 0) status = ccode;
+ } else { /*success*/
+ if (fcanonical) {
+ printf("Channel %d SOL Payload Access(user%d)%s",chan,user,
+ pspace1);
+ } else {
+ printf("SOL Payload Access(%d,%d): ",chan,user);
+ for (i = 0; i < rlen; i++) printf("%02x ",rData[i]);
+ }
+ if ((rData[0] & 0x02) != 0) printf("%c enabled\n",bdelim);
+ else printf("%c disabled\n",bdelim);
+ }
+ } /*end user loop*/
+ } /*endif not IBM*/
+ }
+
+ return(status);
+} /*end GetSerialOverLan */
+
+/*
+ECHO SOL Config Enable
+CMDTOOL 20 30 21 %1 01 01
+
+ECHO SOL Authentication (Administrator)
+CMDTOOL 20 30 21 %1 02 04
+
+ECHO SOL Accumlate Interval and threshold
+CMDTOOL 20 30 21 %1 03 06 14
+
+ECHO SOL Retry Interval and threshold
+CMDTOOL 20 30 21 %1 04 06 14
+
+ECHO SOL non-volatile baud rate
+CMDTOOL 20 30 21 %1 05 07
+
+ECHO SOL volatile baud rate
+CMDTOOL 20 30 21 %1 06 07
+
+ECHO Set user Payload Access for user 1
+CMDTOOL 20 18 4c %1 01 02 00 00 00
+ */
+int SetupSerialOverLan( int benable )
+{
+ uchar requestData[24];
+ uchar responseData[MAX_BUFFER_SIZE];
+ int responseLength = MAX_BUFFER_SIZE;
+ int status;
+ uchar completionCode;
+ uchar enable_parm, auth_parm, baud_parm;
+ ushort setsolcmd;
+ ushort getsolcmd;
+ uchar bchan, b;
+
+ if (fIPMI20 && fSOL20) {
+ setsolcmd = SET_SOL_CONFIG2;
+ getsolcmd = GET_SOL_CONFIG2;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ bchan = lan_ch;
+ } else {
+ setsolcmd = SET_SOL_CONFIG;
+ getsolcmd = GET_SOL_CONFIG;
+ enable_parm = SOL_ENABLE_PARAM;
+ auth_parm = SOL_AUTHENTICATION_PARAM;
+ baud_parm = SOL_BAUD_RATE_PARAM;
+ bchan = 0x00; /*override chan for IPMI 1.5*/
+ }
+ memset(requestData, 0, sizeof(requestData)); /* zero-fill */
+ requestData[0] = bchan;
+ requestData[1] = enable_parm;
+ if (benable == 0)
+ requestData[2] = SOL_DISABLE_FLAG;
+ else
+ requestData[2] = SOL_ENABLE_FLAG;
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(setsolcmd, requestData,3,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ switch( completionCode ) {
+ case 0x00: /* success */
+ break;
+ case 0xC1: /* unsupported command */
+ SELprintf("SetupSerialOverLan: SOL not available on this platform\n");
+ return 0;
+ default: /* other error */
+ SELprintf("SetupSerialOverLan: SOL_ENABLE_PARAM ccode=%x\n",
+ completionCode);
+ return -1;
+ break;
+ }
+ } else {
+ SELprintf( "SET_SOL_CONFIG, enable SOL failed\n" );
+ return -1;
+ }
+ if (benable == 0) return 0;
+
+ requestData[0] = bchan; /* channel */
+ requestData[1] = auth_parm;
+ requestData[2] = 0x00; /* set selector */
+ requestData[3] = 0x00; /* block selector */
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(getsolcmd, requestData,4,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ SELprintf("SetupSerialOverLan: GET_SOL_AUTHENTICATION_PARAM code=%x\n",
+ completionCode);
+
+ return -1;
+ }
+ } else {
+ SELprintf( "SOL_CONFIG, get SOL authentication failed\n" );
+ return -1;
+ }
+
+ if ((vend_id == VENDOR_SUPERMICROX) ||
+ (vend_id == VENDOR_SUPERMICRO)) b = SOL_PRIVILEGE_LEVEL_OPERATOR;
+ else b = SOL_PRIVILEGE_LEVEL_USER;
+ requestData[0] = bchan;
+ requestData[1] = auth_parm;
+ requestData[2] = b | ( responseData[1] & 0x80 ); /* priv | enable */
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmd(setsolcmd, requestData,3,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status == ACCESS_OK) {
+ if( completionCode ) {
+ SELprintf("SET_SOL_AUTHENTICATION_PARAM code=%x\n",
+ completionCode);
+
+ return -1;
+ }
+ } else {
+ SELprintf( "SET_SOL_CONFIG, set SOL authentication failed\n" );
+ return -1;
+ }
+
+ requestData[0] = bchan;
+ requestData[1] = SOL_ACC_INTERVAL_PARAM;
+ requestData[2] = sol_accum[0]; //0x04;
+ requestData[3] = sol_accum[1]; //0x32;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug) SELprintf("Setting SOL AccumInterval\n");
+ status = ipmi_cmd(setsolcmd, requestData,4,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf("SET SOL AccumInterval ret=%d ccode=%x\n",
+ status,completionCode);
+ return -1;
+ }
+
+ /* Some BMCs return sporadic errors for SOL params (e.g. Kontron)*/
+ // if (vend_id == VENDOR_KONTRON) ;
+ // else
+ {
+ requestData[0] = bchan;
+ requestData[1] = SOL_RETRY_PARAM;
+ requestData[2] = sol_retry[0]; //0x06;
+ requestData[3] = sol_retry[1]; //0x14;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug) SELprintf("Setting SOL RetryInterval\n");
+ status = ipmi_cmd(setsolcmd, requestData,4,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf("SET SOL RetryInterval ret=%d ccode=%x\n",
+ status,completionCode);
+ return -1;
+ }
+ }
+
+ if (fRomley) ; /* skip SOL BAUD */
+ else { /* else SOL BAUD is used, so set it. */
+ if (fnewbaud == 0) { /* no user-specified SOL baud */
+ /* if sol_bvalid, sol_baud was set to existing value above */
+ if (!sol_bvalid) {
+ status = GetSerEntry(7, (LAN_RECORD *)&responseData);
+ if (status == 0) { /* use Serial baud for SOL */
+ sol_baud = responseData[1];
+ if (fdebug) SELprintf("Serial Baud is %s\n",Baud2Str(sol_baud));
+ }
+ }
+ }
+ requestData[0] = bchan;
+ requestData[1] = baud_parm;
+ requestData[2] = sol_baud;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug) SELprintf("Setting SOL BAUD to %s\n",Baud2Str(sol_baud));
+ status = ipmi_cmd(setsolcmd, requestData,3,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf("SET SOL BAUD ret=%d ccode=%x\n", status,completionCode);
+ return -1;
+ }
+
+ requestData[0] = bchan;
+ requestData[1] = SOL_VOL_BAUD_RATE_PARAM;
+ requestData[2] = sol_baud;
+ responseLength = MAX_BUFFER_SIZE;
+ if (fdebug)
+ printf("Setting SOL vol BAUD to %s\n",Baud2Str(sol_baud));
+ status = ipmi_cmd(setsolcmd, requestData,3,responseData,
+ &responseLength, &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ printf("SET SOL vol BAUD ret=%d ccode=%x\n",status,completionCode);
+ return -1;
+ }
+ }
+
+ if (fIPMI20 && fSOL20) {
+ if (vend_id == VENDOR_KONTRON && lan_user == 1) {
+ if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n",
+ lan_user);
+ } else if (vend_id == VENDOR_IBM) { /*non-conformance*/
+ if (fdebug) SELprintf("Skipping SOL Payload Access for user %d\n",
+ lan_user);
+ } else {
+ if (fdebug) SELprintf("Setting SOL Payload Access for user %d\n",
+ lan_user);
+ requestData[0] = bchan;
+ requestData[1] = lan_user; /*enable this user*/
+ requestData[2] = 0x02; /*enable std 2.0 SOL*/
+ requestData[3] = 0;
+ requestData[4] = 0;
+ requestData[5] = 0;
+ responseLength = MAX_BUFFER_SIZE;
+ status = ipmi_cmdraw(SET_PAYLOAD_ACCESS, NETFN_APP,
+ BMC_SA,PUBLIC_BUS,BMC_LUN,
+ requestData,6,responseData, &responseLength,
+ &completionCode, fdebug);
+ if (status != ACCESS_OK || completionCode) {
+ SELprintf("SET SOL Payload Access ret=%d ccode=%x\n",
+ status,completionCode);
+ return -1;
+ }
+ }
+ }
+ return 0;
+} /*end SetupSerialOverLan */
+
+static char *PefDesc(int idx, uchar stype)
+{
+ char *pdesc, *p;
+ static char mystr[60];
+ int mylen = sizeof(mystr);
+ pdesc = &mystr[0];
+ if (pefdesc != NULL) strcpy(pdesc,pefdesc[idx]); /* if Intel, pre-defined */
+ else strcpy(pdesc,"reserved"); /* else set default to detect */
+ if ((stype != 0) && (strcmp(pdesc,"reserved") == 0)) {
+ /* Dynamically set the pef desc string from the sensor type */
+ switch(stype) {
+ case 0x01: strcpy(pdesc,"Temperature"); break;
+ case 0x02: strcpy(pdesc,"Voltage"); break;
+ case 0x04: strcpy(pdesc,"Fan"); break;
+ case 0x05: strcpy(pdesc,"Chassis"); break;
+ case 0x07: strcpy(pdesc,"BIOS"); break;
+ case 0x08: strcpy(pdesc,"Power Supply"); break;
+ case 0x09: strcpy(pdesc,"Power Unit"); break;
+ case 0x0c: strcpy(pdesc,"Memory"); break;
+ case 0x0f: strcpy(pdesc,"Boot"); break;
+ case 0x12: strcpy(pdesc,"System Restart"); break;
+ case 0x13: strcpy(pdesc,"NMI"); break;
+ case 0x23: strcpy(pdesc,"Watchdog"); break;
+ case 0x20: strcpy(pdesc,"OS Critical Stop"); break;
+ default:
+#ifdef METACOMMAND
+ p = get_sensor_type_desc(stype);
+ if (p != NULL) {
+ strncpy(pdesc,p,mylen);
+ mystr[mylen-1] = 0; /*stringify*/
+ }
+#else
+ sprintf(pdesc,"Other[%02x]",stype);
+#endif
+ break;
+ }
+ if (pef_array[idx-1][4] == PEF_SEV_OK) strcat(pdesc," OK");
+ }
+ return(pdesc);
+}
+
+
+#ifdef METACOMMAND
+int i_lan(int argc, char **argv)
+#else
+#ifdef WIN32
+int __cdecl
+#else
+int
+#endif
+main(int argc, char **argv)
+#endif
+{
+ int ret;
+ PEF_RECORD PefRecord;
+ LAN_RECORD LanRecord;
+ int i, idx, j;
+ int c;
+ char *pstr;
+ uchar bset;
+ int ndest = 4;
+ int idest;
+ char mystr[80];
+ char fpefok = 1;
+ uchar * pc; int sz;
+ char *pa;
+ char *pb;
+
+ // progname = argv[0];
+ printf("%s ver %s \n",progname,progver);
+ j = 0; freadonly = FLAG_INIT;
+ idx = argc; /*getopt loop counter*/
+ /* available opt chars: y O Q + = ~ _ */
+ while ((c = getopt(argc, argv,"a:b:cdef:gh:i:j:klm:n:op:q:rstu:v:w:xy:z#::A:B:C:DEF:G:H:I:J:K:L:M:N:OP:Q:R:S:T:U:V:X:YZ:?")) != EOF) {
+ switch(c) {
+ case 'a': /* alert dest number (usu 1 thru 4) */
+ alertnum = atob(optarg);
+ if (alertnum > alertmax) alertnum = 1;
+ j++;
+ break;
+ case 'b': bAuth = htoi(optarg); j++; break; /*undocumented*/
+ case 'c': fcanonical = 1; bdelim = BDELIM; break;
+ case 'd': fenable = 0; fdisable = 1; freadonly = 0; break;
+ case 'e': fenable = 1; fdisable = 0; freadonly = 0; break;
+ case 'f': i = atoi(optarg); /*set arp_ctl*/
+ if (i < 0 || i > 3) printf("Invalid ARP control %d\n",i);
+ else {
+ arp_ctl = i;
+ fsetarp = 1;
+ j++;
+ }
+ break;
+ case 'l': fpefenable = 0; fenable = 2;
+ fdisable = 0; freadonly = 0; break;
+ case 'h': /* VLAN ID */
+ i = atoi(optarg);
+ if (i > 4095) vlan_enable = 0;
+ else {
+ vlan_enable = 1;
+ vlan_id = (ushort)i;
+ }
+ j++;
+ break;
+ case 'y': /* OEM LAN Failover enable/disable */
+ i = atoi(optarg);
+ if (i < 0) printf("Failover(-y) parameter is negative\n");
+ else failover_enable = i;
+ j++;
+ break;
+ case 'Q': /* VLAN Priority */
+ i = atoi(optarg);
+ if (i > 7 || i < 0) vlan_enable = 0;
+ else {
+ vlan_enable = 1;
+ vlan_prio = (uchar)i;
+ }
+ j++;
+ break;
+ case 'i': /* eth interface (ifname) */
+ fsetifn = 1;
+ i = sizeof(ifname);
+ if (strlen(optarg) > (uint)i) optarg[i] = 0;
+ strcpy(ifname,optarg);
+ if (fdebug) printf("ifname = %s\n",ifname);
+ j++;
+ break;
+ case 'j': fCustomPEF = 1; /*custom 10 PEF bytes */
+ fpefenable = 1; /* PEF is implied here */
+ freadonly = 0;
+ memset(custPEF,0,sizeof(custPEF));
+ custPEF[0] = htoi(&optarg[0]); /*action */
+ custPEF[1] = htoi(&optarg[2]); /*policy */
+ custPEF[2] = htoi(&optarg[4]); /*severity*/
+ custPEF[3] = htoi(&optarg[6]); /*genid1 */
+ custPEF[4] = htoi(&optarg[8]); /*genid2 */
+ custPEF[5] = htoi(&optarg[10]); /*sensor_type*/
+ custPEF[6] = htoi(&optarg[12]); /*sensor_num */
+ custPEF[7] = htoi(&optarg[14]); /*evt_trigger*/
+ custPEF[8] = htoi(&optarg[16]); /*data1offset*/
+ custPEF[9] = htoi(&optarg[18]); /*data1mask */
+ if (optarg[20] != 0) {
+ /* optionally get 8 extra PEF entry bytes */
+ custPEF[10] = htoi(&optarg[20]); /*data1cmp1 */
+ custPEF[11] = htoi(&optarg[22]); /*data1cmp2 */
+ custPEF[12] = htoi(&optarg[24]); /*data2mask */
+ custPEF[13] = htoi(&optarg[26]); /*data2cmp1 */
+ custPEF[14] = htoi(&optarg[28]); /*data2cmp2 */
+ custPEF[15] = htoi(&optarg[30]); /*data3mask */
+ custPEF[16] = htoi(&optarg[32]); /*data3cmp1 */
+ custPEF[17] = htoi(&optarg[34]); /*data3cmp2 */
+ }
+ j++;
+ break;
+ case 'k': fSetPEFOks = 1; j++; break; /*configure PEF OK rules */
+ case 'm': set_max_kcs_loops(atoi(optarg)); break;
+ case 'n': /* number/index in PEF table to insert new entry */
+ fpefenable = 1;
+ pefnum = atob(optarg);
+ if (pefnum >= MAXPEF) {
+ pefnum = MAXPEF - 1;
+ fAdjustPefNum = 1;
+ } else fUserPefNum = 1;
+ j++;
+ break;
+ case 'o': fdisableSOL = 1; /*disable SOL only*/
+ fpefenable = 0; /*no change to PEF*/
+ freadonly = 0;
+ break;
+ case 'r': freadonly = 1; fenable = 0; break;
+ case 's': fgetser = 1; break;
+ case 't': ftestonly = 1; freadonly = 1; break;
+ case 'v': /* user access privilege level */
+ i = atoi(optarg);
+ if (valid_priv(i)) lan_access = i & 0x0f;
+ else printf("Invalid privilege -v %d, using Admin\n",i);
+ j++;
+ break;
+ case 'w': i = atoi(optarg); /*set grat arp interval, in #sec*/
+ if (i >= 0 && i < 256) arp_interval = i * 2;
+ else printf("Invalid arp interval -w %d, skipping\n",i);
+ break;
+ case 'x': fdebug = 1; break;
+ case 'z': flanstats = 1; break;
+ case 'D': lan_dhcp = 1; j++; break;
+ case 'O': flansecure = 1; j++; break;
+ case 'I': /* My BMC IP Address */
+ fset_ip |= MYIP;
+ atoip(rgmyip,optarg);
+ j++;
+ break;
+ case 'M': /* My BMC MAC Address */
+ atomac(rgmymac,optarg);
+ if (!MacIsValid(rgmymac)) printf("Invalid MAC for -M\n");
+ j++;
+ break;
+ case 'S': /* Subnet IP Address */
+ atoip(rgsubnet,optarg);
+ j++;
+ break;
+ case 'G': /* Gateway IP Address */
+ fset_ip |= GWYIP;
+ atoip(rggwyip,optarg);
+ j++;
+ break;
+ case 'g': /* Secondary Gateway IP Address */
+ fset_ip |= GWYIP;
+ atoip(rggwy2ip,optarg);
+ j++;
+ break;
+ case 'H': /* Gateway MAC Address */
+ atomac(rggwymac,optarg);
+ if (!MacIsValid(rggwymac)) printf("Invalid MAC for -H\n");
+ j++;
+ break;
+ case 'B': /* SOL Baud rate */
+ fnewbaud = 1;
+ sol_baud = Str2Baud(optarg);
+ j++;
+ break;
+ case 'A': /* Alert Dest IP Address */
+ fset_ip |= DESTIP;
+ /* allow name or ip here via Get_Mac() ? */
+ atoip(rgdestip,optarg);
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'X': /* Alert Dest MAC Address */
+ atomac(rgdestmac,optarg);
+ if (!MacIsValid(rgdestmac)) printf("Invalid MAC for -X\n");
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'K': /* Kontron IPMI hostname */
+ i = sizeof(rghostname); /*usu 18*/
+ if (strlen(optarg) > (uint)i) optarg[i] = 0;
+ strcpy(rghostname,optarg);
+ j++;
+ break;
+ case 'C': /* Community String */
+ fsetcommunity = 1;
+ i = sizeof(rgcommunity); /*usu 18*/
+ if (strlen(optarg) > (uint)i) optarg[i] = 0;
+ strcpy(rgcommunity,optarg);
+ fpefenable = 1; /* PEF is implied here */
+ j++;
+ break;
+ case 'u': /* username to set */
+ myuser = strdup_(optarg); /*remote username */
+ j++;
+ break;
+ case 'p': /* password to set */
+ fpassword = 1;
+ if (strlen(optarg) > PSW_MAX) optarg[PSW_MAX] = 0;
+ strcpy(passwordData,optarg);
+ if (fdebug) printf("Password = %s\n",passwordData);
+ /* Hide password from 'ps' */
+ memset(optarg, ' ', strlen(optarg));
+ j++;
+ break;
+ case 'q':
+ case '#':
+ usernum = atob(optarg);
+ if (usernum > 15) usernum = 0; /*MAX_IPMI_USERS = 15*/
+ j++;
+ break;
+ case 'L':
+ if (strcmp(optarg,"list") == 0) fshowchan = 1;
+ lan_ch_parm = atob(optarg);
+ if (lan_ch_parm > MAXCHAN) lan_ch_parm = PARM_INIT; /*invalid*/
+ break;
+ case 'V': /* priv level */
+ fprivset = 1;
+ case 'N': /* nodename */
+ case 'U': /* remote username */
+ case 'P': /* remote password */
+ case 'R': /* remote password */
+ case 'E': /* get password from IPMI_PASSWORD environment var */
+ case 'F': /* force driver type */
+ case 'T': /* auth type */
+ case 'J': /* cipher suite */
+ case 'Y': /* prompt for remote password */
+ case 'Z': /* set local MC address */
+ parse_lan_options(c,optarg,fdebug);
+ break;
+ default:
+ printf("Usage: %s [-abcdefghijklmnopq#rstuvwxyzBDQK]\n",progname);
+ printf(" \t [-a alertnum -i eth1 -n pefnum ]\n");
+ printf(" \t [-I ipadr -M macadr -S subnet ]\n");
+ printf(" \t [-G gwyip -H gwymac -L lan_channel_num]\n");
+ printf(" \t [-A alertip -X alertmac -C community ]\n");
+ printf(" \t [-g 2nd_gwyip -v priv -B sol_baud ]\n");
+ printf(" \t [-j 10_bytes_custom_pef -b authmask ]\n");
+ printf("where -c shows Canonical, simpler output format\n");
+ printf(" -d Disables BMC LAN & PEF\n");
+ printf(" -e Enables BMC LAN & PEF\n");
+ printf(" -f set ARP Control to 1=grat, 2=resp, 3=both\n");
+ printf(" -g secondary Gateway IP (-G=primary_gwy_ip)\n");
+ printf(" -h VLAN ID (>=4096 to disable)\n");
+ printf(" -j specify custom PEF rule (10 or 18 hex bytes)\n");
+ printf(" -k add PEF oK rules, if PEF enable\n");
+ printf(" -l Enables BMC LAN only, not PEF\n");
+ printf(" -o disable Only SOL\n");
+ printf(" -p password to set \n");
+ printf(" -q/-# User number of LAN username_to_set\n");
+ printf(" -r Read-only BMC LAN & PEF settings\n");
+ printf(" -s Show some Serial settings also \n");
+ printf(" -t Test if BMC LAN is already configured\n");
+ printf(" -u username to set \n");
+ printf(" -v access priVilege: 4=Admin,3=Operator,2=User\n");
+ printf(" -w set Grat ARP Interval to specified # seconds\n");
+ printf(" -x Show eXtra debug messages\n");
+ printf(" -y OEM LAN Failover (1=enable,0=disable if Intel)\n");
+ printf(" -z Show IPMI LAN statistics\n");
+ printf(" -B Baud for SerialOverLan (19.2K,115.2K,...)\n");
+ printf(" -D Use DHCP instead of static IP (-I for server)\n");
+ printf(" -K (Kontron) IPMI hostname to set\n");
+ printf(" -Q VLAN Priority (default =0)\n");
+ printf(" -O Force LAN security: no null user, cipher 0 off\n");
+ print_lan_opt_usage(0);
+ ret = ERR_USAGE;
+ goto do_exit;
+ } /*end switch*/
+ nopts++;
+ } /*end while*/
+
+ if ((freadonly == FLAG_INIT) && (j > 0)) {
+ /* got some options implying set, but no -e -l -d option specified. */
+ foptmsg = 1; /*show warning message later*/
+ freadonly = 1; /*assume read only*/
+ }
+ fipmilan = is_remote();
+ if (fipmilan && !fprivset)
+ parse_lan_options('V',"4",0); /*even if freadonly request admin*/
+ if ((fsetarp == 0) && ostype == OS_WINDOWS)
+ arp_ctl = 0x03; /*grat arp & arp resp enabled */
+
+ ret = GetDeviceID( &LanRecord);
+ if (ret != 0) {
+ goto do_exit;
+ } else { /* success */
+ uchar ipmi_maj, ipmi_min;
+ ipmi_maj = LanRecord.data[4] & 0x0f;
+ ipmi_min = LanRecord.data[4] >> 4;
+ show_devid( LanRecord.data[2], LanRecord.data[3], ipmi_maj, ipmi_min);
+ if (ipmi_maj == 0) fIPMI10 = 1;
+ else if (ipmi_maj == 1 && ipmi_min < 5) fIPMI10 = 1;
+ else fIPMI10 = 0; /* >= IPMI 1.5 is ok */
+ if (ipmi_maj >= 2) fIPMI20 = 1;
+ if (fIPMI20) show_users = 5;
+ else show_users = 3;
+ if (fIPMI10) {
+ printf("This IPMI v%d.%d system does not support PEF records.\n",
+ ipmi_maj,ipmi_min);
+ /* Wont handle PEF, but continue and look for BMC LAN anyway */
+ // fIPMI10 = 1;
+ // ipmi_close_();
+ // exit(1);
+ }
+ prod_id = LanRecord.data[9] + (LanRecord.data[10] << 8);
+ vend_id = LanRecord.data[6] + (LanRecord.data[7] << 8)
+ + (LanRecord.data[8] << 16);
+ /* check Device ID response for Manufacturer ID = 0x0322 (NSC) */
+ if (vend_id == VENDOR_NSC) { /* NSC = 0x000322 */
+ fmBMC = 1; /*NSC miniBMC*/
+ if (pefnum == 12) pefnum = 10; /* change CritStop pefnum to 0x0a */
+ pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/
+ pefmax = 30;
+ fsharedMAC = 1; /* shared MAC with OS */
+ } else if (vend_id == VENDOR_LMC) { /* LMC (on SuperMicro) = 0x000878 */
+ pefdesc = NULL; /* unknown, see PefDesc() */
+ if (pefnum == 12) pefnum = 15; /* change CritStop pefnum */
+ pefmax = 16;
+ fsharedMAC = 0; /* not-shared BMC LAN port */
+ } else if (vend_id == VENDOR_INTEL) { /* Intel = 0x000157 */
+ pefdesc = &pefdesc1[0]; /*default Intel PEF*/
+ pefmax = 20; /*default Intel PEF*/
+ switch(prod_id) {
+ case 0x4311: /* Intel NSI2U w SE7520JR23 */
+ fmBMC = 1; /* Intel miniBMC*/
+ if (pefnum == 12) pefnum = 14; /* change CritStop pefnum */
+ pefdesc = &pefdesc2[0]; /*mini-BMC PEF*/
+ pefmax = 30;
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ break;
+ case 0x0022: /* Intel TIGI2U w SE7520JR23 +IMM*/
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ gcm_ch = 3; /* IMM GCM port, dedicated MAC */
+ show_users = 4;
+ break;
+ case 0x000C: /*TSRLT2*/
+ case 0x001B: /*TIGPR2U*/
+ /* fmBMC=0; Intel Sahalee BMC*/
+ fsharedMAC = 1; /* shared-MAC BMC LAN port, same MAC */
+ break;
+ case 0x0026: /*S5000 Bridgeport*/
+ case 0x0028: /*S5000PAL Alcolu*/
+ case 0x0029: /*S5000PSL StarLake*/
+ case 0x0811: /*S5000PHB TIGW1U */
+ /* fmBMC=0; Intel Sahalee ESB2 BMC*/
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ gcm_ch = 3;
+ parm7 = &iparm7[0]; /*TTL=30*/
+ break;
+ case 0x003E: /*NSN2U or CG2100 Urbanna*/
+ fiBMC = 1; /* Intel iBMC */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ // gcm_ch = 3;
+ parm7 = &iparm7[0]; /*TTL=30*/
+ if (fsetarp == 0)
+ arp_ctl = 0x02; /*grat arp disabled, arp resp enabled */
+ arp_interval = 0x00; /*0 sec, since grat arp disabled */
+ sol_accum[0] = 0x0c; /*Intel defaults*/
+ sol_accum[1] = 0x60; /*Intel defaults*/
+ sol_retry[0] = 0x07; /*Intel defaults*/
+ sol_retry[1] = 0x32; /*Intel defaults*/
+ set_max_kcs_loops(URNLOOPS); /*longer for SetLan cmds (default 300)*/
+ break;
+ case 0x0107: /* Intel Caneland*/
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ gcm_ch = 3;
+ break;
+ case 0x0100: /*Tiger2 ia64*/
+ /* for ia64 set chan_pefon, chan_pefoff accordingly*/
+ chan_pefon = CHAN_ACC_PEFON64;
+ chan_pefoff = CHAN_ACC_PEFOFF64;
+ /* fall through */
+ default: /* else other Intel */
+ /* fmBMC = 0; * Intel Sahalee BMC*/
+ if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */
+ else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
+ break;
+ } /*end switch*/
+ if (is_romley(vend_id,prod_id)) fRomley = 1;
+ if (is_grantley(vend_id,prod_id)) fGrantley = 1;
+ if (fRomley) {
+ fiBMC = 1; /* Intel iBMC */
+ fsharedMAC = 0; /* not-shared BMC LAN port, separate MAC */
+ set_max_kcs_loops(URNLOOPS); /*longer for SetLan (default 300)*/
+ fipv6 = 1;
+ if (fsetarp == 0) arp_ctl = 0x03; /*default to both for Romley*/
+ }
+ } else { /* else other vendors */
+ if (fIPMI20) fsharedMAC = 0; /* recent, not-shared BMC MAC */
+ else fsharedMAC = 1; /* usu IPMI 1.x has shared BMC MAC */
+ pefdesc = NULL; /* unknown, see PefDesc() */
+ if (pefnum == 12) pefnum = 15; /* change CritStop pefnum to 15? */
+ pefmax = 20;
+ if (!fUserPefNum) fAdjustPefNum = 1;
+ }
+ if (fmBMC) show_users = 1; /* mBMC doesn't support more than 1 user */
+ }
+
+ if (fshowchan) {
+ ret = show_channels();
+ exit(ret);
+ }
+
+ ret = GetPefCapabilities(&bset);
+ if ((ret == 0) && (bset <= MAXPEF)) pefmax = bset;
+
+ /* Get the BMC LAN channel & match it to an OS eth if. */
+ i = GetBmcEthDevice(lan_ch_parm,&lan_ch);
+ if (i == -2) { /* no lan channels found (see lan_ch) */
+ if (lan_ch_parm == PARM_INIT)
+ printf("This system does not support IPMI LAN channels.\n");
+ else /*specified a LAN channel*/
+ printf("BMC channel %d does not support IPMI LAN.\n",lan_ch_parm);
+ ret = LAN_ERR_NOTSUPPORT;
+ goto do_exit;
+ } else if (i < 0) { /* mac not found, use platform defaults */
+ i = 0; /* default to eth0, lan_ch set already. */
+ if (vend_id == VENDOR_INTEL) {
+ if ((prod_id == 0x001B) || (prod_id == 0x000c)) {
+ /* Intel TIGPR2U or TSRLT2 defaults are special */
+ if (lan_ch_parm == 6)
+ { i = 0; lan_ch = 6; }
+ else { i = 1; lan_ch = 7; }
+ ser_ch = 1;
+ }
+ }
+ }
+ if ((i == gcm_ch) && (gcm_ch != PARM_INIT) && (lan_ch_parm == PARM_INIT)) {
+ /* Has a GCM, defaulted to it, and user didn't specify -L */
+ /* Need this to avoid picking channel 3, the IMM/RMM GCM channel. */
+ lan_ch = 1; /*default BMC LAN channel*/
+ // i = 0; /*default eth0 (was eth1) */
+ }
+ if (fsetifn == 0) { /*not user specified, use the detected one*/
+ // if (lan_ch == gcm_ch) strcpy(ifname,"gcm");
+ sprintf(ifname,"%s%d",ifpattn,i); /*eth%d*/
+ }
+ if (fdebug) printf("lan_ch = %d, ifname = %s\n",lan_ch,ifname);
+
+ /* set the lan_user appropriately */
+ if (myuser == NULL) { /* if no -u param */
+ if (ipmi_reserved_user(vend_id, 1)) lan_user = 2;
+ else if (flansecure) lan_user = 2;
+ else lan_user = 1; /*use default null user */
+ } else if (usernum != 0) lan_user = usernum; /*use -q specified usernum*/
+ /* else use default lan_user (=2) if -u and not -q */
+
+ if (ftestonly) { /*test only if BMC LAN is configured or not */
+ /* TODO: test gcm also, if present */
+ ret = GetLanEntry(4, 0, &LanRecord); /*ip addr src*/
+ if (ret == 0) {
+ if ((LanRecord.data[0] == SRC_BIOS) ||
+ (LanRecord.data[0] == SRC_DHCP)) ret = 0; /* DHCP, so ok */
+ else { /*static IP*/
+ ret = GetLanEntry(3, 0, &LanRecord); /* ip address */
+ if (ret == 0) {
+ if (!IpIsValid(LanRecord.data)) {
+ printf("invalid BMC IP address\n");
+ ret = 1; /* invalid ip */
+ } else ret = GetLanEntry(12, 0, &LanRecord); /*gateway ip*/
+ if (ret == 0) {
+ if (!IpIsValid(LanRecord.data)) {
+ printf("invalid gateway ip\n");
+ ret = 2; /*invalid gwy ip*/
+ } else ret = GetLanEntry(13, 0, &LanRecord);
+ if (ret == 0) {
+ if (!MacIsValid(&LanRecord.data[0])) {
+ printf("invalid gateway mac\n");
+ ret = 3; /*invalid gwy mac */
+ }
+ }
+ }
+ }
+ }
+ } /*endif GetLanEntry ok*/
+ if (ret == 0) printf("BMC LAN already configured\n");
+ else printf("BMC LAN not configured\n");
+ goto do_exit;
+ } /*endif ftestonly*/
+
+ memset(SessInfo,0,sizeof(SessInfo));
+ ret = GetSessionInfo(SessInfo,sizeof(SessInfo));
+ // rlen = sizeof(SessInfo)); ret = get_session_info(0,0,SessInfo,&rlen);
+ if (fdebug) printf("GetSessionInfo ret=%d, data: %02x %02x %02x %02x \n",
+ ret,SessInfo[0],SessInfo[1],SessInfo[2],SessInfo[3]);
+ if (!freadonly && fipmilan) { /* setting LAN params, and using IPMI LAN */
+ if (SessInfo[2] > 1) { /* another session is active also */
+ printf("Another session is also active, cannot change IPMI LAN settings now.\n");
+ ret = ERR_NOT_ALLOWED;
+ goto do_exit;
+ }
+ }
+
+ if (!fIPMI10) {
+ if (fcanonical)
+ { /* canonical/simple output */
+ ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
+ if (ret != 0) ndest = 0;
+ else { /*success*/
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j == 0) strcat(mystr,"none ");
+ else {
+ if (j & 0x01) strcat(mystr,"PEFenable ");
+ if (j & 0x02) strcat(mystr,"DoEventMsgs ");
+ if (j & 0x04) strcat(mystr,"Delay ");
+ if (j & 0x08) strcat(mystr,"AlertDelay ");
+ }
+ printf("PEF Control %s%c %s\n",pspace4,bdelim,mystr);
+ }
+ } else { /* normal/full output */
+ ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
+ if (ret == 0 && (LanRecord.data[0] != 0)) {
+ fpefok = 1;
+ bmcpefctl = LanRecord.data[0];
+ } else { /* skip PEF rules/params if disabled */
+ printf("PEF Control %s%c %s\n",pspace4,bdelim,"none ");
+ ndest = 0;
+ fpefok = 0;
+ }
+
+ if (fpefok) {
+ printf("%s, GetPefEntry ...\n",progname);
+ for (idx = 1; idx <= pefmax; idx++)
+ {
+ ret = GetPefEntry( 0x06, (ushort)idx, &PefRecord);
+ if (ret == 0) { // Show the PEF record
+ pc = (uchar *)&PefRecord;
+ sz = 21; // sizeof(PEF_RECORD) = 21
+ if (PefRecord.sensor_type == 0) {
+ if (idx <= pefnum)
+ printf("PEFilter(%02d): empty\n",idx);
+ memcpy(pef_array[idx-1], &PefRecord, sz);
+ if (fAdjustPefNum) pefnum = (char)idx;
+ } else {
+ memcpy(pef_array[idx-1], &PefRecord, sz);
+ if (PefRecord.fconfig & 0x80) pb = "enabled";
+ else pb = "disabled";
+ i = PefRecord.rec_id;
+ switch(PefRecord.action) {
+ case 0x01: pa = "alert"; break;
+ case 0x02: pa = "poweroff"; break;
+ case 0x04: pa = "reset"; break;
+ case 0x08: pa = "powercycle"; break;
+ case 0x10: pa = "OEMaction"; break;
+ case 0x20: pa = "NMI"; break;
+ default: pa = "no action";
+ }
+ printf("PEFilter(%02d): %02x %s event - %s for %s\n",
+ idx, PefRecord.sensor_type,
+ PefDesc(i,PefRecord.sensor_type), pb,pa);
+ }
+ if (fdebug) { /* show raw PEFilter record */
+ pc = &PefRecord.rec_id;
+ printf("raw PEF(%.2d): ",pc[0]);
+ for (i = 0; i < sz; i++) printf("%02x ",pc[i]);
+ printf("\n");
+ }
+ } else {
+ printf("GetPefEntry(%d), ret = %d\n",idx,ret);
+ if (ret == 0xC1) { /*PEF is not supported, so skip the rest. */
+ fpefok = 0;
+ ndest = 0; /* if no PEF, no alerts & no alert dest */
+ break;
+ }
+ }
+ }
+ } /*endif fpefok*/
+ if (fpefok) {
+ if (fdebug) ShowPef();
+ ret = GetPefEntry(0x01, 0,(PEF_RECORD *)&LanRecord);
+ if (ret == 0) {
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j & 0x01) strcat(mystr,"PEFenable ");
+ if (j & 0x02) strcat(mystr,"DoEventMsgs ");
+ if (j & 0x04) strcat(mystr,"Delay ");
+ if (j & 0x08) strcat(mystr,"AlertDelay ");
+ printf("PEF Control: %02x : %s\n",j, mystr);
+ }
+ ret = GetPefEntry(0x02, 0,(PEF_RECORD *)&LanRecord);
+ if (ret == 0) {
+ j = LanRecord.data[0];
+ mystr[0] = 0;
+ if (j & 0x01) strcat(mystr,"Alert ");
+ if (j & 0x02) strcat(mystr,"PwrDn ");
+ if (j & 0x04) strcat(mystr,"Reset ");
+ if (j & 0x08) strcat(mystr,"PwrCyc ");
+ if (j & 0x10) strcat(mystr,"OEM ");
+ if (j & 0x20) strcat(mystr,"DiagInt ");
+ printf("PEF Actions: %02x : %s\n",j, mystr);
+ }
+ ret = GetPefEntry(0x03, 0,(PEF_RECORD *)&LanRecord);
+ if (ret == 0) printf("PEF Startup Delay: %02x : %d sec\n",
+ LanRecord.data[0],LanRecord.data[0]);
+ if (!fmBMC) {
+ ret = GetPefEntry(0x04, 0,(PEF_RECORD *)&LanRecord);
+ if (ret == 0) printf("PEF Alert Startup Delay: %02x: %d sec\n",
+ LanRecord.data[0],LanRecord.data[0]);
+ /* fmBMC gets cc=0x80 here */
+ }
+ /* note that ndest should be read from lan param 17 below. */
+ for (i = 1; i <= ndest; i++)
+ {
+ ret = GetPefEntry(0x09, (ushort)i,(PEF_RECORD *)&LanRecord);
+ if (ret == 0) {
+ mystr[0] = 0;
+ j = LanRecord.data[2];
+ if (LanRecord.data[1] & 0x08) {
+ sprintf(mystr,"Chan[%d] Dest[%d] ",((j & 0xf0) >> 4),(j & 0x0f));
+ strcat(mystr,"Enabled ");
+ } else strcpy(mystr,"Disabled ");
+ printf("PEF Alert Policy[%d]: %02x %02x %02x %02x : %s\n",i,
+ LanRecord.data[0], LanRecord.data[1],
+ LanRecord.data[2], LanRecord.data[3],mystr);
+ }
+ } /*endfor ndest*/
+ } /*endif fpefok*/
+ } /*endif not canonical*/
+
+ if (fpefenable && !freadonly) { /* fenable or fdisable */
+ if (fSetPEFOks) pefadd = 5;
+ else pefadd = 2;
+ sz = (pefnum - 1) + pefadd + fCustomPEF;
+ printf("\n%s, SetPefEntry(1-%d) ...\n",progname,sz);
+ if (fdebug) printf("pefnum = %d, pefmax = %d\n",pefnum,pefmax);
+ for (idx = 1; idx <= pefmax; idx++)
+ {
+ // Set & Enable all PEF records
+ memset(&PefRecord.rec_id,0,sizeof(PEF_RECORD));
+ PefRecord.rec_id = (uchar)idx; /* next record, or user-specified */
+ if (idx < pefnum) { /* pefnum defaults to 12.(0x0c) */
+ if (pef_array[idx-1][7] == 0) /*empty pef record, set to default*/
+ memcpy(&PefRecord.rec_id,pef_defaults[idx-1],sizeof(PEF_RECORD));
+ else { /* set config however it was previously */
+ memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD));
+ if (PefRecord.severity == 0)
+ PefRecord.severity = pef_defaults[idx-1][4];
+ }
+ } else if ((idx == pefnum) && /* new OS Crit Stop entry */
+ (PefRecord.sensor_type == 0)) {
+ // Set PEF values for 0x20, OS Critical Stop event
+ PefRecord.severity = PEF_SEV_CRIT;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x20; /* OS Critical Stop */
+ PefRecord.sensor_no = 0xff;
+ PefRecord.event_trigger = 0x6f;
+ PefRecord.data1 = 0xff;
+ PefRecord.mask1 = 0x00;
+ } else if ((idx == pefnum+1) && /* new Power Redundancy entry */
+ (PefRecord.sensor_type == 0)) {
+ // Set PEF values for 0x09/0x02/0x0b/0x41, Power Redundancy Lost
+ PefRecord.severity = PEF_SEV_WARN;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x09; /* Power Unit */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x0b; /* event trigger */
+ PefRecord.data1 = 0x02; /* 02 -> 41=Redundancy Lost */
+ PefRecord.mask1 = 0x00;
+ } else if (fSetPEFOks && idx == (pefnum+2)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x09; /* Power Unit, Redund OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x0b; /* event trigger */
+ PefRecord.data1 = 0x01; /* 01 -> 40=Redundancy OK */
+ PefRecord.mask1 = 0x00;
+ } else if (fSetPEFOks && idx == (pefnum+3)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x01; /* Temp OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x81; /* event trigger */
+ PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
+ PefRecord.mask1 = 0x0a;
+ } else if (fSetPEFOks && idx == (pefnum+4)) {
+ PefRecord.severity = PEF_SEV_OK;
+ PefRecord.genid1 = 0xff;
+ PefRecord.genid2 = 0xff;
+ PefRecord.sensor_type = 0x02; /* Voltage OK */
+ PefRecord.sensor_no = 0xff; /* usu 01 or 02 */
+ PefRecord.event_trigger = 0x81; /* event trigger */
+ PefRecord.data1 = 0x95; /* 95 -> 50(NC),52(Crit) match */
+ PefRecord.mask1 = 0x0a;
+ } else if (fCustomPEF && idx == (pefnum+pefadd)) {
+ /* user entered 10 or 18 PEF entry bytes */
+ PefRecord.action = custPEF[0];
+ PefRecord.policy = custPEF[1];
+ PefRecord.severity = custPEF[2];
+ PefRecord.genid1 = custPEF[3];
+ PefRecord.genid2 = custPEF[4];
+ PefRecord.sensor_type = custPEF[5];
+ PefRecord.sensor_no = custPEF[6];
+ PefRecord.event_trigger = custPEF[7];
+ PefRecord.data1 = custPEF[8];
+ PefRecord.mask1 = custPEF[9];
+ memcpy(&PefRecord.action,custPEF,18);
+ } else {
+ memcpy(&PefRecord.rec_id,pef_array[idx-1],sizeof(PEF_RECORD));
+ if (PefRecord.sensor_type == 0) continue; /* if reserved, skip it */
+ }
+ if (fdebug && (PefRecord.rec_id != idx)) {
+ /* memcpy from pef_defaults or pef_array clobbered rec_id */
+ printf("Warning: SetPef idx=%d, rec_id=%d\n",idx,PefRecord.rec_id);
+ PefRecord.rec_id = (uchar)idx; /*fix it*/
+ }
+ if (fdisable) {
+ /* Disable all PEF rules */
+ if (idx >= pefnum) PefRecord.fconfig = 0x00; /*disabled, software*/
+ else PefRecord.fconfig = 0x40; /*disabled, preset */
+ PefRecord.action = 0x00;
+ PefRecord.policy = 0x00;
+ } else { /*fenable*/
+ if (PefRecord.sensor_type != 0) { /* not an empty PEF entry */
+ /* Enable all non-empty PEF rules */
+ if (fCustomPEF && (idx == (pefnum+pefadd))) {
+ PefRecord.action = custPEF[0];
+ PefRecord.policy = custPEF[1];
+ } else {
+ PefRecord.action = 0x01; /*Alert*/
+ PefRecord.policy = 0x01; /*see Alert Policy #1*/
+ }
+ if (idx < pefnum) { /* special handling for presets, 1 thru 11 */
+ PefRecord.fconfig = 0x80; /* enabled, software */
+ ret = SetPefEntry(&PefRecord);
+ if (fdebug)
+ printf("SetPefEntry(%d/80) ret=%d\n",PefRecord.rec_id,ret);
+ // if (ret != 0) { nerrs++; lasterr = ret; }
+ // else ngood++;
+ PefRecord.fconfig = 0xC0; /* enabled, preset */
+ } else {
+ PefRecord.fconfig = 0x80; /* enabled, software */
+ }
+ } /*endif not empty*/
+ }
+ { // Show the new PEF record before setting it.
+ pc = (uchar *)&PefRecord;
+ sz = 21;
+ printf("PEFilter(%d): ",PefRecord.rec_id);
+ for (i = 0; i < sz; i++) printf("%02x ",pc[i]);
+ printf("\n");
+ }
+ ret = SetPefEntry(&PefRecord);
+ if (fdebug)
+ printf("SetPefEntry(%d) ret = %d\n", PefRecord.rec_id,ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ } /*end for*/
+ }
+ } /*end if not fIPMI10*/
+
+ if (!fcanonical)
+ printf("\n%s, GetLanEntry for channel %d ...\n",progname,lan_ch);
+ idest = 1;
+ for (idx = 0; idx < NLAN; idx++)
+ {
+ int ival;
+ if (fcanonical && (canon_param[idx] == 0)) continue;
+ if (idx == 8 || idx == 9) continue; /* not implemented */
+ ival = lanparams[idx].cmd;
+ if (ival >= 96 && ival <= 98) continue; /* not implemented */
+ if (ival >= 102 && ival <= 108) { /*custom IPv6 parameters*/
+ if (fipv6 == 0) continue; /*skip these*/
+ }
+ if (ival == 194 && vend_id == VENDOR_KONTRON) { /*oem hostname parm*/
+ lanparams[idx].sz = 36;
+ strcpy(lanparams[idx].desc,"IPMI Hostname");
+ } else if (ival >= 192 && ival <= 194) { /*custom DHCP parameters*/
+ if (vend_id != VENDOR_INTEL) continue;
+ if (fmBMC || fiBMC || fcanonical) continue; /*skip these*/
+ }
+ if (ival >= 20 && ival <= 25) {
+ if (!fIPMI20) continue; /*VLAN params 20-25, fIPMI20 only/opt*/
+ }
+ if ((ndest == 0) && (ival >= 18 && ival <= 19)) continue; /*skip dest*/
+ if (ival == 11) { /*grat arp interval*/
+ if (vend_id == VENDOR_SUPERMICROX) continue;
+ if (vend_id == VENDOR_SUPERMICRO) continue;
+ }
+ if (ival == 14 || ival == 15) { /*secondary gateway is optional*/
+ if (vend_id == VENDOR_KONTRON) continue;
+ }
+ if (ival == 201) { /*Get Channel Access*/
+ ret = ShowChanAcc(lan_ch);
+ } else {
+ if (ival == 18 || ival == 19) { /*dest params*/
+ if (ndest == 0) continue; /*skip if ndest==0 */
+ bset = (uchar)idest; /* dest id = 1 thru n */
+ } else bset = 0;
+ ret = GetLanEntry((uchar)ival, bset, &LanRecord);
+ }
+ if (ret == 0) { // Show the LAN record
+ pc = (uchar *)&LanRecord;
+ sz = lanparams[idx].sz;
+ if (ival == 18) { /*skip if invalid dest type param*/
+ if ((idest > 1) && (pc[2] == 0)) { idest = 1; continue; }
+ } else if (ival == 19) { /*skip if invalid dest addr param*/
+ if ((idest > 1) && !IpIsValid(&pc[3])) { idest = 1; continue; }
+ }
+ if (ival == 201) ; /* did it above */
+ else {
+ if (fcanonical) {
+ if ((ival == 19) && (idest > 1)) ; /*skip it*/
+ else {
+ j = strlen_(lanparams[idx].desc);
+ // (ival < 7) || (ival == 19) || ival == 102)
+ if (j <= 12) pstr = pspace3;
+ else pstr = pspace2;
+ printf("Channel %d %s %s%c ",lan_ch,
+ lanparams[idx].desc,pstr,bdelim);
+ }
+ } else
+ printf("Lan Param(%d) %s: ",ival,lanparams[idx].desc);
+ }
+ if (ival == 1) {
+ authmask = pc[0]; /* auth type support mask */
+ /* if (fmBMC) authmask is usually 0x15, else 0x14 */
+ } else if (ival == 3) {
+ if (IpIsValid(pc)) memcpy(bmcmyip,pc,4);
+ } else if (ival == 5) {
+ if (MacIsValid(pc)) memcpy(bmcmymac,pc,MAC_LEN);
+ } else if (ival == 6) {
+ if (SubnetIsValid(pc)) memcpy(bmcsubnet,pc,4);
+ /* else if invalid, leave default as 255.255.255.0 */
+ //} else if (ival == 7) {
+ // if (pc[0] >= 30) memcpy(bparm7,pc,3);
+ } else if (ival == 17) { /* num dest */
+ ndest = pc[0]; /* save the number of destinations */
+ } else if (ival == 12) { /* gateway addr */
+ if (IpIsValid(pc)) memcpy(bmcgwyip,pc,4);
+ } else if (ival == 13) { /* gateway mac */
+ if (MacIsValid(pc)) memcpy(bmcgwymac,pc,MAC_LEN);
+ } else if (ival == 19) { /* dest addr */
+ if (IpIsValid(&pc[3])) memcpy(bmcdestip,&pc[3],4);
+ if (MacIsValid(&pc[7])) memcpy(bmcdestmac,&pc[7],MAC_LEN);
+ } else if (ival == 22) { /*Cipher Suite Support*/
+ nciphers = pc[0];
+ }
+ /* now start to display data */
+ if (ival == 16) { printf("%s \n",pc); /* string */
+ } else if (ival == 194 && vend_id == VENDOR_KONTRON) {
+ printf("%s \n",pc); /* string */
+ } else if (ival == 201) { ; /* did it above */
+ } else { /* print results for all other ival's */
+ pstr = ""; /*interpreted meaning*/
+ if (fcanonical) {
+ switch(ival) {
+ case 4: /*param 4, ip src*/
+ if (pc[0] == SRC_STATIC) pstr = "Static"; /*0x01*/
+ else if (pc[0] == SRC_DHCP) pstr = "DHCP"; /*0x02*/
+ else if (pc[0] == SRC_BIOS) pstr = "BIOS"; /*0x03*/
+ else pstr = "Other";
+ printf("%s\n",pstr);
+ break;
+ case 5: /*param 5, mac addr*/
+ case 13: /*param 6, def gwy mac*/
+ printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pc[0], pc[1], pc[2], pc[3], pc[4], pc[5]);
+ break;
+ case 3: /*param 4, ip address*/
+ case 6: /*param 6, subnet mask*/
+ case 12: /*param 12, def gwy ip*/
+ case 14: /*param 14, sec gwy ip*/
+ case 192: /*param 192, DHCP svr ip*/
+ printf("%d.%d.%d.%d\n",pc[0], pc[1], pc[2], pc[3]);
+ break;
+ case 19: /*param 19, dest address*/
+ if (idest == 1) {
+ printf("IP=%d.%d.%d.%d "
+ "MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ pc[3], pc[4], pc[5], pc[6],
+ pc[7], pc[8], pc[9], pc[10], pc[11], pc[12]);
+ }
+ break;
+ case 102: /*param 102, IPv6 enable*/
+ if (pc[0] == 0x01) printf("enabled\n");
+ else printf("disabled\n");
+ break;
+ default:
+ printf("%02x \n",pc[0]);
+ break;
+ }
+ } else { /*not canonical */
+ if (ival == 3 || ival == 6 || ival == 12 || ival == 14
+ || ival == 192) {
+ printf("%d.%d.%d.%d",pc[0], pc[1], pc[2], pc[3]);
+ } else if (ival == 23) { /*Cipher Suites*/
+ for (i = 1; i <= nciphers; i++) {
+ if (pc[i] == 0) ncipher0 = pc[i];
+ printf("%2d ",pc[i]);
+ }
+ } else if (ival == 24) { /*Cipher Suite Privi Levels*/
+ j = 0;
+ for (i = 1; i < 9; i++) {
+ char c1, c2;
+ char *p;
+ p = parse_priv((pc[i] & 0x0f));
+ c1 = p[0];
+ p = parse_priv((pc[i] & 0xf0) >> 4);
+ c2 = p[0];
+ rgciphers[j++] = (pc[i] & 0x0f);
+ rgciphers[j++] = ((pc[i] & 0xf0) >> 4);
+ if ((i*2) >= nciphers) c2 = ' ';
+ printf(" %c %c ",c1,c2);
+ if ((i*2) > nciphers) break;
+ }
+} else
+ for (i = 0; i < sz; i++)
+{
+ /* print in hex, decimal, or string, based on ival */
+ if (ival == 1) { /* Auth type support */
+ pstr = &mystr[0];
+ getauthstr(authmask,pstr);
+ printf("%02x ",authmask);
+ } else if (ival == 4) { /* IP addr source */
+ if (pc[i] == SRC_STATIC) pstr = "Static"; /*0x01*/
+ else if (pc[i] == SRC_DHCP) pstr = "DHCP"; /*0x02*/
+ else if (pc[i] == SRC_BIOS) pstr = "BIOS"; /*0x03*/
+ else pstr = "Other";
+ printf("%02x ",pc[i]);
+ } else if (ival == 10) { /* grat ARP */
+ mystr[0] = 0;
+ if (pc[i] == 0) strcat(mystr,"ARP disabled ");
+ else if (pc[i] & 0x01) strcat(mystr,"Grat-ARP enabled");
+ else strcat(mystr,"Grat-ARP disabled");
+ if (pc[i] & 0x02) strcat(mystr,", ARP-resp enabled");
+ pstr = &mystr[0];
+ printf("%02x ",pc[i]);
+ } else if (ival == 11) { /* grat ARP interval */
+ float f;
+ f = (float)pc[i] / (float)2; /*500msec increments*/
+ sprintf(mystr,"%.1f sec",f);
+ pstr = &mystr[0];
+ printf("%02x ",pc[i]);
+ } else if (ival == 19) { /* dest addr */
+ if (i > 2 && i < 7) {
+ char *sepstr;
+ if (i == 3) printf("[");
+ if (i == 6) sepstr = "] ";
+ else if (i >=3 && i < 6) sepstr = ".";
+ else sepstr = " ";
+ printf("%d%s",pc[i],sepstr); /* IP address in dec */
+ }
+ else printf("%02x ",pc[i]); /* show mac/etc. in hex */
+ }
+ else printf("%02x ",pc[i]); /* show in hex */
+ } /*end for*/
+if (ival == 2) { /*Auth type enables*/
+ pstr = &mystr[0];
+ i = 0;
+ if (lan_ch > 0) i = lan_ch - 1;
+ getauthstr(pc[i],pstr);
+}
+ if (pstr[0] != 0) printf(": %s\n",pstr);
+ else printf("\n");
+ } /*end-else not canonical*/
+ } /*end-else others*/
+ if (ival == 18 || ival == 19) {
+if (idest < ndest) {
+ idest++;
+ idx--; /* repeat this param*/
+} else idest = 1;
+ }
+ } else { /* ret != 0 */
+ if (ival >= 20 && ival <= 25) { /*if errors, optional*/
+ if (fdebug) printf("GetLanEntry(%d), ret = %d\n",ival,ret);
+ } else
+ printf("GetLanEntry(%d), ret = %d\n",ival,ret);
+ if (ival == 17) ndest = 0; /*error getting num dest*/
+ }
+ } /*end for*/
+ if (fRomley || fGrantley) { /*get LAN Failover param*/
+ uchar b;
+ ret = lan_failover_intel(0xFF,(uchar *)&b);
+ if (ret != 0)
+ printf("Intel Lan Failover, ret = %d\n",ret);
+ else {
+ if (b == 1) pstr = "enabled";
+ else pstr = "disabled";
+ if (fcanonical)
+ printf("Intel Lan Failover %s%c %s\n",
+ pspace3, bdelim,pstr);
+ else printf("Intel Lan Failover %s%c %02x %c %s\n",
+ pspace2, bdelim,b,bdelim,pstr);
+ }
+ }
+ if (vend_id == VENDOR_SUPERMICROX || vend_id == VENDOR_SUPERMICRO) {
+ ret = oem_supermicro_get_lan_port(&bset);
+ if (ret == 0) {
+ pstr = oem_supermicro_lan_port_string(bset);
+ if (fcanonical)
+ printf("SuperMicro Lan Interface %s%c %s\n",
+ pspace2, bdelim,pstr);
+ else printf("SuperMicro Lan Interface %c %02x %c %s\n",
+ bdelim,bset,bdelim,pstr);
+ } else {
+ if (fdebug) printf("oem_supermicro_get_lan_port error %d\n",ret);
+ ret = 0; /*may not be supported on all smc plaforms*/
+ }
+ }
+ // if (fmBMC) lan_access = 0x04; /*Admin*/
+ // else lan_access = 0x04; /*Admin*/
+ if (!fIPMI10) { /* Get SOL params */
+ ret = GetSerialOverLan(lan_ch,0,0);
+ if (ret != 0) printf("GetSOL error %d\n",ret);
+ }
+ for (i = 1; i <= show_users; i++)
+ GetUser((uchar)i,lan_ch);
+
+ if (fgetser && !fcanonical) {
+ printf("\n%s, GetSerEntry ...\n",progname);
+ if (fmBMC) /* mBMC doesn't support serial */
+ printf("No serial channel support on this platform\n");
+ else
+ for (idx = 0; idx < NSER; idx++) {
+ int ival;
+ // if (idx == 9) continue; /* not implemented */
+ ival = serparams[idx].cmd;
+ if (ival == 201) {
+ ret = GetChanAcc(ser_ch, 0x40, &LanRecord);
+ } else {
+ ret = GetSerEntry((uchar)ival, &LanRecord);
+ }
+ if (ret == 0) { // Show the SER record
+ pc = (uchar *)&LanRecord;
+ sz = serparams[idx].sz;
+ printf("Serial Param(%d) %s: ",ival,serparams[idx].desc);
+ if (idx == 10) { /* modem init string */
+ pc[sz] = 0;
+ printf("%02x %s\n",pc[0],&pc[1]);
+ }
+ else if ((idx >= 11 && idx <= 13) || idx == 15) { /* strings */
+ printf("%s\n",pc);
+ }
+ else {
+ for (i = 0; i < sz; i++) {
+printf("%02x ",pc[i]); /* show in hex */
+}
+ printf("\n");
+ } /*end else*/
+ }
+ } /*end for*/
+ } /*endif fgetser*/
+
+ if (!freadonly) /* Set IPMI LAN enable/disable params. */
+ {
+ if (fipmilan) /* Sets not valid via ipmi_lan if same channel. */
+ printf("\nWarning: Setting LAN %d params while using a LAN channel.\n", lan_ch);
+
+ {
+ if (fenable && (fsharedMAC==0) && !lan_dhcp) {
+ /* must have an IP from -I option */
+ if (!IpIsValid(rgmyip)) { /* if not user-specified */
+ if (IpIsValid(bmcmyip)) {
+ memcpy(rgmyip,bmcmyip,4);
+ if (fdebug) printf("Using current IP %d.%d.%d.%d\n",
+ bmcmyip[0], bmcmyip[1],
+ bmcmyip[2], bmcmyip[3]);
+ } else {
+ printf("\nNot shared BMC LAN, must specify a unique "
+ "IP address via -I\n");
+ ret = ERR_BAD_PARAM;
+ goto do_exit;
+ }
+ }
+ }
+ /* Set LAN parameters. fenable or fdisable */
+ printf("\n%s, SetLanEntry for channel %d ...\n",progname,lan_ch);
+ /* use ifname to resolve MAC addresses below */
+ if (fdisable) {
+ if (!fIPMI10) {
+ ret = DisablePef(alertnum);
+ printf("DisablePef, ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+else ngood++;
+ }
+ if (lan_user != 0) {
+ j = DisableUser(lan_user,lan_ch); /*disable this lan user*/
+ printf("DisableUser(%d), ret = %d\n",lan_user,j);
+ if (j != 0) { nerrs++; lasterr = j; }
+ else ngood++;
+ }
+ LanRecord.data[0] = 0x01; /* static IP address source */
+ ret = SetLanEntry(4, &LanRecord, 1);
+ printf("SetLanEntry(4), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ /* clear the BMC IP address */
+ memset(&LanRecord,0,4);
+ ret = SetLanEntry(3, &LanRecord, 4);
+ printf("SetLanEntry(3), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ /* clear the gateway IP address */
+ memset(&LanRecord,0,4);
+ ret = SetLanEntry(12, &LanRecord, 4);
+ printf("SetLanEntry(12), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ /* clear the gateway MAC address */
+ memset(&LanRecord,0,6);
+ ret = SetLanEntry(13, &LanRecord, 6);
+ printf("SetLanEntry(13), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ } else if (fdisableSOL) {
+ ret = SetupSerialOverLan(0); /*disable*/
+ SELprintf("SetupSerialOverLan: ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ } else { /*fenable*/
+ uchar chanctl;
+ if (bmcpefctl != 0) chanctl = chan_pefon; /*previously on*/
+ else chanctl = chan_pefoff;
+ ret = SetChanAcc(lan_ch, 0x80, chanctl);
+ if (fdebug) printf("SetChanAcc(lan/active), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ ret = SetChanAcc(lan_ch, 0x40, chanctl);
+ if (fdebug) printf("SetChanAcc(lan/nonvol), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (flansecure) {
+ j = DisableUser(0,lan_ch); /*disable the default null user*/
+ printf("DisableUser(0), ret = %d\n",j);
+ }
+ ret = SetUser(lan_user,myuser,passwordData,lan_ch);
+ printf("SetUser(%d), ret = %d\n",lan_user,ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ if (fdisable && (vend_id == VENDOR_SUPERMICROX
+ || vend_id == VENDOR_SUPERMICRO) ) {
+ failover_enable = 0; /*dedicated*/
+ ret = oem_supermicro_set_lan_port(failover_enable);
+ printf("Set SuperMicro Lan port to %s, ret = %d\n",
+ oem_supermicro_lan_port_string(failover_enable),ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ }
+
+ if (fdisable || fdisableSOL) {
+// if (nerrs > 0) printf("Warning: %d errors occurred\n",nerrs);
+ goto do_exit;
+ }
+
+ if (authmask == 0) authmask = 0x17; /*if none from GetLanEntry(1)*/
+ LanRecord.data[0] = (bAuth & authmask); /*Callback level*/
+ LanRecord.data[1] = (bAuth & authmask); /*User level */
+ LanRecord.data[2] = (bAuth & authmask); /*Operator level*/
+ LanRecord.data[3] = (bAuth & authmask); /*Admin level */
+ LanRecord.data[4] = 0; /*OEM level*/
+ if (fdebug) printf("SetLanEntry(2): %02x %02x %02x %02x %02x\n",
+ LanRecord.data[0],LanRecord.data[1],LanRecord.data[2],
+ LanRecord.data[3],LanRecord.data[4]);
+ ret = SetLanEntry(2, &LanRecord, 5);
+ printf("SetLanEntry(2), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+
+ /* Get the values to use from Linux eth0, etc. */
+ ret = Get_IPMac_Addr();
+ if (lan_dhcp) { /* use DHCP */
+ LanRecord.data[0] = SRC_DHCP; /* BMC running DHCP */
+ /* = SRC_BIOS; * address source = BIOS using DHCP */
+ ret = SetLanEntry(4, &LanRecord, 1);
+ printf("SetLanEntry(4), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (MacIsValid(rgmymac)) {
+ memcpy(&LanRecord,rgmymac,6);
+ ret = SetLanEntry(5, &LanRecord, 6);
+ if (ret == 0x82) { /*BMC may not allow the MAC to be set*/
+ if (fdebug)
+ printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret);
+ } else {
+ printf("SetLanEntry(5), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ }
+
+ /* DHCP also relates to OEM LAN params 192, 193, 194 */
+ if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC)
+ { /*DHCP params 192-194 are Intel only*/
+ if (IpIsValid(rgmyip))
+ {
+ /* Set DHCP Server IP in param 192 from -I param. */
+ memcpy(&LanRecord,rgmyip,4);
+ ret = SetLanEntry(192, &LanRecord, 4);
+ printf("SetLanEntry(192), ret = %d\n",ret);
+ if (!MacIsValid(rgdhcpmac)) /* if MAC not set yet */
+ ret = Get_Mac(rgmyip,rgdhcpmac,NULL);
+ if (ret == 0) {
+ memcpy(&LanRecord,rgdhcpmac,MAC_LEN);
+ ret = SetLanEntry(193, &LanRecord, MAC_LEN);
+ printf("SetLanEntry(193), ret = %d\n",ret);
+ }
+ }
+ LanRecord.data[0] = 0x01; /*enable DHCP*/
+ ret = SetLanEntry(194, &LanRecord, 1);
+ printf("SetLanEntry(194), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ } else { /* use static IP */
+ printf("LAN%d (%s)\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+lan_ch,ifname, rgmyip[0], rgmyip[1], rgmyip[2], rgmyip[3],
+rgmymac[0], rgmymac[1], rgmymac[2], rgmymac[3],
+rgmymac[4], rgmymac[5]);
+ if (IpIsValid(rgmyip)) {
+ if (lan_ch != gcm_ch) { /*skip if gcm*/
+ LanRecord.data[0] = 0x00; /*disable grat arp while setting IP*/
+ ret = SetLanEntry(10, &LanRecord, 1);
+ if (fdebug) printf("SetLanEntry(10,0), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ }
+ LanRecord.data[0] = 0x01; /* static IP address source */
+ ret = SetLanEntry(4, &LanRecord, 1);
+ printf("SetLanEntry(4), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ memcpy(&LanRecord,rgmyip,4);
+ ret = SetLanEntry(3, &LanRecord, 4);
+ printf("SetLanEntry(3), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (MacIsValid(rgmymac)) {
+ memcpy(&LanRecord,rgmymac,6);
+ ret = SetLanEntry(5, &LanRecord, 6);
+ if (ret == 0x82) {
+
+ /* Do not show anything, not an error if BMC does not
+ allow the BMC MAC to be changed. */
+ if (fdebug)
+
+ printf("SetLanEntry(5), ret = %x cannot modify MAC\n",ret);
+ } else {
+
+ printf("SetLanEntry(5), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ }
+ if (!SubnetIsValid(rgsubnet)) /* not specified, use previous */
+ memcpy(rgsubnet,bmcsubnet,4);
+ memcpy(&LanRecord,rgsubnet,4);
+ ret = SetLanEntry(6, &LanRecord, 4);
+ printf("SetLanEntry(6), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (vend_id != VENDOR_PEPPERCON) {
+ /* may want to check bparm7 here */
+ LanRecord.data[0] = parm7[0]; /*IPv4 header, TTL */
+ LanRecord.data[1] = parm7[1]; /*IPv4 header, Flags */
+ LanRecord.data[2] = parm7[2]; /*IPv4 hdr, Precedence/Service */
+ ret = SetLanEntry(7, &LanRecord, 3);
+ printf("SetLanEntry(7), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ /* if lan_ch == 3, gcm gets error setting grat arp (ccode=0xCD) */
+ if (lan_ch != gcm_ch) { /*skip if gcm*/
+ /* 01=enable grat arp, 02=enable arp resp, 03=both */
+ LanRecord.data[0] = arp_ctl; /*grat arp*/
+ ret = SetLanEntry(10, &LanRecord, 1);
+ printf("SetLanEntry(10,%x), ret = %d\n",arp_ctl,ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ LanRecord.data[0] = arp_interval; /*grat arp interval*/
+ ret = SetLanEntry(11, &LanRecord, 1);
+ printf("SetLanEntry(11), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ if ((vend_id == VENDOR_INTEL) && !fmBMC && !fiBMC) {
+ LanRecord.data[0] = 0x00; /*disable DHCP*/
+ ret = SetLanEntry(194, &LanRecord, 1);
+ printf("SetLanEntry(194), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ } else { /* error, don't continue */
+ printf("Missing IP Address, can't continue. Use -I to specify\n");
+ ret = ERR_BAD_PARAM;
+ goto do_exit;
+ }
+ if (vend_id == VENDOR_KONTRON && rghostname[0] != 0) {
+ /* set the IPMI Hostname if specified */
+ sz = strlen_(rghostname);
+ /* LanRecord is larger than rghostname, bounds ok */
+ strncpy((char *)&LanRecord.data,rghostname,sz);
+ ret = SetLanEntry(194, &LanRecord, sz);
+ printf("SetLanEntry(194), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else {
+ LanRecord.data[0] = 0x31;
+ ret = SetLanEntry(195, &LanRecord, 1); /*re-read hostname*/
+ // printf("SetLanEntry(195), ret = %d\n",ret);
+ // if (ret != 0) { nerrs++; lasterr = ret; }
+ }
+ }
+ if (IpIsValid(rggwyip)) {
+ if (!MacIsValid(rggwymac)) /* if gwy MAC not set by user */
+ ret = Get_Mac(rggwyip,rggwymac,NULL);
+ printf("gateway \tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ rggwyip[0], rggwyip[1], rggwyip[2], rggwyip[3],
+ rggwymac[0], rggwymac[1], rggwymac[2], rggwymac[3],
+ rggwymac[4], rggwymac[5]);
+ if (!SubnetIsSame(rgmyip,rggwyip,rgsubnet)) {
+ printf("WARNING: IP Address and Gateway are not on the same subnet,"
+" setting Gateway to previous value\n");
+ memcpy(rggwyip,bmcgwyip,4);
+ memcpy(rggwymac,bmcgwymac,6);
+ }
+
+ /* Set the Default Gateway IP & MAC */
+ memcpy(&LanRecord,rggwyip,4);
+ ret = SetLanEntry(12, &LanRecord, 4);
+ printf("SetLanEntry(12), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (!MacIsValid(rggwymac)) { /* if gwy MAC not resolved */
+ printf(" Warning: Gateway MAC address was not resolved! "
+ "Check %s interface, use -i ethN, or use -H gwymac.\n",
+ ifname);
+ memcpy(&LanRecord,bmcgwymac,6);
+ } else {
+ memcpy(&LanRecord,rggwymac,6);
+ }
+ ret = SetLanEntry(13, &LanRecord, 6);
+ printf("SetLanEntry(13), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ if (IpIsValid(rggwy2ip)) {
+ if (!MacIsValid(rggwy2mac)) /* if gwy2 MAC not set by user */
+ ret = Get_Mac(rggwy2ip,rggwy2mac,NULL);
+ /* Set the Secondary Gateway IP & MAC */
+ memcpy(&LanRecord,rggwy2ip,4);
+ ret = SetLanEntry(14, &LanRecord, 4);
+ printf("SetLanEntry(14), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ memcpy(&LanRecord,rggwy2mac,6);
+ ret = SetLanEntry(15, &LanRecord, 6);
+ printf("SetLanEntry(15), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ } /* end-else static IP */
+ if (flansecure) { /* disable cipher 0 */
+ char c1, c2;
+ memset(&LanRecord,0,12);
+ j = 1;
+ for (i = 0; i < nciphers; i+=2) {
+ c1 = rgciphers[i];
+ c2 = rgciphers[i+1];
+ /* 0x0f may be vendor-specific, 0x00 = Reserved/Unused */
+ if (i == ncipher0) c1 = 0x00;
+ if ((i+1) == ncipher0) c2 = 0x00;
+ LanRecord.data[j++] = (c2 << 4) | c1;
+ }
+ ret = SetLanEntry(24, &LanRecord, 9);
+ printf("SetLanEntry(24) disable cipher0, ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ ret = SetupSerialOverLan(1); /*enable*/
+ SELprintf("SetupSerialOverLan: ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ if (!IpIsValid(rgdestip) && IpIsValid(bmcdestip)) {
+ memcpy(rgdestip,bmcdestip,4);
+ if (fdebug) printf("Using current dest IP %d.%d.%d.%d\n",
+ bmcdestip[0], bmcdestip[1],
+ bmcdestip[2], bmcdestip[3]);
+ }
+ if (ndest == 0) {
+ if (fdebug) printf("ndest==0, anum=%d rgdestip=%d.%d.%d.%d\n",
+ alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3]);
+ printf("alert dest \tnot supported\n");
+ } else if (!IpIsValid(rgdestip)) {
+ printf("alert dest \taddress not specified\n");
+ } else { /* valid alert dest ip */
+ if (!MacIsValid(rgdestmac)) /* if dest MAC not set by user */
+ ret = Get_Mac(rgdestip,rgdestmac,NULL); /*try to resolve MAC */
+ if (!MacIsValid(rgdestmac)) { /* if dest MAC not resolved */
+ printf(" Warning: Alert mac address was not resolved!"
+ " Check %s interface or use -i.\n",ifname);
+ /* use existing BMC alert dest mac (as best guess) */
+ memcpy(rgdestmac,bmcdestmac,6);
+ }
+ /* show destination data */
+ printf("alert dest %d\tip=%d.%d.%d.%d mac=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ alertnum, rgdestip[0], rgdestip[1], rgdestip[2], rgdestip[3],
+ rgdestmac[0], rgdestmac[1], rgdestmac[2], rgdestmac[3],
+ rgdestmac[4], rgdestmac[5]);
+ printf("snmp community \t%s\n",rgcommunity);
+ /* Only need the SNMP community if there is an Alert Destination */
+ memset(&LanRecord.data[0], 0, 18); /* make sure zero-filled */
+ strcpy((char *)&LanRecord.data[0],rgcommunity);
+ ret = SetLanEntry(16, &LanRecord, 18);
+ printf("SetLanEntry(16), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ /* Set Alert Destination Type */
+ LanRecord.data[0] = alertnum; /* dest id = 1 */
+ LanRecord.data[1] = 0x00; /* dest type = PET, no ack */
+ LanRecord.data[2] = 0x01; /* ack timeout / retry interval */
+ LanRecord.data[3] = 0x00; /* no retries */
+ // LanRecord.data[4] = 0x69;
+ ret = SetLanEntry(18, &LanRecord, 4);
+ printf("SetLanEntry(18), ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ {
+ /* Set the Alert Destination IP & MAC (param 19) */
+ LanRecord.data[0] = alertnum; /* dest id = 1 */
+ LanRecord.data[1] = 0x00;
+ LanRecord.data[2] = 0x00;
+ memcpy(&LanRecord.data[3],rgdestip,4);
+ memcpy(&LanRecord.data[7],rgdestmac,6);
+ ret = SetLanEntry(19, &LanRecord, 13);
+ printf("SetLanEntry(19), ret = %d\n", ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ } /*endif valid alert*/
+
+ /* Now enable PEF since we have an Alert destination. */
+ if (!fdisable && !fIPMI10 && fpefenable) { /*fpefenable*/
+ ret = EnablePef(alertnum);
+ printf("EnablePef, ret = %d\n",ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ /* ChanAcc changed, so show it again */
+ j = ShowChanAcc(lan_ch);
+ }
+
+ if ((vlan_enable != PARM_INIT) && (fIPMI20)) {
+ if (vlan_enable == 0) { /*disable vlan*/
+ LanRecord.data[0] = 0x00;
+ LanRecord.data[1] = 0x00;
+ ret = SetLanEntry(20, &LanRecord, 2);
+ printf("SetLanEntry(20,disable) ret = %d\n", ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ } else { /*vlan_enable == 1, enable vlan with id */
+ LanRecord.data[0] = (vlan_id & 0x00ff);
+ LanRecord.data[1] = ((vlan_id & 0x0f00) >> 8) | 0x80;
+ ret = SetLanEntry(20, &LanRecord, 2);
+ printf("SetLanEntry(20,%d), ret = %d\n", vlan_id,ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ LanRecord.data[0] = vlan_prio;
+ ret = SetLanEntry(21, &LanRecord, 1);
+ printf("SetLanEntry(21), ret = %d\n", ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ else ngood++;
+ }
+ }
+ if (failover_enable != PARM_INIT) {
+ if (fRomley || fGrantley) {
+ if (failover_enable > 1) failover_enable = 0; /*default*/
+ ret = lan_failover_intel(failover_enable,(uchar *)&i);
+ printf("Set Intel Lan Failover (%d), ret = %d\n",
+ failover_enable,ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ } else if (vend_id == VENDOR_SUPERMICROX
+ || vend_id == VENDOR_SUPERMICRO) {
+ if (failover_enable > 2) failover_enable = 2; /*default*/
+ ret = oem_supermicro_set_lan_port(failover_enable);
+ printf("Set SuperMicro Lan port to %s, ret = %d\n",
+ oem_supermicro_lan_port_string(failover_enable),ret);
+ if (ret != 0) { nerrs++; lasterr = ret; }
+ }
+ } /*endif failover specified*/
+ } /*end-else not via ipmi_lan*/
+ } /*endif not readonly*/
+
+ if (flanstats)
+ { /* get BMC LAN Statistics */
+#ifdef METACOMMAND
+ j = get_lan_stats(lan_ch);
+#else
+ uchar idata[2];
+ uchar rdata[20];
+ int rlen;
+ uchar cc;
+ idata[0] = lan_ch;
+ idata[1] = 0x00; /*do not clear stats*/
+ rlen = sizeof(rdata);
+ j = ipmi_cmd(GET_LAN_STATS, idata,2, rdata,&rlen, &cc, fdebug);
+ if (j == 0) { /*show BMC LAN stats*/
+ ushort *rw;
+ rw = (ushort *)&rdata[0];
+ printf("IPMI LAN channel %d statistics: \n",lan_ch);
+ printf(" \tReceived IP Packets = %d\n",rw[0]);
+ printf(" \tRecvd IP Header errors = %d\n",rw[1]);
+ printf(" \tRecvd IP Address errors = %d\n",rw[2]);
+ printf(" \tRecvd IP Fragments = %d\n",rw[3]);
+ printf(" \tTransmitted IP Packets = %d\n",rw[4]);
+ printf(" \tReceived UDP Packets = %d\n",rw[5]);
+ printf(" \tReceived Valid RMCP Pkts = %d\n",rw[6]);
+ printf(" \tReceived UDP Proxy Pkts = %d\n",rw[7]);
+ printf(" \tDropped UDP Proxy Pkts = %d\n",rw[8]);
+ }
+#endif
+ }
+
+do_exit:
+ ipmi_close_();
+ if (foptmsg) {
+ if (fset_ip != 0)
+ printf("WARNING: IP address options were specified, but no -e,-l,-d option.\n");
+ else
+ printf("WARNING: %d options were specified, but no -e,-l,-d option.\n",
+nopts);
+ printf("Read-only usage assumed.\n");
+ }
+ if (nerrs > 0) {
+ printf("Warning: %d ok, %d errors occurred, last error = %d\n",ngood,nerrs,lasterr);
+ ret = lasterr;
+ }
+ // show_outcome(progname,ret);
+ return(ret);
+} /* end main()*/
+
+/* end ilan.c */
diff --git a/util/ipicmg.c b/util/ipicmg.c
index b0f1a03..8019a3f 100644
--- a/util/ipicmg.c
+++ b/util/ipicmg.c
@@ -81,7 +81,7 @@
/* Global data */
static char * progname = "ipicmg";
-static char * progver = "3.02";
+static char * progver = "3.03";
static char fdebug = 0;
static char fset_mc = 0;
static uint8_t g_bus = PUBLIC_BUS;
diff --git a/util/ipmiutil.c b/util/ipmiutil.c
index 5fec907..26b156a 100644
--- a/util/ipmiutil.c
+++ b/util/ipmiutil.c
@@ -57,11 +57,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "ipmiutil.h"
static char *progname = "ipmiutil";
-static char *progver = "3.02";
+static char *progver = "3.03";
// static char fdebug = 0;
/*int ipmiutil(int argc, char **argv); */
-#define NSUBCMDS 28
+#define NSUBCMDS 29
static struct {
int idx;
char tag[16];
@@ -95,6 +95,7 @@ static struct {
{ 22, "sunoem", i_sunoem, "Sun OEM functions" },
{ 23, "delloem",i_delloem, "Dell OEM functions" },
{ 24, "tsol", i_tsol, "Tyan SOL console start/stop session" },
+ { 28, "user", i_user, "list or modify IPMI LAN users" },
{ 27, "wdt", i_wdt, "show/set/reset the watchdog timer" }
};
diff --git a/util/ipmiutil.h b/util/ipmiutil.h
index 39b5ecb..025727c 100644
--- a/util/ipmiutil.h
+++ b/util/ipmiutil.h
@@ -62,5 +62,6 @@ int i_ekanalyzer(int argc, char **argv);
int i_tsol(int argc, char **argv);
int i_dcmi(int argc, char **argv);
int i_smcoem(int argc, char **argv);
+int i_user(int argc, char **argv);
#endif // IPMIUTIL_H_
diff --git a/util/ipmiutil.mak b/util/ipmiutil.mak
index c3963a0..7595067 100644
--- a/util/ipmiutil.mak
+++ b/util/ipmiutil.mak
@@ -86,7 +86,7 @@ E_OBJ=$(TMP_D)\ipmiutil.obj \
$(TMP_D)\iekanalyzer.obj $(TMP_D)\ifru_picmg.obj \
$(TMP_D)\oem_kontron.obj $(TMP_D)\ihpm.obj $(TMP_D)\ifwum.obj \
$(TMP_D)\oem_fujitsu.obj $(TMP_D)\oem_intel.obj $(TMP_D)\oem_lenovo.obj \
- $(TMP_D)\oem_asus.obj \
+ $(TMP_D)\oem_asus.obj $(TMP_D)\iuser.obj \
$(TMP_D)\oem_sun.obj $(TMP_D)\oem_dell.obj $(TMP_D)\oem_hp.obj \
$(TMP_D)\oem_supermicro.obj $(TMP_D)\itsol.obj $(TMP_D)\idcmi.obj \
$(TMP_D)\oem_quanta.obj $(TMP_D)\oem_newisys.obj $(CMD_OBJ) mem_if.obj
@@ -310,6 +310,9 @@ $(TMP_D)\ihpm.obj: ihpm.c
$(TMP_D)\idcmi.obj: idcmi.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\idcmi.obj idcmi.c
+$(TMP_D)\iuser.obj: iuser.c
+ $(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\iuser.obj iuser.c
+
$(TMP_D)\oem_fujitsu.obj: oem_fujitsu.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\oem_fujitsu.obj oem_fujitsu.c
diff --git a/util/ipmiutil64.mak b/util/ipmiutil64.mak
index 6c8825e..cfd1719 100644
--- a/util/ipmiutil64.mak
+++ b/util/ipmiutil64.mak
@@ -86,7 +86,7 @@ E_OBJ=$(TMP_D)\ipmiutil.obj \
$(TMP_D)\iekanalyzer.obj $(TMP_D)\ifru_picmg.obj \
$(TMP_D)\oem_kontron.obj $(TMP_D)\ihpm.obj $(TMP_D)\ifwum.obj \
$(TMP_D)\oem_fujitsu.obj $(TMP_D)\oem_intel.obj $(TMP_D)\oem_lenovo.obj \
- $(TMP_D)\oem_asus.obj \
+ $(TMP_D)\oem_asus.obj $(TMP_D)\iuser.obj \
$(TMP_D)\oem_sun.obj $(TMP_D)\oem_dell.obj $(TMP_D)\oem_hp.obj \
$(TMP_D)\oem_supermicro.obj $(TMP_D)\itsol.obj $(TMP_D)\idcmi.obj \
$(TMP_D)\oem_quanta.obj $(TMP_D)\oem_newisys.obj $(CMD_OBJ) mem_if.obj
@@ -310,6 +310,9 @@ $(TMP_D)\ihpm.obj: ihpm.c
$(TMP_D)\idcmi.obj: idcmi.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\idcmi.obj idcmi.c
+$(TMP_D)\iuser.obj: iuser.c
+ $(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\iuser.obj iuser.c
+
$(TMP_D)\oem_fujitsu.obj: oem_fujitsu.c
$(CC) /c $(CFLAGS_M) /Fo$(TMP_D)\oem_fujitsu.obj oem_fujitsu.c
diff --git a/util/ireset.c b/util/ireset.c
index 434676f..45133fe 100644
--- a/util/ireset.c
+++ b/util/ireset.c
@@ -108,7 +108,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "ireset";
static uchar ipmi_maj;
static uchar ipmi_min;
diff --git a/util/isel.c b/util/isel.c
index 83752eb..a1d4fdb 100644
--- a/util/isel.c
+++ b/util/isel.c
@@ -162,7 +162,7 @@ typedef struct
#define RDATA_OFFSET 13 //byte offset to the record event data
static char *progname = "isel";
-static char *progver = "3.02";
+static char *progver = "3.03";
#ifdef WIN32
#define IDXFILE "sel.idx"
static char idxfile[80] = IDXFILE;
diff --git a/util/iseltime.c b/util/iseltime.c
index ba0013d..3aa9f27 100644
--- a/util/iseltime.c
+++ b/util/iseltime.c
@@ -6,6 +6,7 @@
* 05/11/09 Andy Cress v1.0 - created
* 07/23/10 Andy Cress v1.1 - always show System time also
* 08/20/10 Andy Cress v1.2 - show/set RTC time also if Linux
+ * 03/16/17 Andy Cress 3.03 - show/set UTC offset also
*/
/*M*
Copyright (c) 2013, Andy Cress
@@ -72,16 +73,45 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define GET_SELTIME 0x48
#define SET_SELTIME 0x49
+#define GET_SELUTC 0x5C
+#define SET_SELUTC 0x5D
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "iseltime";
static char fdebug = 0;
static char fset = 0;
static uchar ipmi_maj = 0;
static uchar ipmi_min = 0;
+static int get_sel_utc(uchar *rdata, int rlen)
+{
+ uchar idata[4];
+ uchar ccode;
+ int ret;
+ ret = ipmi_cmdraw(GET_SELUTC, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN,
+ idata, 0, rdata, &rlen, &ccode, fdebug);
+ if (ret == 0 && ccode != 0) ret = ccode;
+ return(ret);
+} /*end get_sel_utc()*/
+
+static int set_sel_utc(short offset)
+{
+ uchar idata[4];
+ uchar rdata[16];
+ int rlen = 8;
+ int ret;
+ uchar ccode;
+
+ idata[0] = (uchar)(offset & 0x00ff);
+ idata[1] = (uchar)((offset >> 8) & 0x00ff);
+ ret = ipmi_cmdraw(SET_SELUTC, NETFN_STOR, BMC_SA, PUBLIC_BUS, BMC_LUN,
+ idata, 2, rdata, &rlen, &ccode, fdebug);
+ if (ret == 0 && ccode != 0) ret = ccode;
+ return(ret);
+} /*end set_sel_utc()*/
+
static int get_sel_time(uchar *rdata, int rlen)
{
uchar idata[4];
@@ -142,15 +172,15 @@ time_t utc2local(time_t t)
void show_time(time_t etime, int doutc)
{
char buf[TIMESTR_SZ];
- int bufsz = TIMESTR_SZ;
+ int bufsz = TIMESTR_SZ;
time_t t;
- strcpy(buf,"00/00/00 00:00:00");
+ strcpy(buf,"00/00/00 00:00:00");
if (doutc) t = utc2local(etime);
else t = etime;
- strftime(buf,bufsz, "%x %H:%M:%S", gmtime(&t)); /*or "%x %T"*/
+ strftime(buf,bufsz, "%x %H:%M:%S", gmtime(&t)); /*or "%x %T"*/
printf("%s\n",buf);
- return;
+ return;
}
#ifdef METACOMMAND
@@ -168,6 +198,7 @@ main(int argc, char **argv)
uchar devrec[20];
uchar timebuf[4];
time_t ltime1, ltime2, ltime3;
+ short offset;
int c;
#if defined (EFI)
@@ -214,11 +245,19 @@ main(int argc, char **argv)
#endif
}
+ offset = 0;
+ rv = get_sel_utc((uchar *)&offset,2);
+ if (fdebug) printf("get_sel_utc: ret=%x offset=%d\n",rv,offset);
+ if (rv == 0) {
+ /* TODO: get system UTC offset */
+ rv = set_sel_utc(offset);
+ printf("set_sel_utc(%d): ret=%x\n",offset,rv);
+ }
rv = get_sel_time(&timebuf[0],4);
if (rv != 0) {
- printf("get_sel_time error: ret = %x\n",rv);
- ipmi_close_();
- exit(1);
+ printf("get_sel_time error: ret = %x\n",rv);
+ ipmi_close_();
+ exit(1);
}
time(&ltime2);
printf("Current System time: "); show_time(ltime2,1);
diff --git a/util/isensor.c b/util/isensor.c
index 7dd746e..3de3d38 100644
--- a/util/isensor.c
+++ b/util/isensor.c
@@ -255,7 +255,7 @@ char *decode_entity_id(int id) {
* Global Data
************************/
static char *progname = "isensor";
-static char *progver = "3.02";
+static char *progver = "3.03";
#ifdef WIN32
static char savefile[] = "%ipmiutildir%\\thresholds.cmd";
#else
diff --git a/util/iserial.c b/util/iserial.c
index 14de25c..8bed75c 100644
--- a/util/iserial.c
+++ b/util/iserial.c
@@ -155,7 +155,7 @@ typedef struct
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "iserial";
static int vend_id = 0;
static int prod_id = 0;
diff --git a/util/isol.c b/util/isol.c
index 6fc13f8..8bd5a2f 100644
--- a/util/isol.c
+++ b/util/isol.c
@@ -165,7 +165,7 @@ void dbglog( char *pattn, ... ); /*local prototype*/
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "isol";
static char fdebug = 0;
static char fpicmg = 0;
diff --git a/util/itsol.c b/util/itsol.c
index 540b73b..8d5ba1b 100644
--- a/util/itsol.c
+++ b/util/itsol.c
@@ -98,7 +98,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz);
extern int verbose;
extern char fdebug; /*from ipmicmd.c*/
static char * progname = "itsol";
-static char * progver = "3.02";
+static char * progver = "3.03";
static uchar g_bus = PUBLIC_BUS;
static uchar g_sa = BMC_SA;
static uchar g_lun = BMC_LUN;
diff --git a/util/iuser.c b/util/iuser.c
new file mode 100644
index 0000000..7cbe661
--- /dev/null
+++ b/util/iuser.c
@@ -0,0 +1,298 @@
+/*
+ * iuser.c
+ * Handle IPMI user command functions
+ *
+ * Change history:
+ * 03/22/2017 ARCress - included in source tree
+ *
+ *----------------------------------------------------------------------*
+The BSD License
+
+Copyright (c) 2017, Andy Cress. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a.. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b.. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ c.. Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *----------------------------------------------------------------------*/
+#ifdef WIN32
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "getopt.h"
+#else
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#if defined(HPUX)
+/* getopt is defined in stdio.h */
+#elif defined(MACOS)
+/* getopt is defined in unistd.h */
+#include <unistd.h>
+#else
+#include <getopt.h>
+#endif
+#endif
+#include "ipmicmd.h"
+
+/* global variables */
+static char * progname = "iuser";
+static char * progver = "3.03";
+static char fdebug = 0;
+static char fcanonical = 0;
+static char bdelim = '|';
+static uchar g_bus = PUBLIC_BUS;
+static uchar g_sa = BMC_SA;
+static uchar g_lun = BMC_LUN;
+static uchar g_addrtype = ADDR_SMI;
+extern int verbose; /*see ipmilanplus.c*/
+
+extern void lprintf(int level, const char * format, ...); /*ipmilanplus.c*/
+
+int GetUserInfo(uchar unum, uchar chan, uchar *enab, uchar *priv, char *uname, char fdebug);
+int SetPasswd(int unum, char *uname, char *upswd, uchar chan, uchar priv);
+int GetBmcEthDevice(uchar lan_parm, uchar *pchan);
+char *parse_priv(uchar c);
+
+static void printf_user_usage(void)
+{
+ printf("ipmiutil user Commands:\n");
+ printf("\tuser list [channel]\n");
+ printf("\tuser enable <user_num> [channel]\n");
+ printf("\tuser disable <user_num>\n");
+ printf("\tuser set <user_num> name <username> \n");
+ printf("\tuser set <user_num> password <password> \n");
+ printf("\tuser set <user_num> priv <priv_level> [channel]\n");
+ printf("\t\twhere priv_level: 4=Admin, 3=Operator, 2=User\n");
+}
+
+/* ipmi_user_list - print out info for users
+ *
+ * @intf: ipmi inteface
+ * @argc: argument count
+ * @argv: argument list
+ * returns 0 on success, -1 on error
+ */
+static int ipmi_user_list(void * intf, int argc, char ** argv)
+{
+ int i,ret = 0;
+ int rv = -1;
+ uchar num = 1;
+ uchar chan = 1;
+ uchar enab, priv;
+ char uname[21];
+ char *privstr;
+
+ if (argv[0] != NULL) chan = atoi(argv[0]);
+ else i = GetBmcEthDevice(0xFF, &chan);
+ while (ret == 0) {
+ uname[0] = '\0';
+ ret = GetUserInfo(num, chan, &enab, &priv, uname, fdebug);
+ if (ret == 0) {
+ privstr = parse_priv(priv);
+ if (fcanonical)
+ printf("User %2d %c chan=%d %c %8s %c %8s %c %s\n",
+ num,bdelim,chan,bdelim,(enab? "enabled": "disabled"),
+ bdelim,privstr,bdelim,uname);
+ else
+ printf("User %2d: chan=%d \t%8s \t%8s \t%s\n",
+ num,chan,(enab? "enabled": "disabled"),privstr,uname);
+ rv = 0;
+ }
+ num++;
+ }
+ return(rv);
+}
+
+/* ipmi_user_enable_disable - enable/disable BMC functions
+ *
+ * @intf: ipmi inteface
+ * @enable: whether to enable or disable
+ * @argc: argument count
+ * @argv: argument list
+ *
+ * returns 0 on success, -1 on error
+ */
+static int
+ipmi_user_enable_disable(void * intf, int enable, int argc, char ** argv)
+{
+ int i, ret = -1;
+ uchar unum, chan, enab;
+ uchar priv = 3;
+ char uname[21] = {'\0'};
+
+ if (argc < 1 || strncmp(argv[0], "help", 4) == 0) {
+ printf_user_usage();
+ return ERR_USAGE;
+ }
+ if (argv[0] == NULL) { printf_user_usage(); return ERR_USAGE; }
+ unum = atoi(argv[0]);
+
+ if (argv[1] != NULL) chan = atoi(argv[1]);
+ else i = GetBmcEthDevice(0xFF, &chan);
+
+ if (enable == 0) {
+ ret = DisableUser(unum, chan);
+ } else {
+ ret = GetUserInfo(unum, chan, &enab, &priv, uname, fdebug);
+ ret = SetPasswd(unum, uname, NULL, chan, priv);
+ }
+ return ret;
+}
+
+/* ipmi_user_reset - reset firmware user to enable everything
+ *
+ * @intf: ipmi inteface
+ * @argc: argument count
+ * @argv: argument list
+ *
+ * returns 0 on success, -1 on error
+ */
+static int
+ipmi_user_set(void * intf, int argc, char ** argv)
+{
+ int ret = -1;
+ int i, func = -1;
+ char *uname = NULL;
+ char *upass = NULL;
+ uchar unum, chan, enab, dummy;
+ uchar priv = 3;
+ char name[21] = {'\0'};
+
+ if ((argc < 2) || (argc > 0 && strncmp(argv[0], "help", 4) == 0)) {
+ printf_user_usage();
+ return ERR_USAGE;
+ }
+ if ((argv[1] == NULL) || (argv[2] == NULL)) {
+ printf_user_usage();
+ return ERR_USAGE;
+ }
+ unum = atoi(argv[0]);
+ if (strncmp(argv[1], "name", 4) == 0) {
+ func = 1;
+ uname = argv[2];
+ } else if (strncmp(argv[1], "password", 8) == 0) {
+ func = 2;
+ upass = argv[2];
+ } else if (strncmp(argv[1], "priv", 4) == 0) {
+ func = 3;
+ priv = atoi(argv[2]);
+ } else {
+ printf_user_usage();
+ return(ERR_USAGE);
+ }
+ if (argv[3] != NULL) chan = atoi(argv[3]);
+ else i = GetBmcEthDevice(0xFF, &chan);
+
+ switch(func) {
+ case 1: /*set name*/
+ ret = GetUserInfo(unum, chan, &enab, &priv, name, fdebug);
+ ret = SetPasswd(unum, uname, upass, chan, priv);
+ break;
+ case 2: /*set password*/
+ ret = GetUserInfo(unum, chan, &enab, &priv, name, fdebug);
+ if (ret == 0) uname = name;
+ ret = SetPasswd(unum, uname, upass, chan, priv);
+ break;
+ case 3: /*set priv*/
+ ret = GetUserInfo(unum, chan, &enab, &dummy, name, fdebug);
+ if (ret == 0) uname = name;
+ ret = SetPasswd(unum, uname, upass, chan, priv);
+ break;
+ }
+ return ret;
+}
+
+#ifdef METACOMMAND
+int i_user(int argc, char **argv)
+#else
+#ifdef WIN32
+int __cdecl
+#else
+int
+#endif
+main(int argc, char **argv)
+#endif
+{
+ void *intf = NULL;
+ int rc = 0;
+ int c, i;
+ char *s1;
+
+ printf("%s ver %s\n", progname,progver);
+
+ while ( (c = getopt( argc, argv,"cm:T:V:J:EYF:P:N:R:U:Z:x?")) != EOF )
+ switch (c) {
+ case 'c': fcanonical = 1; break;
+ case 'm': /* specific IPMB MC, 3-byte address, e.g. "409600" */
+ g_bus = htoi(&optarg[0]); /*bus/channel*/
+ g_sa = htoi(&optarg[2]); /*device slave address*/
+ g_lun = htoi(&optarg[4]); /*LUN*/
+ g_addrtype = ADDR_IPMB;
+ if (optarg[6] == 's') {
+ g_addrtype = ADDR_SMI; s1 = "SMI";
+ } else { g_addrtype = ADDR_IPMB; s1 = "IPMB"; }
+ ipmi_set_mc(g_bus,g_sa,g_lun,g_addrtype);
+ printf("Use MC at %s bus=%x sa=%x lun=%x\n",
+ s1,g_bus,g_sa,g_lun);
+ break;
+ case 'x': fdebug = 1; verbose = 1;
+ break; /* debug messages */
+ case 'N': /* nodename */
+ case 'U': /* remote username */
+ case 'P': /* remote password */
+ case 'R': /* remote password */
+ case 'E': /* get password from IPMI_PASSWORD environment var */
+ case 'F': /* force driver type */
+ case 'T': /* auth type */
+ case 'J': /* cipher suite */
+ case 'V': /* priv level */
+ case 'Y': /* prompt for remote password */
+ case 'Z': /* set local MC address */
+ parse_lan_options(c,optarg,fdebug);
+ break;
+ case '?':
+ print_lan_opt_usage(0);
+ printf_user_usage();
+ return ERR_USAGE;
+ break;
+ }
+ for (i = 0; i < optind; i++) { argv++; argc--; }
+
+ if (argc < 1 || strncmp(argv[0], "help", 4) == 0) {
+ printf_user_usage();
+ } else if (strncmp(argv[0], "list", 4) == 0) {
+ rc = ipmi_user_list(intf, argc-1, &(argv[1]));
+ } else if (strncmp(argv[0], "enable", 6) == 0) {
+ rc = ipmi_user_enable_disable(intf, 1, argc-1, &(argv[1]));
+ } else if (strncmp(argv[0], "disable", 7) == 0) {
+ rc = ipmi_user_enable_disable(intf, 0, argc-1, &(argv[1]));
+ } else if (strncmp(argv[0], "set", 3) == 0) {
+ rc = ipmi_user_set(intf, argc-1, &(argv[1]));
+ } else {
+ printf_user_usage();
+ rc = ERR_BAD_PARAM;
+ }
+ ipmi_close_();
+ return rc;
+}
diff --git a/util/iwdt.c b/util/iwdt.c
index 89f4c52..820d57b 100644
--- a/util/iwdt.c
+++ b/util/iwdt.c
@@ -100,7 +100,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/*
* Global variables
*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "iwdt";
static char fdebug = 0;
static char fdontlog = 0;
diff --git a/util/oem_dell.c b/util/oem_dell.c
index c806e94..f8caf9a 100644
--- a/util/oem_dell.c
+++ b/util/oem_dell.c
@@ -132,7 +132,7 @@ char NIC_Selection_Mode_String_12g[] [50] = {
"shared with failover all loms"
};
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "idelloem";
static int verbose = 0;
static char fdebug = 0;
diff --git a/util/oem_hp.c b/util/oem_hp.c
index 4c5b4f9..b7f7d07 100644
--- a/util/oem_hp.c
+++ b/util/oem_hp.c
@@ -83,10 +83,17 @@ int decode_sensor_hp(uchar *sdr,uchar *reading,char *pstring, int slen)
strncpy(pstring,"na",slen); /*oem*/
rv = 0;
} else {
- if ((reading[2] & 0x40) == 0x40) { /*Init/Unavail state*/
- strncpy(pstring,"Init",slen);
+#ifdef OLD
+ int vend, prod;
+ get_mfgid(&vend,&prod);
+ /* This was an anomaly for an older HP DL380 but is no longer valid */
+ if ((prod == 0x2000) && ((reading[2] & 0x40) == 0x40)) {
+ /*custom Init/Unavail state if DL380*/
+ strncpy(pstring,"Init",slen);
rv = 0;
- } else if (evtype == 0x6f) { /*evtype==0x6f special*/
+ } else
+#endif
+ if (evtype == 0x6f) { /*evtype==0x6f special*/
pstr = "DiscreteEvt";
if (stype == 0x08) { /*Power Supply presence*/
if (reading[2] & 0x01) pstr = "Present";
diff --git a/util/oem_sun.c b/util/oem_sun.c
index 5cedc34..1d25301 100644
--- a/util/oem_sun.c
+++ b/util/oem_sun.c
@@ -109,7 +109,7 @@ static const struct valstr sunoem_led_mode_optvals[] = {
/* global variables */
static char * progname = "isunoem";
-static char * progver = "3.02";
+static char * progver = "3.03";
static char fdebug = 0;
static uchar g_bus = PUBLIC_BUS;
static uchar g_sa = BMC_SA;
diff --git a/util/oem_supermicro.c b/util/oem_supermicro.c
index d1d1da7..165bf88 100644
--- a/util/oem_supermicro.c
+++ b/util/oem_supermicro.c
@@ -68,7 +68,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
void set_loglevel(int level); /*prototype */
extern char fsm_debug; /*mem_if.c*/
-static char * progver = "3.02";
+static char * progver = "3.03";
static char * progname = "ismcoem";
static int verbose = 0;
static char fdebug = 0;