--- ipmi-oem-dell.c.orig 2012-05-18 09:19:48.962028000 -0600 +++ ipmi-oem-dell.c 2012-05-21 11:58:55.617101000 -0600 @@ -374,6 +374,7 @@ #define IPMI_OEM_DELL_PORT_MAP_SLOT_MAPPING_1_2_OR_1_4 1 #define IPMI_OEM_DELL_PORT_MAP_SLOT_MAPPING_1_8 2 +#define IPMI_OEM_DELL_CMC_FIRMWARE_VERSION 0xDF /* Will call ipmi_cmd_get_system_info_parameters only once, b/c field * requested is defined by OEM to be < 16 bytes in length @@ -1797,6 +1798,94 @@ _output_dell_system_info_11g_or_12g_mac_ return (rv); } +static int +_get_dell_cmc_firmware_version (ipmi_oem_state_data_t *state_data) +{ + uint8_t bytes_rq[IPMI_OEM_MAX_BYTES]; + uint8_t bytes_rs[IPMI_OEM_MAX_BYTES]; + uint8_t bytes_read[4]; + int rs_len; + int rv = -1; + + assert (state_data); + assert (!state_data->prog_data->args->oem_options_count); + + /* Dell Poweredge OEM + * + * Ryan Cox: found by walking through addresses + * + * Get CMC Firmware Version + * + * 0x06 - OEM network function + * 0x59 - OEM cmd + * 0x00 + * 0xDF - CMC Info? + * 0x01 - set selector (0x00 contains at least the CMC IPv4 addr) + * 0x00 - block selector + * + * Get CMC Firmware Version Response + * + * 0x59 - OEM cmd + * 0x?? - Completion Code + * 0x11 - length + * 0x01 - set selector + * 0x00 - unknown + * 0x00 - unknown + * 0x00 - unknown + * 0x00 - unknown + * 0x?? - Firmware version char 0 + * 0x?? - Firmware version char 1 + * 0x?? - Firmware version char 2 + * 0x?? - Firmware version char 3 + * trailing 8 bytes: 0x00 - unknown + * + */ + + bytes_rq[0] = IPMI_CMD_GET_SYSTEM_INFO_PARAMETERS; + bytes_rq[1] = 0x00; + bytes_rq[2] = IPMI_OEM_DELL_CMC_FIRMWARE_VERSION; + bytes_rq[3] = 0x01; + bytes_rq[4] = 0x00; + + if ((rs_len = ipmi_cmd_raw (state_data->ipmi_ctx, + 0, /* lun */ + IPMI_NET_FN_APP_RQ, /* network function */ + 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(rs_len != 20) { + pstdout_fprintf (state_data->pstate, + stderr, + "dell:get-system-info 'cmc-firmware-version' option not supported on this system\n"); + goto cleanup; + } + + if (ipmi_oem_check_response_and_completion_code (state_data, + bytes_rs, + rs_len, + 20, + IPMI_OEM_DELL_CMC_FIRMWARE_VERSION, + IPMI_NET_FN_APP_RQ, + NULL) < 0) + goto cleanup; + + memcpy(bytes_read, &bytes_rs[8], 4); + pstdout_printf (state_data->pstate, "%s\n", bytes_read); + + rv = 0; + cleanup: + return (rv); +} + int ipmi_oem_dell_get_system_info (ipmi_oem_state_data_t *state_data) { @@ -1824,6 +1913,7 @@ ipmi_oem_dell_get_system_info (ipmi_oem_ "Option: idrac-info\n" "Option: idrac-ipv4-url\n" "Option: idrac-gui-webserver-control\n" + "Option: cmc-firmware-version\n" "Option: cmc-ipv4-url\n" "Option: cmc-ipv6-info\n" "Option: cmc-ipv6-url\n" @@ -1857,6 +1947,7 @@ ipmi_oem_dell_get_system_info (ipmi_oem_ && strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-info") && strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-ipv4-url") && strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-gui-webserver-control") + && strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-firmware-version") && strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv4-url") && strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv6-info") && strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv6-url") @@ -2197,6 +2288,11 @@ ipmi_oem_dell_get_system_info (ipmi_oem_ "%s\n", idrac_web_gui_server_control_str); } + else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-firmware-version")) + { + if (_get_dell_cmc_firmware_version (state_data) < 0) + goto cleanup; + } else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv4-url")) { if (_get_dell_system_info_long_string (state_data,