diff --git a/include/ipmitool/Makefile.am b/include/ipmitool/Makefile.am index 925881e..5a9062c 100644 --- a/include/ipmitool/Makefile.am +++ b/include/ipmitool/Makefile.am @@ -38,5 +38,5 @@ noinst_HEADERS = log.h bswap.h hpm2.h helper.h ipmi.h ipmi_cc.h ipmi_intf.h \ ipmi_oem.h ipmi_sdradd.h ipmi_isol.h ipmi_sunoem.h ipmi_picmg.h \ ipmi_fwum.h ipmi_main.h ipmi_tsol.h ipmi_firewall.h \ ipmi_kontronoem.h ipmi_ekanalyzer.h ipmi_gendev.h ipmi_ime.h \ - ipmi_delloem.h ipmi_dcmi.h + ipmi_delloem.h ipmi_dcmi.h ipmi_vita.h diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h index f9f6592..6b6e247 100644 --- a/include/ipmitool/ipmi_intf.h +++ b/include/ipmitool/ipmi_intf.h @@ -168,6 +168,7 @@ struct ipmi_intf { int abort; int noanswer; int picmg_avail; + int vita_avail; IPMI_OEM manufacturer_id; struct ipmi_session * session; diff --git a/include/ipmitool/ipmi_vita.h b/include/ipmitool/ipmi_vita.h new file mode 100644 index 0000000..71d471a --- /dev/null +++ b/include/ipmitool/ipmi_vita.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) Pigeon Point Systems. All right reserved + */ + +#ifndef _IPMI_VITA_H_ +#define _IPMI_VITA_H_ + +/* VITA 46.11 commands */ +#define VITA_GET_VSO_CAPABILITIES_CMD 0x00 +#define VITA_FRU_CONTROL_CMD 0x04 +#define VITA_GET_FRU_LED_PROPERTIES_CMD 0x05 +#define VITA_GET_LED_COLOR_CAPABILITIES_CMD 0x06 +#define VITA_SET_FRU_LED_STATE_CMD 0x07 +#define VITA_GET_FRU_LED_STATE_CMD 0x08 +#define VITA_SET_FRU_STATE_POLICY_BITS_CMD 0x0A +#define VITA_GET_FRU_STATE_POLICY_BITS_CMD 0x0B +#define VITA_SET_FRU_ACTIVATION_CMD 0x0C +#define VITA_GET_FRU_ADDRESS_INFO_CMD 0x40 + +/* VITA 46.11 site types */ +#define VITA_FRONT_VPX_MODULE 0x00 +#define VITA_POWER_ENTRY 0x01 +#define VITA_CHASSIS_FRU 0x02 +#define VITA_DEDICATED_CHMC 0x03 +#define VITA_FAN_TRAY 0x04 +#define VITA_FAN_TRAY_FILTER 0x05 +#define VITA_ALARM_PANEL 0x06 +#define VITA_XMC 0x07 +#define VITA_VPX_RTM 0x09 +#define VITA_FRONT_VME_MODULE 0x0A +#define VITA_FRONT_VXS_MODULE 0x0B +#define VITA_POWER_SUPPLY 0x0C +#define VITA_FRONT_VITA62_MODULE 0x0D +#define VITA_71_MODULE 0x0E +#define VITA_FMC 0x0F + + +#define GROUP_EXT_VITA 0x03 + +extern uint8_t +vita_discover(struct ipmi_intf *intf); + +extern uint8_t +ipmi_vita_ipmb_address(struct ipmi_intf *intf); + +extern int +ipmi_vita_main(struct ipmi_intf * intf, int argc, char ** argv); + +#endif /* _IPMI_VITA_H_ */ diff --git a/lib/Makefile.am b/lib/Makefile.am index d878b11..2a316db 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -39,7 +39,7 @@ libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.c \ ipmi_oem.c ipmi_isol.c ipmi_sunoem.c ipmi_fwum.c ipmi_picmg.c \ ipmi_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c \ ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \ - ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c \ + ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c ipmi_vita.c \ ../src/plugins/lan/md5.c ../src/plugins/lan/md5.h libipmitool_la_LDFLAGS = -export-dynamic diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index 26f3457..0f01001 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -344,6 +344,18 @@ ipmi_parse_hex(const char *str) return out; } +static uint8_t +ipmi_acquire_ipmb_address(struct ipmi_intf * intf) +{ + if (intf->picmg_avail) { + return ipmi_picmg_ipmb_address(intf); + } else if (intf->vita_avail) { + return ipmi_vita_ipmb_address(intf); + } else { + return 0; + } +} + /* ipmi_parse_options - helper function to handle parsing command line options * * @argc: count of options @@ -907,14 +919,22 @@ ipmi_main(int argc, char ** argv, } } /* - * Attempt picmg discovery of the actual interface address unless + * Attempt picmg/vita discovery of the actual interface address unless * the users specified an address. * Address specification always overrides discovery */ - if (picmg_discover(ipmi_main_intf) && !arg_addr) { - lprintf(LOG_DEBUG, "Running PICMG Get Address Info"); - addr = ipmi_picmg_ipmb_address(ipmi_main_intf); - lprintf(LOG_INFO, "Discovered IPMB-0 address 0x%x", addr); + if (picmg_discover(ipmi_main_intf)) { + ipmi_main_intf->picmg_avail = 1; + } else if (vita_discover(ipmi_main_intf)) { + ipmi_main_intf->vita_avail = 1; + } + + if (arg_addr) { + addr = arg_addr; + } else { + lprintf(LOG_DEBUG, "Acquire IPMB address"); + addr = ipmi_acquire_ipmb_address(ipmi_main_intf); + lprintf(LOG_INFO, "Discovered IPMB address 0x%x", addr); } /* @@ -956,7 +976,7 @@ ipmi_main(int argc, char ** argv, ipmi_intf_session_set_privlvl(ipmi_main_intf, IPMI_SESSION_PRIV_ADMIN); /* Get the ipmb address of the targeted entity */ ipmi_main_intf->target_ipmb_addr = - ipmi_picmg_ipmb_address(ipmi_main_intf); + ipmi_acquire_ipmb_address(ipmi_main_intf); lprintf(LOG_DEBUG, "Specified addressing Target %#x:%#x Transit %#x:%#x", ipmi_main_intf->target_addr, ipmi_main_intf->target_channel, diff --git a/lib/ipmi_picmg.c b/lib/ipmi_picmg.c index 914d11d..9dfa0d1 100644 --- a/lib/ipmi_picmg.c +++ b/lib/ipmi_picmg.c @@ -2325,37 +2325,39 @@ picmg_discover(struct ipmi_intf *intf) { struct ipmi_rq req; struct ipmi_rs *rsp; char msg_data; + uint8_t picmg_avail = 0; - if (intf->picmg_avail == 0) { - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_PICMG; - req.msg.cmd = PICMG_GET_PICMG_PROPERTIES_CMD; - msg_data = 0x00; - req.msg.data = &msg_data; - req.msg.data_len = 1; - msg_data = 0; + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_PICMG; + req.msg.cmd = PICMG_GET_PICMG_PROPERTIES_CMD; + msg_data = 0x00; + req.msg.data = &msg_data; + req.msg.data_len = 1; + msg_data = 0; - lprintf(LOG_DEBUG, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", - intf->my_addr, intf->transit_addr, intf->target_addr); - rsp = intf->sendrecv(intf, &req); - if (rsp && !rsp->ccode) { - if ( (rsp->data[0] == 0) && - ((rsp->data[1] & 0x0F) == PICMG_ATCA_MAJOR_VERSION - || (rsp->data[1] & 0x0F) == PICMG_AMC_MAJOR_VERSION) ) { - intf->picmg_avail = 1; - lprintf(LOG_DEBUG, "Discovered PICMG Extension %d.%d", - (rsp->data[1] & 0x0f), (rsp->data[1] >> 4)); - } - } else { - if (rsp == NULL) { - lprintf(LOG_DEBUG,"No Response from Get PICMG Properties"); - } else { - lprintf(LOG_DEBUG,"Error Response %#x from Get PICMG Properities", rsp->ccode); - } - } + lprintf(LOG_INFO, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", + intf->my_addr, intf->transit_addr, intf->target_addr); + rsp = intf->sendrecv(intf, &req); + if (rsp == NULL) { + lprintf(LOG_INFO,"No response from Get PICMG Properties"); + } else if (rsp->ccode != 0) { + lprintf(LOG_INFO,"Error response %#x from Get PICMG Properities", + rsp->ccode); + } else if (rsp->data_len < 4) { + lprintf(LOG_INFO,"Invalid Get PICMG Properties response length %d", + rsp->data_len); + } else if (rsp->data[0] != 0) { + lprintf(LOG_INFO,"Invalid Get PICMG Properties group extension %#x", + rsp->data[0]); + } else if ((rsp->data[1] & 0x0F) != PICMG_ATCA_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_AMC_MAJOR_VERSION) { + lprintf(LOG_INFO,"Unknown PICMG Extension Version %d.%d", + (rsp->data[1] & 0x0F), (rsp->data[1] >> 4)); + } else { + picmg_avail = 1; + lprintf(LOG_INFO, "Discovered PICMG Extension Version %d.%d", + (rsp->data[1] & 0x0f), (rsp->data[1] >> 4)); } - if (intf->picmg_avail == 0) { - lprintf(LOG_DEBUG, "No PICMG Extenstion discovered"); - } - return intf->picmg_avail; + + return picmg_avail; } diff --git a/lib/ipmi_vita.c b/lib/ipmi_vita.c new file mode 100644 index 0000000..4f8b522 --- /dev/null +++ b/lib/ipmi_vita.c @@ -0,0 +1,1006 @@ +/* + * Copyright (c) 2014 Pigeon Point Systems. All right reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistribution 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. + * + * Neither the name of Pigeon Point Systems, or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS, " without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. + * PIGEON POINT SYSTEMS ("PPS") AND ITS LICENSORS SHALL NOT BE LIABLE + * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING + * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL + * PPS OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, + * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF + * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, + * EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + + +#include +#include +#include +#include +#include +#include + +/* Handled VITA 46.11 commands */ +#define VITA_CMD_HELP 0 +#define VITA_CMD_PROPERTIES 1 +#define VITA_CMD_FRUCONTROL 2 +#define VITA_CMD_ADDRINFO 3 +#define VITA_CMD_ACTIVATE 4 +#define VITA_CMD_DEACTIVATE 5 +#define VITA_CMD_POLICY_GET 6 +#define VITA_CMD_POLICY_SET 7 +#define VITA_CMD_LED_PROP 8 +#define VITA_CMD_LED_CAP 9 +#define VITA_CMD_LED_GET 10 +#define VITA_CMD_LED_SET 11 +#define VITA_CMD_UNKNOWN 255 + +/* VITA 46.11 Site Type strings */ +static struct valstr vita_site_types[] = { + { VITA_FRONT_VPX_MODULE, "Front Loading VPX Plug-In Module" }, + { VITA_POWER_ENTRY, "Power Entry Module" }, + { VITA_CHASSIS_FRU, "Chassic FRU Information Module" }, + { VITA_DEDICATED_CHMC, "Dedicated Chassis Manager" }, + { VITA_FAN_TRAY, "Fan Tray" }, + { VITA_FAN_TRAY_FILTER, "Fan Tray Filter" }, + { VITA_ALARM_PANEL, "Alarm Panel" }, + { VITA_XMC, "XMC" }, + { VITA_VPX_RTM, "VPX Rear Transition Module" }, + { VITA_FRONT_VME_MODULE, "Front Loading VME Plug-In Module" }, + { VITA_FRONT_VXS_MODULE, "Front Loading VXS Plug-In Module" }, + { VITA_POWER_SUPPLY, "Power Supply" }, + { VITA_FRONT_VITA62_MODULE, "Front Loading VITA 62 Module\n" }, + { VITA_71_MODULE, "VITA 71 Module\n" }, + { VITA_FMC, "FMC\n" }, + { 0, NULL } +}; + +/* VITA 46.11 command help strings */ +static struct valstr vita_help_strings[] = { + { + VITA_CMD_HELP, + "VITA commands:\n" + " properties - get VSO properties\n" + " frucontrol - FRU control\n" + " addrinfo - get address information\n" + " activate - activate a FRU\n" + " deactivate - deactivate a FRU\n" + " policy get - get the FRU activation policy\n" + " policy set - set the FRU activation policy\n" + " led prop - get led properties\n" + " led cap - get led color capabilities\n" + " led get - get led state\n" + " led set - set led state" + }, + { + VITA_CMD_FRUCONTROL, + "usage: frucontrol