Hello community,
here is the log from the commit of package freeipmi for openSUSE:Factory checked in at 2014-05-15 19:10:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/freeipmi (Old)
and /work/SRC/openSUSE:Factory/.freeipmi.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "freeipmi"
Changes:
--------
--- /work/SRC/openSUSE:Factory/freeipmi/freeipmi.changes 2014-03-06 11:57:01.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.freeipmi.new/freeipmi.changes 2014-05-15 19:10:46.000000000 +0200
@@ -1,0 +2,17 @@
+Thu May 8 06:54:32 UTC 2014 - kkaempf@suse.com
+
+- Update to 1.4.3
+ has freeipmi-1.4.2.patch included, drop local patch
+
+-------------------------------------------------------------------
+Wed May 7 06:17:51 UTC 2014 - kkaempf@suse.com
+
+- Update to 1.4.2
+ o In ipmi-oem, support Supermicro get-power-supply-status and
+ get-pmbus-power-supply-status commands.
+ o Support 'ipmiping' workaround in ipmipower.
+ o Minor documentation updates.
+
+- Fix compile bug, add freeipmi-1.4.2.patch
+
+-------------------------------------------------------------------
Old:
----
freeipmi-1.4.1.tar.gz
New:
----
freeipmi-1.4.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ freeipmi.spec ++++++
--- /var/tmp/diff_new_pack.UHBap8/_old 2014-05-15 19:10:47.000000000 +0200
+++ /var/tmp/diff_new_pack.UHBap8/_new 2014-05-15 19:10:47.000000000 +0200
@@ -18,7 +18,7 @@
%define name freeipmi
-%define version 1.4.1
+%define version 1.4.3
%define srcversion %{version}
%if %{?_with_debug:1}%{!?_with_debug:0}
%define release 1.debug%{?dist}
++++++ freeipmi-1.4.1.tar.gz -> freeipmi-1.4.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ChangeLog new/freeipmi-1.4.3/ChangeLog
--- old/freeipmi-1.4.1/ChangeLog 2014-03-03 20:36:05.000000000 +0100
+++ new/freeipmi-1.4.3/ChangeLog 2014-05-07 19:45:59.000000000 +0200
@@ -1,3 +1,38 @@
+2014-05-07 Albert Chu
+
+ * NEWS, configure.ac: Update for release.
+
+ * Tagged Release-1_4_3
+
+2014-05-07 Klaus Kaempf
+
+ * ipmipower/ipmipower_ping.c: Fix compile bug.
+
+2014-05-06 Albert Chu
+
+ * NEWS, configure.ac: Update for release.
+
+ * Tagged Release-1_4_2
+
+2014-03-19 Albert Chu
+
+ * ipmipower/: Support 'ipmiping' workaround.
+
+2014-03-19 David Binderman
+
+ * libfreeipmi/interpret/ipmi-interpret.c: Fix leap before you look
+ bugs.
+
+2014-03-13 Albert Chu
+
+ * ipmi-oem/: Support Supermicro get-power-supply-status
+ and get-pmbus-power-supply-status commands.
+
+2014-03-12 Albert Chu
+
+ * doc/freeipmi-faq.texi: Add notes on ipmi-detect for IPMI
+ discovery.
+
2014-03-03 Albert Chu
* NEWS, configure.ac: Update for release.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/NEWS new/freeipmi-1.4.3/NEWS
--- old/freeipmi-1.4.1/NEWS 2014-03-03 20:36:05.000000000 +0100
+++ new/freeipmi-1.4.3/NEWS 2014-05-07 19:45:59.000000000 +0200
@@ -1,3 +1,14 @@
+FreeIPMI 1.4.3 - 05/07/14
+-------------------------
+o Fix compile bug in 1.4.2 release.
+
+FreeIPMI 1.4.2 - 05/06/14
+-------------------------
+o In ipmi-oem, support Supermicro get-power-supply-status and
+ get-pmbus-power-supply-status commands.
+o Support 'ipmiping' workaround in ipmipower.
+o Minor documentation updates.
+
FreeIPMI 1.4.1 - 03/01/14
-------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/common/parsecommon/parse-common.c new/freeipmi-1.4.3/common/parsecommon/parse-common.c
--- old/freeipmi-1.4.1/common/parsecommon/parse-common.c 2014-03-03 20:36:03.000000000 +0100
+++ new/freeipmi-1.4.3/common/parsecommon/parse-common.c 2014-03-20 00:02:25.000000000 +0100
@@ -296,6 +296,9 @@
else if (section_specific_workaround_flags
&& !strcasecmp (tok, IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_GUID_FORMAT_STR))
(*section_specific_workaround_flags) |= IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_GUID_FORMAT;
+ else if (section_specific_workaround_flags
+ && !strcasecmp (tok, IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING_STR))
+ (*section_specific_workaround_flags) |= IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING;
else
return (-1);
tok = strtok (NULL, ",");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/common/parsecommon/parse-common.h new/freeipmi-1.4.3/common/parsecommon/parse-common.h
--- old/freeipmi-1.4.1/common/parsecommon/parse-common.h 2014-03-03 20:36:03.000000000 +0100
+++ new/freeipmi-1.4.3/common/parsecommon/parse-common.h 2014-03-20 00:02:25.000000000 +0100
@@ -121,6 +121,9 @@
/* bmc-info */
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_GUID_FORMAT 0x0002000
+/* ipmipower */
+#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING 0x0004000
+
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_SOL_PAYLOAD_SIZE_STR "solpayloadsize"
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_SOL_PORT_STR "solport"
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_SKIP_SOL_ACTIVATION_STATUS_STR "solstatus"
@@ -140,6 +143,7 @@
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IGNORE_STATE_FLAG_STR "ignorestateflag"
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_MALFORMED_ACK_STR "malformedack"
#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_GUID_FORMAT_STR "guidformat"
+#define IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING_STR "ipmiping"
#define IPMI_PARSE_AUTHENTICATION_TYPE_NONE_STR "none"
#define IPMI_PARSE_AUTHENTICATION_TYPE_STRAIGHT_PASSWORD_KEY_STR "straight_password_key"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/configure new/freeipmi-1.4.3/configure
--- old/freeipmi-1.4.1/configure 2014-03-03 20:36:13.000000000 +0100
+++ new/freeipmi-1.4.3/configure 2014-05-07 19:47:35.000000000 +0200
@@ -1,7 +1,7 @@
#! /bin/sh
# From configure.ac Id: configure.ac,v 1.208 2010-08-06 21:02:29 chu11 Exp .
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for freeipmi 1.4.1.
+# Generated by GNU Autoconf 2.63 for freeipmi 1.4.3.
#
# Report bugs to .
#
@@ -746,8 +746,8 @@
# Identity of this package.
PACKAGE_NAME='freeipmi'
PACKAGE_TARNAME='freeipmi'
-PACKAGE_VERSION='1.4.1'
-PACKAGE_STRING='freeipmi 1.4.1'
+PACKAGE_VERSION='1.4.3'
+PACKAGE_STRING='freeipmi 1.4.3'
PACKAGE_BUGREPORT='freeipmi-devel@gnu.org'
ac_unique_file="ChangeLog.0"
@@ -1528,7 +1528,7 @@
# 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 freeipmi 1.4.1 to adapt to many kinds of systems.
+\`configure' configures freeipmi 1.4.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1598,7 +1598,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of freeipmi 1.4.1:";;
+ short | recursive ) echo "Configuration of freeipmi 1.4.3:";;
esac
cat <<\_ACEOF
@@ -1716,7 +1716,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-freeipmi configure 1.4.1
+freeipmi configure 1.4.3
generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1730,7 +1730,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by freeipmi $as_me 1.4.1, which was
+It was created by freeipmi $as_me 1.4.3, which was
generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@
@@ -2103,7 +2103,7 @@
FREEIPMI_PACKAGE_VERSION_MAJOR=1
FREEIPMI_PACKAGE_VERSION_MINOR=4
-FREEIPMI_PACKAGE_VERSION_PATCH=0
+FREEIPMI_PACKAGE_VERSION_PATCH=3
@@ -2595,7 +2595,7 @@
# Define the identity of the package.
PACKAGE='freeipmi'
- VERSION='1.4.1'
+ VERSION='1.4.3'
cat >>confdefs.h <<_ACEOF
@@ -19861,7 +19861,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by freeipmi $as_me 1.4.1, which was
+This file was extended by freeipmi $as_me 1.4.3, which was
generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -19924,7 +19924,7 @@
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
-freeipmi config.status 1.4.1
+freeipmi config.status 1.4.3
configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/configure.ac new/freeipmi-1.4.3/configure.ac
--- old/freeipmi-1.4.1/configure.ac 2014-03-03 20:36:05.000000000 +0100
+++ new/freeipmi-1.4.3/configure.ac 2014-05-07 19:45:59.000000000 +0200
@@ -1,11 +1,11 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([freeipmi],[1.4.1],[freeipmi-devel@gnu.org])
+AC_INIT([freeipmi],[1.4.3],[freeipmi-devel@gnu.org])
AC_REVISION([$Id: configure.ac,v 1.208 2010-08-06 21:02:29 chu11 Exp $])
AC_CONFIG_MACRO_DIR([config])
FREEIPMI_PACKAGE_VERSION_MAJOR=1
FREEIPMI_PACKAGE_VERSION_MINOR=4
-FREEIPMI_PACKAGE_VERSION_PATCH=0
+FREEIPMI_PACKAGE_VERSION_PATCH=3
AC_SUBST(FREEIPMI_PACKAGE_VERSION_MAJOR)
AC_SUBST(FREEIPMI_PACKAGE_VERSION_MINOR)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/doc/freeipmi-bugs-issues-and-workarounds.txt new/freeipmi-1.4.3/doc/freeipmi-bugs-issues-and-workarounds.txt
--- old/freeipmi-1.4.1/doc/freeipmi-bugs-issues-and-workarounds.txt 2014-03-03 20:35:58.000000000 +0100
+++ new/freeipmi-1.4.3/doc/freeipmi-bugs-issues-and-workarounds.txt 2014-03-19 00:43:57.000000000 +0100
@@ -1793,6 +1793,12 @@
Resolution: None, user should attempt to authenticate at a higher
privilege level.
+Misc IPMI Issue #7: [COMPLIANCE]
+
+ System does not support RMCP ping/pong.
+
+ Seen on: Intel Windmill, Quanta Winterfell, Wiwynn Windmill
+
----------------------------------------------------------------------
------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/doc/freeipmi-faq.info new/freeipmi-1.4.3/doc/freeipmi-faq.info
--- old/freeipmi-1.4.1/doc/freeipmi-faq.info 2014-03-03 20:36:29.000000000 +0100
+++ new/freeipmi-1.4.3/doc/freeipmi-faq.info 2014-05-07 19:47:51.000000000 +0200
@@ -1,7 +1,7 @@
This is freeipmi-faq.info, produced by makeinfo version 4.13 from
freeipmi-faq.texi.
-This manual is for FreeIPMI (version 1.4.1, 3 March 2014). Copyright
+This manual is for FreeIPMI (version 1.4.3, 12 March 2014). Copyright
(C) 2006-2012 FreeIPMI Core Team
Permission is granted to copy, distribute and/or modify this
@@ -22,8 +22,8 @@
Frequently Asked Questions on *FreeIPMI*
- This edition of the documentation was last updated on 3 March 2014
-for release 1.4.1 of the FreeIPMI.
+ This edition of the documentation was last updated on 7 May 2014 for
+release 1.4.3 of the FreeIPMI.
* Menu:
@@ -311,7 +311,9 @@
================================
Unfortunately, there are no universally defined mechanisms for
-determining if a system supports IPMI. The following may provide hints.
+determining if a system supports IPMI via Inband communication.
+Assuming IPMI is set up correctly for over LAN communication, a fairly
+reliable mechanism exists out-of-band. Here are some suggestions.
1. FreeIPMI's `ipmi-locate' can be used to determine if IPMI can be
found on your system. Users are cautioned though, the failure to
@@ -337,6 +339,11 @@
Base Address: 0x0000000000000CA2 (I/O)
Register Spacing: Successive Byte Boundaries
+ 3. FreeIPMI's `ipmi-ping' can be used to see if a machine has an IPMI
+ service at a specific host/IP address. For more wide scale IPMI
+ discovery, the `ipmi-detectd' daemon and `ipmi-detect' tool can be
+ used.
+
Again, the failure to find an IPMI supported device is not
sufficient to show lack of IPMI support.
@@ -967,33 +974,33 @@
Tag Table:
-Node: Top689
-Node: What is IPMI?2246
-Node: What is FreeIPMI?3392
-Node: How did FreeIPMI start?3929
-Node: What operating systems does FreeIPMI run on?5297
-Node: FreeIPMI vs OpenIPMI vs Ipmitool vs Ipmiutil6053
-Node: What is special about FreeIPMI?6861
-Node: Does my system support IPMI?13774
-Node: How do I compile FreeIPMI?15420
-Node: libgcrypt requirement15785
-Node: x86-64 Compilation16428
-Node: Installing FreeIPMI on FreeBSD17114
-Node: What are some IPMI terminology or acronyms I should be aware of?17757
-Node: What setup is needed for FreeIPMI to communicate over LAN?20776
-Node: What setup is needed for Serial over LAN (SOL) or Ipmiconsole?21372
-Node: Do I need to install or configure a driver to perform IPMI inband?23286
-Node: SSIF Driver Configuration24999
-Node: How do you setup Powerman with ipmipower?26599
-Node: How do you setup Conman with ipmiconsole or libipmiconsole?29894
-Node: How do you setup Ganglia or Nagios to monitor IPMI sensors via FreeIPMI?31811
-Node: Why are times reported by FreeIPMI tools wrong?32456
-Node: Why is the IPMI kernel driver faster than the KCS driver?33446
-Node: Why is the output from FreeIPMI different than another software?34450
-Node: Why are there so many IPMI compliance bugs?38952
-Node: How do I get around an IPMI compliance bug on my motherboard?40053
-Node: Why am I seeing so many 'internal IPMI error' or 'driver busy' messages?40870
-Node: How do I program with the FreeIPMI libraries?43997
-Node: Where can I get additional help or support?45344
+Node: Top690
+Node: What is IPMI?2245
+Node: What is FreeIPMI?3391
+Node: How did FreeIPMI start?3928
+Node: What operating systems does FreeIPMI run on?5296
+Node: FreeIPMI vs OpenIPMI vs Ipmitool vs Ipmiutil6052
+Node: What is special about FreeIPMI?6860
+Node: Does my system support IPMI?13773
+Node: How do I compile FreeIPMI?15774
+Node: libgcrypt requirement16139
+Node: x86-64 Compilation16782
+Node: Installing FreeIPMI on FreeBSD17468
+Node: What are some IPMI terminology or acronyms I should be aware of?18111
+Node: What setup is needed for FreeIPMI to communicate over LAN?21130
+Node: What setup is needed for Serial over LAN (SOL) or Ipmiconsole?21726
+Node: Do I need to install or configure a driver to perform IPMI inband?23640
+Node: SSIF Driver Configuration25353
+Node: How do you setup Powerman with ipmipower?26953
+Node: How do you setup Conman with ipmiconsole or libipmiconsole?30248
+Node: How do you setup Ganglia or Nagios to monitor IPMI sensors via FreeIPMI?32165
+Node: Why are times reported by FreeIPMI tools wrong?32810
+Node: Why is the IPMI kernel driver faster than the KCS driver?33800
+Node: Why is the output from FreeIPMI different than another software?34804
+Node: Why are there so many IPMI compliance bugs?39306
+Node: How do I get around an IPMI compliance bug on my motherboard?40407
+Node: Why am I seeing so many 'internal IPMI error' or 'driver busy' messages?41224
+Node: How do I program with the FreeIPMI libraries?44351
+Node: Where can I get additional help or support?45698
End Tag Table
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/doc/freeipmi-faq.texi new/freeipmi-1.4.3/doc/freeipmi-faq.texi
--- old/freeipmi-1.4.1/doc/freeipmi-faq.texi 2014-03-03 20:35:58.000000000 +0100
+++ new/freeipmi-1.4.3/doc/freeipmi-faq.texi 2014-03-12 15:28:35.000000000 +0100
@@ -335,8 +335,10 @@
@section Does my system support IPMI?
Unfortunately, there are no universally defined mechanisms for
-determining if a system supports @acronym{IPMI}. The following may
-provide hints.
+determining if a system supports @acronym{IPMI} via Inband
+communication. Assuming IPMI is set up correctly for over LAN
+communication, a fairly reliable mechanism exists out-of-band. Here
+are some suggestions.
@enumerate
@@ -370,6 +372,12 @@
Register Spacing: Successive Byte Boundaries
@end example
+@item
+FreeIPMI's @command{ipmi-ping} can be used to see if a machine has an
+IPMI service at a specific host/IP address. For more wide scale IPMI
+discovery, the @command{ipmi-detectd} daemon and @command{ipmi-detect}
+tool can be used.
+
@end enumerate
Again, the failure to find an @acronym{IPMI} supported device is not
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/doc/stamp-vti new/freeipmi-1.4.3/doc/stamp-vti
--- old/freeipmi-1.4.1/doc/stamp-vti 2014-03-03 20:36:29.000000000 +0100
+++ new/freeipmi-1.4.3/doc/stamp-vti 2014-05-07 19:47:51.000000000 +0200
@@ -1,4 +1,4 @@
-@set UPDATED 3 March 2014
+@set UPDATED 12 March 2014
@set UPDATED-MONTH March 2014
-@set EDITION 1.4.1
-@set VERSION 1.4.1
+@set EDITION 1.4.3
+@set VERSION 1.4.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/doc/version-faq.texi new/freeipmi-1.4.3/doc/version-faq.texi
--- old/freeipmi-1.4.1/doc/version-faq.texi 2014-03-03 20:36:29.000000000 +0100
+++ new/freeipmi-1.4.3/doc/version-faq.texi 2014-05-07 19:47:51.000000000 +0200
@@ -1,4 +1,4 @@
-@set UPDATED 3 March 2014
+@set UPDATED 12 March 2014
@set UPDATED-MONTH March 2014
-@set EDITION 1.4.1
-@set VERSION 1.4.1
+@set EDITION 1.4.3
+@set VERSION 1.4.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/freeipmi.spec new/freeipmi-1.4.3/freeipmi.spec
--- old/freeipmi-1.4.1/freeipmi.spec 2014-03-03 20:36:26.000000000 +0100
+++ new/freeipmi-1.4.3/freeipmi.spec 2014-05-07 19:47:48.000000000 +0200
@@ -3,7 +3,7 @@
#
%define name freeipmi
-%define version 1.4.1
+%define version 1.4.3
%if %{?_with_debug:1}%{!?_with_debug:0}
%define release 1.debug%{?dist}
%else
@@ -491,7 +491,7 @@
- Obsolete old subpackage freeipmi-ipmimonitoring.
* Tue Dec 18 2007 Albert Chu 0.6.0
-- Use %{version} instead of 1.4.1 for substitution in paths.
+- Use %{version} instead of 1.4.3 for substitution in paths.
* Fri Dec 14 2007 Albert Chu 0.6.0
- Update packaging for libfreeipmi reorganization
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ipmi-oem/ipmi-oem-supermicro.c new/freeipmi-1.4.3/ipmi-oem/ipmi-oem-supermicro.c
--- old/freeipmi-1.4.1/ipmi-oem/ipmi-oem-supermicro.c 2014-03-03 20:36:02.000000000 +0100
+++ new/freeipmi-1.4.3/ipmi-oem/ipmi-oem-supermicro.c 2014-03-13 16:12:58.000000000 +0100
@@ -357,3 +357,191 @@
cleanup:
return (rv);
}
+
+int
+ipmi_oem_supermicro_get_power_supply_status (ipmi_oem_state_data_t *state_data)
+{
+ uint8_t bytes_rq[IPMI_OEM_MAX_BYTES];
+ uint8_t bytes_rs[IPMI_OEM_MAX_BYTES];
+ int rs_len;
+ int rv = -1;
+
+ assert (state_data);
+ assert (state_data->prog_data->args->oem_options_count == 1);
+
+ if (strcasecmp (state_data->prog_data->args->oem_options[0], "1")
+ && strcasecmp (state_data->prog_data->args->oem_options[0], "2")
+ && strcasecmp (state_data->prog_data->args->oem_options[0], "3"))
+ {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "%s:%s invalid OEM option argument '%s'\n",
+ state_data->prog_data->args->oem_id,
+ state_data->prog_data->args->oem_command,
+ state_data->prog_data->args->oem_options[0]);
+ goto cleanup;
+ }
+
+ /* Supermicro OEM
+ * From Supermicro Engineer
+ *
+ * Request
+ *
+ * 0x06 - network function
+ * 0x52 - cmd (master read/write)
+ * 0x07 - (channel = 0, bus id = 3, bus type = private)
+ * 0x?? - slave address
+ * - 0x70 - ps 1
+ * - 0x72 - ps 2
+ * - 0x74 - ps 3
+ * 0x01 - read count
+ * 0x0c - data to write ... no idea why 0x0c
+ *
+ * Response
+ *
+ * 0x52 - cmd
+ * 0x?? - Completion Code
+ * 0x?? - 0x01 - good
+ * - 0x00 - bad
+ */
+
+ bytes_rq[0] = IPMI_CMD_MASTER_WRITE_READ;
+ bytes_rq[1] = IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_CHANNEL;
+ if (!strcasecmp (state_data->prog_data->args->oem_options[0], "1"))
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS1;
+ else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "2"))
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS2;
+ else /* !strcasecmp (state_data->prog_data->args->oem_options[0], "3") */
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS3;
+ bytes_rq[3] = 1;
+ bytes_rq[4] = IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_MAGIC;
+
+ if ((rs_len = ipmi_cmd_raw (state_data->ipmi_ctx,
+ 0, /* lun */
+ IPMI_NET_FN_APP_RQ,
+ bytes_rq, /* data */
+ 5, /* num bytes */
+ bytes_rs,
+ IPMI_OEM_MAX_BYTES)) < 0)
+ {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "ipmi_cmd_raw: %s\n",
+ ipmi_ctx_errormsg (state_data->ipmi_ctx));
+ goto cleanup;
+ }
+
+ if (ipmi_oem_check_response_and_completion_code (state_data,
+ bytes_rs,
+ rs_len,
+ 3,
+ IPMI_CMD_MASTER_WRITE_READ,
+ IPMI_NET_FN_APP_RQ,
+ NULL) < 0)
+ goto cleanup;
+
+ if (bytes_rs[2] == IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_GOOD)
+ pstdout_printf (state_data->pstate, "good\n");
+ else if (bytes_rs[2] == IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_BAD)
+ pstdout_printf (state_data->pstate, "bad\n");
+ else
+ pstdout_printf (state_data->pstate, "unknown\n");
+
+ rv = 0;
+ cleanup:
+ return (rv);
+}
+
+int
+ipmi_oem_supermicro_get_pmbus_power_supply_status (ipmi_oem_state_data_t *state_data)
+{
+ uint8_t bytes_rq[IPMI_OEM_MAX_BYTES];
+ uint8_t bytes_rs[IPMI_OEM_MAX_BYTES];
+ int rs_len;
+ int rv = -1;
+
+ assert (state_data);
+ assert (state_data->prog_data->args->oem_options_count == 1);
+
+ if (strcasecmp (state_data->prog_data->args->oem_options[0], "1")
+ && strcasecmp (state_data->prog_data->args->oem_options[0], "2")
+ && strcasecmp (state_data->prog_data->args->oem_options[0], "3"))
+ {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "%s:%s invalid OEM option argument '%s'\n",
+ state_data->prog_data->args->oem_id,
+ state_data->prog_data->args->oem_command,
+ state_data->prog_data->args->oem_options[0]);
+ goto cleanup;
+ }
+
+ /* Supermicro OEM
+ * From Supermicro Engineer
+ *
+ * Request
+ *
+ * 0x06 - network function
+ * 0x52 - cmd (master read/write)
+ * 0x07 - (channel = 0, bus id = 3, bus type = private)
+ * 0x?? - slave address
+ * - 0x78 - ps 1
+ * - 0x7a - ps 2
+ * - 0x7c - ps 3
+ * 0x01 - read count
+ * 0x78 - data to write ... no idea why 0x78
+ *
+ * Response
+ *
+ * 0x52 - cmd
+ * 0x?? - Completion Code
+ * 0x?? - 0x01 - good
+ * - 0x00 - bad
+ */
+
+ bytes_rq[0] = IPMI_CMD_MASTER_WRITE_READ;
+ bytes_rq[1] = IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_CHANNEL;
+ if (!strcasecmp (state_data->prog_data->args->oem_options[0], "1"))
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS1;
+ else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "2"))
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS2;
+ else /* !strcasecmp (state_data->prog_data->args->oem_options[0], "3") */
+ bytes_rq[2] = IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS3;
+ bytes_rq[3] = 1;
+ bytes_rq[4] = IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_MAGIC;
+
+ if ((rs_len = ipmi_cmd_raw (state_data->ipmi_ctx,
+ 0, /* lun */
+ IPMI_NET_FN_APP_RQ,
+ bytes_rq, /* data */
+ 5, /* num bytes */
+ bytes_rs,
+ IPMI_OEM_MAX_BYTES)) < 0)
+ {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "ipmi_cmd_raw: %s\n",
+ ipmi_ctx_errormsg (state_data->ipmi_ctx));
+ goto cleanup;
+ }
+
+ if (ipmi_oem_check_response_and_completion_code (state_data,
+ bytes_rs,
+ rs_len,
+ 3,
+ IPMI_CMD_MASTER_WRITE_READ,
+ IPMI_NET_FN_APP_RQ,
+ NULL) < 0)
+ goto cleanup;
+
+ if (bytes_rs[2] == IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_GOOD)
+ pstdout_printf (state_data->pstate, "good\n");
+ else if (bytes_rs[2] == IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_BAD)
+ pstdout_printf (state_data->pstate, "bad\n");
+ else
+ pstdout_printf (state_data->pstate, "unknown\n");
+
+ rv = 0;
+ cleanup:
+ return (rv);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ipmi-oem/ipmi-oem-supermicro.h new/freeipmi-1.4.3/ipmi-oem/ipmi-oem-supermicro.h
--- old/freeipmi-1.4.1/ipmi-oem/ipmi-oem-supermicro.h 2014-03-03 20:36:03.000000000 +0100
+++ new/freeipmi-1.4.3/ipmi-oem/ipmi-oem-supermicro.h 2014-03-13 16:12:58.000000000 +0100
@@ -29,4 +29,8 @@
int ipmi_oem_supermicro_set_bmc_services_status (ipmi_oem_state_data_t *state_data);
+int ipmi_oem_supermicro_get_power_supply_status (ipmi_oem_state_data_t *state_data);
+
+int ipmi_oem_supermicro_get_pmbus_power_supply_status (ipmi_oem_state_data_t *state_data);
+
#endif /* IPMI_OEM_SUPERMICRO_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ipmi-oem/ipmi-oem.c new/freeipmi-1.4.3/ipmi-oem/ipmi-oem.c
--- old/freeipmi-1.4.1/ipmi-oem/ipmi-oem.c 2014-03-03 20:36:03.000000000 +0100
+++ new/freeipmi-1.4.3/ipmi-oem/ipmi-oem.c 2014-03-13 16:12:58.000000000 +0100
@@ -1205,6 +1205,20 @@
ipmi_oem_supermicro_set_bmc_services_status
},
{
+ "get-power-supply-status",
+ "",
+ 1,
+ IPMI_OEM_COMMAND_FLAGS_DEFAULT,
+ ipmi_oem_supermicro_get_power_supply_status
+ },
+ {
+ "get-pmbus-power-supply-status",
+ "",
+ 1,
+ IPMI_OEM_COMMAND_FLAGS_DEFAULT,
+ ipmi_oem_supermicro_get_pmbus_power_supply_status
+ },
+ {
NULL,
NULL,
0,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ipmipower/ipmipower_ping.c new/freeipmi-1.4.3/ipmipower/ipmipower_ping.c
--- old/freeipmi-1.4.1/ipmipower/ipmipower_ping.c 2014-03-03 20:36:01.000000000 +0100
+++ new/freeipmi-1.4.3/ipmipower/ipmipower_ping.c 2014-05-07 19:45:00.000000000 +0200
@@ -68,6 +68,9 @@
/* force discovery sweep when user reconfigures hostnames */
static int force_discovery_sweep;
+/* IPMI has a 6 bit sequence number */
+#define IPMI_RQ_SEQ_MAX 0x3F
+
void
ipmipower_ping_force_discovery_sweep ()
{
@@ -109,8 +112,6 @@
if (send_pings_flag)
{
- fiid_obj_t rmcp_hdr = NULL;
- fiid_obj_t rmcp_ping = NULL;
int dropped = 0;
memset (buf, '\0', IPMIPOWER_PACKET_BUFLEN);
@@ -142,65 +143,191 @@
*/
ics[i].ping_sequence_number_counter++;
- if (!(rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
- {
- IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
+ /* Workaround
+ *
+ * Some motherboards don't support RMCP ping/pong :-(
+ *
+ * Discovered on Intel Windmill, Quanta Winterfell, and Wiwynn Windmill
+ */
+ if (cmd_args.common_args.section_specific_workaround_flags & IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING)
+ {
+ fiid_obj_t obj_rmcp_hdr = NULL;
+ fiid_obj_t obj_lan_session_hdr = NULL;
+ fiid_obj_t obj_lan_msg_hdr = NULL;
+ fiid_obj_t obj_cmd = NULL;
+
+ if (!(obj_rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_lan_session_hdr = fiid_obj_create (tmpl_lan_session_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_lan_msg_hdr = fiid_obj_create (tmpl_lan_msg_hdr_rq)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_cmd = fiid_obj_create (tmpl_cmd_get_channel_authentication_capabilities_rq)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_rmcp_hdr_ipmi (obj_rmcp_hdr) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_rmcp_hdr_ipmi: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_lan_session_hdr (IPMI_AUTHENTICATION_TYPE_NONE,
+ 0,
+ 0,
+ obj_lan_session_hdr) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_lan_session_hdr: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_lan_msg_hdr (IPMI_SLAVE_ADDRESS_BMC,
+ IPMI_NET_FN_APP_RQ,
+ IPMI_BMC_IPMB_LUN_BMC,
+ (ics[i].ping_sequence_number_counter % (IPMI_RQ_SEQ_MAX + 1)),
+ obj_lan_msg_hdr) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_lan_msg_hdr: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_cmd_get_channel_authentication_capabilities (IPMI_CHANNEL_NUMBER_CURRENT_CHANNEL,
+ IPMI_PRIVILEGE_LEVEL_USER,
+ IPMI_GET_IPMI_V15_DATA,
+ obj_cmd) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_cmd_get_channel_authentication_capabilities: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if ((len = assemble_ipmi_lan_pkt (obj_rmcp_hdr,
+ obj_lan_session_hdr,
+ obj_lan_msg_hdr,
+ obj_cmd,
+ NULL,
+ 0,
+ buf,
+ IPMIPOWER_PACKET_BUFLEN,
+ IPMI_INTERFACE_FLAGS_DEFAULT)) < 0)
+ {
+ IPMIPOWER_ERROR (("assemble_ipmi_lan_pkt: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
- if (!(rmcp_ping = fiid_obj_create (tmpl_cmd_asf_presence_ping)))
- {
- IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
-
- if (fill_rmcp_hdr_asf (rmcp_hdr) < 0)
- {
- IPMIPOWER_ERROR (("fill_rmcp_hdr_asf: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
-
- if (fill_cmd_asf_presence_ping ((ics[i].ping_sequence_number_counter %
- (RMCP_ASF_MESSAGE_TAG_MAX + 1)),
- rmcp_ping) < 0)
- {
- IPMIPOWER_ERROR (("fill_cmd_asf_presence_ping: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
+#ifndef NDEBUG
+ if (cmd_args.rmcpdump)
+ {
+ char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
+ const char *str_cmd = NULL;
+
+ str_cmd = ipmi_cmd_str (IPMI_NET_FN_APP_RQ, IPMI_CMD_GET_CHANNEL_AUTHENTICATION_CAPABILITIES);
+
+ debug_hdr_str (DEBUG_UTIL_TYPE_IPMI_1_5,
+ DEBUG_UTIL_DIRECTION_REQUEST,
+ DEBUG_UTIL_FLAGS_DEFAULT,
+ str_cmd,
+ hdrbuf,
+ DEBUG_UTIL_HDR_BUFLEN);
+
+ if (ipmi_dump_lan_packet (STDERR_FILENO,
+ ics[i].hostname,
+ hdrbuf,
+ NULL,
+ buf,
+ len,
+ tmpl_lan_msg_hdr_rq,
+ tmpl_cmd_get_channel_authentication_capabilities_rq) < 0)
+ IPMIPOWER_DEBUG (("ipmi_dump_lan_packet: %s", strerror (errno)));
+ }
+#endif /* NDEBUG */
- if ((len = assemble_rmcp_pkt (rmcp_hdr,
- rmcp_ping,
- buf,
- IPMIPOWER_PACKET_BUFLEN,
- IPMI_INTERFACE_FLAGS_DEFAULT)) < 0)
- {
- IPMIPOWER_ERROR (("assemble_rmcp_pkt: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
+ fiid_obj_destroy (obj_rmcp_hdr);
+ fiid_obj_destroy (obj_lan_session_hdr);
+ fiid_obj_destroy (obj_lan_msg_hdr);
+ fiid_obj_destroy (obj_cmd);
+ }
+ else /* !IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING */
+ {
+ fiid_obj_t rmcp_hdr = NULL;
+ fiid_obj_t rmcp_ping = NULL;
+
+ if (!(rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(rmcp_ping = fiid_obj_create (tmpl_cmd_asf_presence_ping)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_rmcp_hdr_asf (rmcp_hdr) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_rmcp_hdr_asf: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (fill_cmd_asf_presence_ping ((ics[i].ping_sequence_number_counter %
+ (RMCP_ASF_MESSAGE_TAG_MAX + 1)),
+ rmcp_ping) < 0)
+ {
+ IPMIPOWER_ERROR (("fill_cmd_asf_presence_ping: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if ((len = assemble_rmcp_pkt (rmcp_hdr,
+ rmcp_ping,
+ buf,
+ IPMIPOWER_PACKET_BUFLEN,
+ IPMI_INTERFACE_FLAGS_DEFAULT)) < 0)
+ {
+ IPMIPOWER_ERROR (("assemble_rmcp_pkt: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
#ifndef NDEBUG
- if (cmd_args.rmcpdump)
- {
- char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
-
- debug_hdr_str (DEBUG_UTIL_TYPE_NONE,
- DEBUG_UTIL_DIRECTION_NONE,
- DEBUG_UTIL_FLAGS_DEFAULT,
- DEBUG_UTIL_RMCPPING_STR,
- hdrbuf,
- DEBUG_UTIL_HDR_BUFLEN);
-
- if (ipmi_dump_rmcp_packet (STDERR_FILENO,
- ics[i].hostname,
- hdrbuf,
- NULL,
- buf,
- len,
- tmpl_cmd_asf_presence_ping) < 0)
- IPMIPOWER_DEBUG (("ipmi_dump_rmcp_packet: %s", strerror (errno)));
- }
+ if (cmd_args.rmcpdump)
+ {
+ char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
+
+ debug_hdr_str (DEBUG_UTIL_TYPE_NONE,
+ DEBUG_UTIL_DIRECTION_NONE,
+ DEBUG_UTIL_FLAGS_DEFAULT,
+ DEBUG_UTIL_RMCPPING_STR,
+ hdrbuf,
+ DEBUG_UTIL_HDR_BUFLEN);
+
+ if (ipmi_dump_rmcp_packet (STDERR_FILENO,
+ ics[i].hostname,
+ hdrbuf,
+ NULL,
+ buf,
+ len,
+ tmpl_cmd_asf_presence_ping) < 0)
+ IPMIPOWER_DEBUG (("ipmi_dump_rmcp_packet: %s", strerror (errno)));
+ }
#endif /* NDEBUG */
+ fiid_obj_destroy (rmcp_hdr);
+ fiid_obj_destroy (rmcp_ping);
+ } /* !IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING */
+
if ((ret = cbuf_write (ics[i].ping_out, buf, len, &dropped)) < 0)
{
IPMIPOWER_ERROR (("cbuf_write: %s", strerror (errno)));
@@ -221,9 +348,6 @@
if (cmd_args.ping_packet_count && cmd_args.ping_percent)
ics[i].ping_packet_count_send++;
-
- fiid_obj_destroy (rmcp_hdr);
- fiid_obj_destroy (rmcp_ping);
}
/* Did we receive something? */
@@ -231,129 +355,256 @@
len = ipmipower_cbuf_peek_and_drop (ics[i].ping_in, buf, IPMIPOWER_PACKET_BUFLEN);
if (len > 0)
{
- fiid_obj_t rmcp_hdr = NULL;
- fiid_obj_t rmcp_pong = NULL;
- uint8_t message_type, ipmi_supported;
+ uint8_t message_type = 0, ipmi_supported = 0;
uint64_t val;
- if (!(rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
- {
- IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
-
- if (!(rmcp_pong = fiid_obj_create (tmpl_cmd_asf_presence_pong)))
- {
- IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
+ /* Workaround
+ *
+ * Some motherboards don't support RMCP ping/pong :-(
+ *
+ * Discovered on Intel Windmill, Quanta Winterfell, and Wiwynn Windmill
+ */
+ if (cmd_args.common_args.section_specific_workaround_flags & IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING)
+ {
+ fiid_obj_t obj_rmcp_hdr = NULL;
+ fiid_obj_t obj_lan_session_hdr = NULL;
+ fiid_obj_t obj_lan_msg_hdr = NULL;
+ fiid_obj_t obj_cmd = NULL;
+ fiid_obj_t obj_lan_msg_trlr = NULL;
+ int checksum_ret = 0;
+ int unassemble_ret = 0;
+ int cmd_ret = 0;
+
+ if (!(obj_rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_lan_session_hdr = fiid_obj_create (tmpl_lan_session_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_lan_msg_hdr = fiid_obj_create (tmpl_lan_msg_hdr_rs)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_cmd = fiid_obj_create (tmpl_cmd_get_channel_authentication_capabilities_rs)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(obj_lan_msg_trlr = fiid_obj_create (tmpl_lan_msg_trlr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
#ifndef NDEBUG
- if (cmd_args.rmcpdump)
- {
- char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
-
- debug_hdr_str (DEBUG_UTIL_TYPE_NONE,
- DEBUG_UTIL_DIRECTION_NONE,
- DEBUG_UTIL_FLAGS_DEFAULT,
- DEBUG_UTIL_RMCPPING_STR,
- hdrbuf,
- DEBUG_UTIL_HDR_BUFLEN);
-
- if (ipmi_dump_rmcp_packet (STDERR_FILENO,
- ics[i].hostname,
- hdrbuf,
- NULL,
- buf,
- len,
- tmpl_cmd_asf_presence_pong) < 0)
- IPMIPOWER_DEBUG (("ipmi_dump_rmcp_packet: %s", strerror (errno)));
- }
+ if (cmd_args.rmcpdump)
+ {
+ char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
+ const char *str_cmd = NULL;
+
+ str_cmd = ipmi_cmd_str (IPMI_NET_FN_APP_RQ, IPMI_CMD_GET_CHANNEL_AUTHENTICATION_CAPABILITIES);
+
+ debug_hdr_str (DEBUG_UTIL_TYPE_IPMI_1_5,
+ DEBUG_UTIL_DIRECTION_RESPONSE,
+ DEBUG_UTIL_FLAGS_DEFAULT,
+ str_cmd,
+ hdrbuf,
+ DEBUG_UTIL_HDR_BUFLEN);
+
+ if (ipmi_dump_lan_packet (STDERR_FILENO,
+ ics[i].hostname,
+ hdrbuf,
+ NULL,
+ buf,
+ len,
+ tmpl_lan_msg_hdr_rs,
+ tmpl_cmd_get_channel_authentication_capabilities_rs) < 0)
+ IPMIPOWER_DEBUG (("ipmi_dump_lan_packet: %s", strerror (errno)));
+ }
#endif /* NDEBUG */
- if ((ret = unassemble_rmcp_pkt (buf,
- len,
- rmcp_hdr,
- rmcp_pong,
- IPMI_INTERFACE_FLAGS_DEFAULT)) < 0)
- {
- IPMIPOWER_ERROR (("unassemble_rmcp_pkt: %s", strerror (errno)));
- exit (EXIT_FAILURE);
- }
+ if ((checksum_ret = ipmi_lan_check_packet_checksum (buf, len)) < 0)
+ {
+ IPMIPOWER_ERROR (("ipmi_lan_check_packet_checksum: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (checksum_ret
+ && ((unassemble_ret = unassemble_ipmi_lan_pkt (buf,
+ len,
+ obj_rmcp_hdr,
+ obj_lan_session_hdr,
+ obj_lan_msg_hdr,
+ obj_cmd,
+ obj_lan_msg_trlr,
+ IPMI_INTERFACE_FLAGS_DEFAULT)) < 0))
+ {
+ IPMIPOWER_ERROR (("unassemble_ipmi_lan_pkt: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ /* achu: check for cmd type, but don't bother checking
+ * sequence numbers or completion code. The fact it
+ * returns is sufficient. We just need to make sure we
+ * get something back from the BMC to ensure the machine
+ * is still there.
+ */
+
+ if (checksum_ret
+ && unassemble_ret
+ && ((cmd_ret = ipmi_check_cmd (obj_cmd, IPMI_CMD_GET_CHANNEL_AUTHENTICATION_CAPABILITIES)) < 0))
+ {
+ IPMIPOWER_ERROR (("ipmi_check_cmd: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (checksum_ret && unassemble_ret && cmd_ret)
+ {
+ /* We'll say this is equivalent to what pong response from RMCP */
+ message_type = RMCP_ASF_MESSAGE_TYPE_PRESENCE_PONG;
+ ipmi_supported = 1;
+ }
+
+ fiid_obj_destroy (obj_rmcp_hdr);
+ fiid_obj_destroy (obj_lan_session_hdr);
+ fiid_obj_destroy (obj_lan_msg_hdr);
+ fiid_obj_destroy (obj_cmd);
+ fiid_obj_destroy (obj_lan_msg_trlr);
+ }
+ else /* !IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING */
+ {
+ fiid_obj_t rmcp_hdr = NULL;
+ fiid_obj_t rmcp_pong = NULL;
+
+ if (!(rmcp_hdr = fiid_obj_create (tmpl_rmcp_hdr)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (!(rmcp_pong = fiid_obj_create (tmpl_cmd_asf_presence_pong)))
+ {
+ IPMIPOWER_ERROR (("fiid_obj_create: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
- if (ret)
- {
- /* achu: check for ipmi_support and pong type, but don't
- * check for message tag. On occassion, I have witnessed
- * BMCs send message tags "out of sync". For example, you
- * send 8, BMC returns 7. You send 9, BMC returns 8. We
- * really don't care if the BMC is out of sync. We just
- * need to make sure we get something back from the BMC to
- * ensure the machine is still there.
- */
-
- if (FIID_OBJ_GET (rmcp_pong,
- "message_type",
- &val) < 0)
- {
- IPMIPOWER_ERROR (("FIID_OBJ_GET: 'message_type': %s",
- fiid_obj_errormsg (rmcp_pong)));
- exit (EXIT_FAILURE);
- }
- message_type = val;
-
- if (FIID_OBJ_GET (rmcp_pong,
- "supported_entities.ipmi_supported",
- &val) < 0)
- {
- IPMIPOWER_ERROR (("FIID_OBJ_GET: 'supported_entities.ipmi_supported': %s",
- fiid_obj_errormsg (rmcp_pong)));
- exit (EXIT_FAILURE);
- }
- ipmi_supported = val;
-
- if (message_type == RMCP_ASF_MESSAGE_TYPE_PRESENCE_PONG && ipmi_supported)
- {
- if (cmd_args.ping_packet_count && cmd_args.ping_percent)
- ics[i].ping_packet_count_recv++;
-
- if (cmd_args.ping_consec_count)
- {
- /* Don't increment twice, its possible a previous pong
- * response was late, and we quickly receive two
- * pong responses
- */
- if (!ics[i].ping_last_packet_recv_flag)
- ics[i].ping_consec_count++;
-
- ics[i].ping_last_packet_recv_flag++;
- }
-
- if (cmd_args.ping_packet_count && cmd_args.ping_percent)
- {
- if (ics[i].link_state == IPMIPOWER_LINK_STATE_GOOD)
- ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
- else
- {
- if (cmd_args.ping_consec_count
- && ics[i].ping_consec_count >= cmd_args.ping_consec_count)
- ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
- else
- ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_BADCONNECTION;
- }
- }
- else
- {
- ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
- }
- ics[i].last_ping_recv.tv_sec = cur_time.tv_sec;
- ics[i].last_ping_recv.tv_usec = cur_time.tv_usec;
-
- fiid_obj_destroy (rmcp_hdr);
- fiid_obj_destroy (rmcp_pong);
- }
- }
- }
+#ifndef NDEBUG
+ if (cmd_args.rmcpdump)
+ {
+ char hdrbuf[DEBUG_UTIL_HDR_BUFLEN];
+
+ debug_hdr_str (DEBUG_UTIL_TYPE_NONE,
+ DEBUG_UTIL_DIRECTION_NONE,
+ DEBUG_UTIL_FLAGS_DEFAULT,
+ DEBUG_UTIL_RMCPPING_STR,
+ hdrbuf,
+ DEBUG_UTIL_HDR_BUFLEN);
+
+ if (ipmi_dump_rmcp_packet (STDERR_FILENO,
+ ics[i].hostname,
+ hdrbuf,
+ NULL,
+ buf,
+ len,
+ tmpl_cmd_asf_presence_pong) < 0)
+ IPMIPOWER_DEBUG (("ipmi_dump_rmcp_packet: %s", strerror (errno)));
+ }
+#endif /* NDEBUG */
+
+ if ((ret = unassemble_rmcp_pkt (buf,
+ len,
+ rmcp_hdr,
+ rmcp_pong,
+ IPMI_INTERFACE_FLAGS_DEFAULT)) < 0)
+ {
+ IPMIPOWER_ERROR (("unassemble_rmcp_pkt: %s", strerror (errno)));
+ exit (EXIT_FAILURE);
+ }
+
+ if (ret)
+ {
+ /* achu: check for ipmi_support and pong type, but don't
+ * check for message tag. On occassion, I have witnessed
+ * BMCs send message tags "out of sync". For example, you
+ * send 8, BMC returns 7. You send 9, BMC returns 8. We
+ * really don't care if the BMC is out of sync. We just
+ * need to make sure we get something back from the BMC to
+ * ensure the machine is still there.
+ */
+
+ if (FIID_OBJ_GET (rmcp_pong,
+ "message_type",
+ &val) < 0)
+ {
+ IPMIPOWER_ERROR (("FIID_OBJ_GET: 'message_type': %s",
+ fiid_obj_errormsg (rmcp_pong)));
+ exit (EXIT_FAILURE);
+ }
+ message_type = val;
+
+ if (FIID_OBJ_GET (rmcp_pong,
+ "supported_entities.ipmi_supported",
+ &val) < 0)
+ {
+ IPMIPOWER_ERROR (("FIID_OBJ_GET: 'supported_entities.ipmi_supported': %s",
+ fiid_obj_errormsg (rmcp_pong)));
+ exit (EXIT_FAILURE);
+ }
+ ipmi_supported = val;
+ }
+
+ fiid_obj_destroy (rmcp_hdr);
+ fiid_obj_destroy (rmcp_pong);
+ }
+
+ if (message_type == RMCP_ASF_MESSAGE_TYPE_PRESENCE_PONG && ipmi_supported)
+ {
+ if (cmd_args.ping_packet_count && cmd_args.ping_percent)
+ ics[i].ping_packet_count_recv++;
+
+ if (cmd_args.ping_consec_count)
+ {
+ /* Don't increment twice, its possible a previous pong
+ * response was late, and we quickly receive two
+ * pong responses
+ */
+ if (!ics[i].ping_last_packet_recv_flag)
+ ics[i].ping_consec_count++;
+
+ ics[i].ping_last_packet_recv_flag++;
+ }
+
+ if (cmd_args.ping_packet_count && cmd_args.ping_percent)
+ {
+ if (ics[i].link_state == IPMIPOWER_LINK_STATE_GOOD)
+ ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
+ else
+ {
+ if (cmd_args.ping_consec_count
+ && ics[i].ping_consec_count >= cmd_args.ping_consec_count)
+ ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
+ else
+ ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_BADCONNECTION;
+ }
+ }
+ else
+ {
+ ics[i].discover_state = IPMIPOWER_DISCOVER_STATE_DISCOVERED;
+ }
+ ics[i].last_ping_recv.tv_sec = cur_time.tv_sec;
+ ics[i].last_ping_recv.tv_usec = cur_time.tv_usec;
+
+ }
+ } /* !IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING */
/* Is the node gone?? */
timeval_sub (&cur_time, &ics[i].last_ping_recv, &result);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/ipmipower/ipmipower_prompt.c new/freeipmi-1.4.3/ipmipower/ipmipower_prompt.c
--- old/freeipmi-1.4.1/ipmipower/ipmipower_prompt.c 2014-03-03 20:36:01.000000000 +0100
+++ new/freeipmi-1.4.3/ipmipower/ipmipower_prompt.c 2014-03-20 00:02:25.000000000 +0100
@@ -394,7 +394,7 @@
}
else
ipmipower_cbuf_printf (ttyout,
- "workaround_flags must be specified: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
+ "workaround_flags must be specified: %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",
IPMI_PARSE_WORKAROUND_FLAGS_NONE_STR,
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_AUTHENTICATION_CAPABILITIES_STR,
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_NO_CHECKSUM_CHECK_STR,
@@ -407,7 +407,8 @@
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_SUPERMICRO_2_0_SESSION_STR,
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_SUN_2_0_SESSION_STR,
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_OPEN_SESSION_PRIVILEGE_STR,
- IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_NON_EMPTY_INTEGRITY_CHECK_VALUE_STR);
+ IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_NON_EMPTY_INTEGRITY_CHECK_VALUE_STR,
+ IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING_STR);
}
static void
@@ -1003,6 +1004,11 @@
IPMI_PARSE_WORKAROUND_FLAGS_OUTOFBAND_2_0_NO_CHECKSUM_CHECK_STR,
&is_first);
#endif
+ _workarounds_strcat (strbuf,
+ cmd_args.common_args.workaround_flags_outofband_2_0,
+ IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING,
+ IPMI_PARSE_SECTION_SPECIFIC_WORKAROUND_FLAGS_IPMIPING_STR,
+ &is_first);
ipmipower_cbuf_printf (ttyout,
"WorkaroundFlags: %s\n",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/libfreeipmi/include/freeipmi/spec/ipmi-oem-spec.h new/freeipmi-1.4.3/libfreeipmi/include/freeipmi/spec/ipmi-oem-spec.h
--- old/freeipmi-1.4.1/libfreeipmi/include/freeipmi/spec/ipmi-oem-spec.h 2014-03-03 20:35:52.000000000 +0100
+++ new/freeipmi-1.4.3/libfreeipmi/include/freeipmi/spec/ipmi-oem-spec.h 2014-03-13 16:12:58.000000000 +0100
@@ -2349,6 +2349,26 @@
#define IPMI_OEM_SUPERMICRO_BMC_SERVICES_STATUS_DISABLED 0x00
#define IPMI_OEM_SUPERMICRO_BMC_SERVICES_STATUS_ENABLED 0x01
+/*
+ * Supermicro X8DTU, X8STi, X9DRW
+ */
+
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_CHANNEL 0x07
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS1 0x70
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS2 0x72
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_PS3 0x74
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_MAGIC 0x0C
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_GOOD 0x01
+#define IPMI_OEM_SUPERMICRO_GET_POWER_SUPPLY_STATUS_BAD 0x00
+
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_CHANNEL 0x07
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS1 0x78
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS2 0x7A
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_PS3 0x7C
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_MAGIC 0x78
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_GOOD 0x01
+#define IPMI_OEM_SUPERMICRO_GET_PMBUS_POWER_SUPPLY_STATUS_BAD 0x00
+
/*******************************************
* Wistron *
*******************************************/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/libfreeipmi/interpret/ipmi-interpret.c new/freeipmi-1.4.3/libfreeipmi/interpret/ipmi-interpret.c
--- old/freeipmi-1.4.1/libfreeipmi/interpret/ipmi-interpret.c 2014-03-03 20:35:57.000000000 +0100
+++ new/freeipmi-1.4.3/libfreeipmi/interpret/ipmi-interpret.c 2014-03-19 16:37:36.000000000 +0100
@@ -509,9 +509,9 @@
(*sel_state) = IPMI_INTERPRET_STATE_UNKNOWN;
i = 0;
- while (sel_config[i]
- && i < offset_from_event_reading_type_code
- && i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET)
+ while (i < offset_from_event_reading_type_code
+ && i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET
+ && sel_config[i])
i++;
if (sel_config[i])
@@ -1025,7 +1025,7 @@
sensor_event_bitmask &= IPMI_INTERPRET_THRESHOLD_SENSOR_EVENT_BITMASK_MASK;
i = 0;
- while (sensor_config[i] && i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET)
+ while (i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET && sensor_config[i])
{
if ((!i && !sensor_event_bitmask)
|| (sensor_event_bitmask & (0x1 << (i - 1))))
@@ -1128,7 +1128,7 @@
sensor_event_bitmask_tmp &= ~(0x1 << IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET);
i = 0;
- while (sensor_config[i] && i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET)
+ while (i < IPMI_INTERPRET_MAX_SENSOR_AND_EVENT_OFFSET && sensor_config[i])
{
if ((!i && !sensor_event_bitmask_tmp)
|| (sensor_event_bitmask_tmp & (0x1 << (i - 1))))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/man/freeipmi.conf.5.pre.in new/freeipmi-1.4.3/man/freeipmi.conf.5.pre.in
--- old/freeipmi-1.4.1/man/freeipmi.conf.5.pre.in 2014-03-03 20:35:59.000000000 +0100
+++ new/freeipmi-1.4.3/man/freeipmi.conf.5.pre.in 2014-03-20 00:02:25.000000000 +0100
@@ -123,7 +123,8 @@
solchannelsupport, serialalertsdeferred, solpacketseq, skipchecks,
assumesystemevent, discretereading, ignorescanningdisabled,
assumebmcowner, ignoreauthcode, slowcommit, veryslowcommit,
-solchannelassumelanchannel, ignorestateflag, malformedack,guidformat.
+solchannelassumelanchannel, ignorestateflag, malformedack, guidformat,
+ipmiping.
.SH "SDR OPTIONS"
The following options are specific to tools that use the sensor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/man/ipmi-oem.8.pre.in new/freeipmi-1.4.3/man/ipmi-oem.8.pre.in
--- old/freeipmi-1.4.1/man/ipmi-oem.8.pre.in 2014-03-03 20:35:59.000000000 +0100
+++ new/freeipmi-1.4.3/man/ipmi-oem.8.pre.in 2014-03-13 16:12:58.000000000 +0100
@@ -1138,6 +1138,18 @@
BMC. This command can be used to enable or disable non-IPMI services
such as ssh, http, https, and vnc. Command confirmed to work on
Supermicro X8DTG.
+.TP
+.B get-power-supply-status \fIps_num\fR
+This OEM command will get the status of a regular power supply.
+Presently, it can get the status of power supplies 1 through 3.
+Command confirmed to work on Supermicro X8DTU, Supermicro X8STi, and
+Supermicro X9DRW.
+.TP
+.B get-pmbus-power-supply-status \fIps_num\fR
+This OEM command will get the status of a PMBus based power supply.
+Presently, it can get the status of power supplies 1 through 3.
+Command confirmed to work on Supermicro X8DTU, Supermicro X8STi, and
+Supermicro X9DRW.
.RE
.TP
.B Wistron
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/freeipmi-1.4.1/man/ipmipower.8.pre.in new/freeipmi-1.4.3/man/ipmipower.8.pre.in
--- old/freeipmi-1.4.1/man/ipmipower.8.pre.in 2014-03-03 20:35:59.000000000 +0100
+++ new/freeipmi-1.4.3/man/ipmipower.8.pre.in 2014-03-20 00:02:25.000000000 +0100
@@ -479,6 +479,13 @@
#include <@top_srcdir@/man/manpage-common-workaround-outofband-common-text.man>
#include <@top_srcdir@/man/manpage-common-workaround-outofband-15-text.man>
#include <@top_srcdir@/man/manpage-common-workaround-outofband-20-text.man>
+.LP
+\fIipmiping\fR - This workaround option will inform
+.B ipmipower
+to use IPMI based ping packets instead of RMCP ping packets. Some
+motherboards have been observed to not implement RMCP ping/pong
+support despite being required by the IPMI specification. Issue
+observed on Intel Windmill, Quanta Winterfell, and Wiwynn Windmill.
#include <@top_srcdir@/man/manpage-common-workaround-extra-text.man>
#include <@top_srcdir@/man/manpage-common-diagnostics.man>
#include <@top_srcdir@/man/manpage-common-diagnostics-hostranged-text.man>
N§²æìržyéZ)z{.±ç(húéì¹»®&Þ¢§²ë¢ž¢¶v+b¢v¥rŠjwlzf¢^ˬyÊ&+~
éi¢§²ë¢ž