The Peppercon BMCs as used in the Supermicro motherboards have an
extended version string for the firmware version. This patch provides a
peppercon OEM report which has the details of the fields of the
firmware. This is needed to be able to find the different versions of
code which all report the same version.release numbers to ipmitool mc info.
For example,
# ipmitool mc info
Device ID : 34
Device Revision : 1
Firmware Revision : 1.59
# ipmitool pepperconoem firmware show
Firmware Version : 1.59.12
Firmware Build Number : 5420
Firmware ID : 34
Firmware Tag : Jan-05-2008-10-15-NoWeb-NoVM
I have submitted a patch for src/ipmitool.c and two new files (so it is
consistent with other oem source)
Index: src/ipmitool.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/src/ipmitool.c,v
retrieving revision 1.69
diff -u -p -r1.69 ipmitool.c
--- src/ipmitool.c 17 Sep 2008 19:58:57 -0000 1.69
+++ src/ipmitool.c 2 Mar 2009 12:06:00 -0000
@@ -56,6 +56,7 @@
#include <ipmitool/ipmi_pef.h>
#include <ipmitool/ipmi_oem.h>
#include <ipmitool/ipmi_sunoem.h>
+#include <ipmitool/ipmi_pepperconoem.h>
#include <ipmitool/ipmi_fwum.h>
#include <ipmitool/ipmi_picmg.h>
#include <ipmitool/ipmi_kontronoem.h>
@@ -101,6 +102,7 @@ struct ipmi_cmd ipmitool_cmd_list[] = {
{ ipmi_channel_main, "channel", "Configure Management Controller
channels" },
{ ipmi_session_main, "session", "Print session information" },
{ ipmi_sunoem_main, "sunoem", "OEM Commands for Sun servers" },
+ { ipmi_pepperconoem_main, "pepperconoem", "OEM Commands for
Peppercon AG BMCs" },
{ ipmi_kontronoem_main, "kontronoem", "OEM Commands for Kontron
devices"},
{ ipmi_picmg_main, "picmg", "Run a PICMG/ATCA extended cmd"},
{ ipmi_fwum_main, "fwum", "Update IPMC using Kontron OEM
Firmware Update Manager" },
Two new files are required (I do not know how to generate these from patch)
$ cat include/ipmitool/ipmi_pepperconoem.h
#ifndef IPMI_PEPPERCONOEM_H
#define IPMI_PEPPERCONOEM_H
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <ipmitool/ipmi.h>
#include <ipmitool/ipmi_sdr.h>
#define IPMI_NETFN_PEPPERCONOEM 0x3c
#define IPMI_PEPPERCONOEM_FIRMWARE_SHOW 0x20
int ipmi_pepperconoem_main(struct ipmi_intf *, int, char **);
#endif /*IPMI_PEPPERCONOEM_H*/
and
cat lib/ipmi_peppercon.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#include <ipmitool/ipmi.h>
#include <ipmitool/ipmi_intf.h>
#include <ipmitool/helper.h>
#include <ipmitool/log.h>
#include <ipmitool/ipmi_sel.h>
#include <ipmitool/ipmi_sdr.h>
#include <ipmitool/ipmi_strings.h>
#include <ipmitool/ipmi_channel.h>
#include <ipmitool/ipmi_pepperconoem.h>
#include <ipmitool/ipmi_raw.h>
static void
ipmi_pepperconoem_usage(void)
{
lprintf(LOG_NOTICE, "usage: pepperconoem <command> [option...]");
lprintf(LOG_NOTICE, "");
lprintf(LOG_NOTICE, " firmware show");
lprintf(LOG_NOTICE, " Show extended version information for
firmware level");
lprintf(LOG_NOTICE, "");
}
/*
* IPMI Request Data:
*
* None
*
* Returns
*
* (Byte 0-3) Firmware Version
* (Byte 4-7) Firmware Minor Version
* (Byte 8-11) Firmware Sub Version
* (Byte 12-15) Firmware Build Number
* (Byte 16) Hardware ID
* (Byte 17...) Tag (null terminated)
*
*/
static uint32_t get_firmware_uint(unsigned char *data) {
uint32_t firmware_uint=0;
firmware_uint+=*data++;
firmware_uint+=(*data++)<<8;
firmware_uint+=(*data++)<<16;
firmware_uint+=(*data++)<<24;
return firmware_uint;
}
static int
ipmi_pepperconoem_firmware_show(struct ipmi_intf * intf)
{
struct ipmi_rs * rsp;
struct ipmi_rq req;
int i;
req.msg.netfn = IPMI_NETFN_PEPPERCONOEM;
req.msg.cmd = IPMI_PEPPERCONOEM_FIRMWARE_SHOW;
req.msg.data = NULL;
req.msg.data_len = 0;
rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) {
lprintf(LOG_ERR, "Peppercon OEM show firmware command
failed");
return -1;
}
else if (rsp->ccode > 0) {
lprintf(LOG_ERR, "Peppercon OEM show firmware command
failed: %s",
val2str(rsp->ccode, completion_code_vals));
return -1;
}
if (verbose == LOG_DEBUG){
/* print the raw response buffer */
for (i=0; i<rsp->data_len; i++) {
if (((i%16) == 0) && (i != 0))
printf("\n");
printf(" %2.2x", rsp->data[i]);
}
printf("\n");
}
uint32_t firmware_major_version=get_firmware_uint(&rsp->data[0]);
uint32_t firmware_minor_version=get_firmware_uint(&rsp->data[4]);
uint32_t firmware_sub_version =get_firmware_uint(&rsp->data[8]);
uint32_t firmware_build_number =get_firmware_uint(&rsp->data[12]);
uint8_t firmware_id=rsp->data[16];
char firmware_tag[129];
char *rsp_data_tag=&rsp->data[17];
/* 0x0 terminated string with the tag */
for (i=0;rsp_data_tag[i]!=0x0 && i<sizeof(firmware_tag)-1;++i) {
firmware_tag[i]=rsp_data_tag[i];
}
firmware_tag[i]=0;
printf("Firmware Version : %i.%i.%i\n",
firmware_major_version,firmware_minor_version,firmware_sub_version);
printf("Firmware Build Number : %i\n",
firmware_build_number);
printf("Firmware ID : %i\n",
firmware_id);
printf("Firmware Tag : %s\n",
firmware_tag);
return 0;
}
int
ipmi_pepperconoem_main(struct ipmi_intf * intf, int argc, char ** argv)
{
int rc = 0;
if (argc == 0 || strncmp(argv[0], "help", 4) == 0) {
ipmi_pepperconoem_usage();
return 0;
}
if (strncmp(argv[0], "firmware", 8) == 0) {
if (argc < 2) {
ipmi_pepperconoem_usage();
return -1;
}
else if (strncmp(argv[1], "show", 4) == 0) {
rc = ipmi_pepperconoem_firmware_show(intf);
}
else {
ipmi_pepperconoem_usage();
return -1;
}
}
return rc;
}
------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Ipmitool-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel