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
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to