From 8ff094c6f4f628c0afcdb1515e894705739ccc0a Mon Sep 17 00:00:00 2001 From: Ales Ledvinka Date: Wed, 17 Oct 2012 16:09:19 +0200 Subject: [PATCH] support setting OS name and Hostname on BMC (#857878) --- ipmitool-cvs-mc-sysinfo-dell.patch | 1655 ++++++++++++++++++++++++++++ ipmitool.spec | 7 +- 2 files changed, 1661 insertions(+), 1 deletion(-) create mode 100644 ipmitool-cvs-mc-sysinfo-dell.patch diff --git a/ipmitool-cvs-mc-sysinfo-dell.patch b/ipmitool-cvs-mc-sysinfo-dell.patch new file mode 100644 index 0000000..7070717 --- /dev/null +++ b/ipmitool-cvs-mc-sysinfo-dell.patch @@ -0,0 +1,1655 @@ +--- ipmitool-1.8.12/doc/ipmitool.1 2012-05-17 10:52:35.000000000 -0500 ++++ ipmitool/doc/ipmitool.1 2012-08-13 13:48:38.000000000 -0500 +@@ -350,6 +350,30 @@ OEM\-Defined option #1 + .br + + OEM\-Defined option #2 ++ ++.RE ++.TP ++\fIgetsysinfo\fP <\fBargument\fP> ++Retrieves system info from bmc for given argument. ++.br ++See \fIsetsysinfo\fP for argument definitions ++.TP ++\fIsetsysinfo\fP <\fBargument\fP> <\fBstring\fP> ++Stores system info string to bmc for given argument ++.RS ++.TP ++Possible arguments are: ++.RS ++.TP ++\fIprimary_os_name\fP Primary Operating System Name ++.TP ++\fIos_name\fP Operating System Name ++.TP ++\fIsystem_name\fP System Name of Server ++.TP ++\fIdelloem_os_version\fP Running versin of operating system ++.TP ++\fIdelloem_URL\fP URL of BMC Webserver + .RE + .RE + .TP +--- ipmitool-1.8.12/lib/ipmi_delloem.c 2012-08-03 12:07:07.000000000 -0500 ++++ ipmitool/lib/ipmi_delloem.c 2012-08-14 12:46:30.000000000 -0500 +@@ -216,8 +216,6 @@ static int ipmi_print_power_consmpt_hist + static int ipmi_get_power_cap(struct ipmi_intf* intf,IPMI_POWER_CAP* ipmipowercap ); + static int ipmi_print_power_cap(struct ipmi_intf* intf,uint8_t unit ); + static int ipmi_set_power_cap(struct ipmi_intf* intf,int unit,int val ); +-static int getpowersupplyfruinfo(struct ipmi_intf *intf, uint8_t id, +- struct fru_header header, struct fru_info fru); + static void ipmi_powermonitor_usage(void); + + /* vFlash Function prototypes */ +@@ -663,45 +661,35 @@ ipmi_lcd_get_platform_model_name (struct + struct ipmi_rs * rsp = NULL; + struct ipmi_rq req = {0}; + uint8_t data[4]; +- IPMI_DELL_LCD_STRING * lcdstringblock; ++ IPMI_DELL_LCD_STRING lcdstringblock; + int lcdstring_len = 0; + int bytes_copied = 0; ++ int rc; + + int ii; + + for (ii = 0; ii < 4; ii++) + { + int bytes_to_copy; +- memset (&req,0,sizeof(req)); +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter*/ +- data[1] = field_type; +- data[2] = ii; +- data[3] = 0; +- + +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { ++ rc = ipmi_getsysinfo(intf, field_type, ii, 0, ++ sizeof(lcdstringblock), ++ &lcdstringblock); ++ if (rc < 0) { + lprintf(LOG_ERR, " Error getting platform model name"); +- } else if (rsp->ccode > 0) { ++ } else if (rc > 0) { + lprintf(LOG_ERR, " Error getting platform model name: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + } + +- lcdstringblock = (IPMI_DELL_LCD_STRING *) (void *) rsp->data; +- + /* first block is different - 14 bytes*/ + if (0 == ii) { +- lcdstring_len = lcdstringblock->lcd_string.selector_0_string.length; ++ lcdstring_len = lcdstringblock.lcd_string.selector_0_string.length; + + lcdstring_len = MIN (lcdstring_len,max_length); + + bytes_to_copy = MIN(lcdstring_len, IPMI_DELL_LCD_STRING1_SIZE); +- memcpy (lcdstring, lcdstringblock->lcd_string.selector_0_string.data, bytes_to_copy); ++ memcpy (lcdstring, lcdstringblock.lcd_string.selector_0_string.data, bytes_to_copy); + } else { + int string_offset; + +@@ -709,7 +697,7 @@ ipmi_lcd_get_platform_model_name (struct + if (bytes_to_copy < 1) + break; + string_offset = IPMI_DELL_LCD_STRING1_SIZE + IPMI_DELL_LCD_STRINGN_SIZE * (ii-1); +- memcpy (lcdstring+string_offset, lcdstringblock->lcd_string.selector_n_data, bytes_to_copy); ++ memcpy (lcdstring+string_offset, lcdstringblock.lcd_string.selector_n_data, bytes_to_copy); + } + + +@@ -737,37 +725,25 @@ ipmi_lcd_get_platform_model_name (struct + static int + ipmi_idracvalidator_command (struct ipmi_intf * intf) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- +- memset (&req,0,sizeof(req)); +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = IPMI_DELL_IDRAC_VALIDATOR; +- data[2] = 2; +- data[3] = 0; ++ int rc; ++ uint8_t data[11]; + +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_IDRAC_VALIDATOR, 2, 0, sizeof(data), data); ++ if (rc < 0) { + /*lprintf(LOG_ERR, " Error getting IMC type"); */ + return -1; +- } else if (rsp->ccode > 0) { ++ } else if (rc > 0) { + /*lprintf(LOG_ERR, " Error getting IMC type: %s", + val2str(rsp->ccode, completion_code_vals)); */ + return -1; + } + /* Support the 11G Monolithic, modular, Maisy and Coaster */ +- if( (IMC_IDRAC_11G_MONOLITHIC == rsp->data[10]) || (IMC_IDRAC_11G_MODULAR ==rsp->data[10]) || +- (IMC_MASER_LITE_BMC == rsp->data[10]) || (IMC_MASER_LITE_NU ==rsp->data[10]) ) ++ if( (IMC_IDRAC_11G_MONOLITHIC == data[10]) || (IMC_IDRAC_11G_MODULAR == data[10]) || ++ (IMC_MASER_LITE_BMC == data[10]) || (IMC_MASER_LITE_NU == data[10]) ) + { + iDRAC_FLAG=IDRAC_11G; + } +- else if( (IMC_IDRAC_12G_MONOLITHIC == rsp->data[10]) || (IMC_IDRAC_12G_MODULAR==rsp->data[10]) ) ++ else if( (IMC_IDRAC_12G_MONOLITHIC == data[10]) || (IMC_IDRAC_12G_MODULAR == data[10]) ) + { + iDRAC_FLAG=IDRAC_12G; + } +@@ -775,7 +751,7 @@ ipmi_idracvalidator_command (struct ipmi + { + iDRAC_FLAG=0; + } +- IMC_Type = rsp->data[10]; ++ IMC_Type = data[10]; + + return 0; + } +@@ -797,35 +773,20 @@ ipmi_idracvalidator_command (struct ipmi + static int + ipmi_lcd_get_configure_command_wh (struct ipmi_intf * intf) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; + uint8_t data[4]; ++ int rc; + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = IPMI_DELL_LCD_CONFIG_SELECTOR; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_CONFIG_SELECTOR, 0, 0, sizeof(lcd_mode), &lcd_mode); ++ if (rc < 0) { + lprintf(LOG_ERR, " Error getting LCD configuration"); + return -1; +- }else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)){ +- ++ } else if ((rc == 0xc1)||(rc == 0xcb)){ + lprintf(LOG_ERR, " Error getting LCD configuration: Command not supported on this system."); +- +- } else if (rsp->ccode > 0) { ++ } else if (rc > 0) { + lprintf(LOG_ERR, " Error getting LCD configuration: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } +- +- lcd_mode= *((LCD_MODE*)(rsp->data)); + return 0; + } + +@@ -846,40 +807,29 @@ static int + ipmi_lcd_get_configure_command (struct ipmi_intf * intf, + uint8_t *command) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; + uint8_t data[4]; ++ int rc; + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = IPMI_DELL_LCD_CONFIG_SELECTOR; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_CONFIG_SELECTOR, 0, 0, sizeof(data), data); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting LCD configuration"); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting LCD configuration: Command not supported on this system."); + return -1; + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error getting LCD configuration: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } + + /* rsp->data[0] is the rev */ +- *command = rsp->data[1]; ++ *command = data[1]; + + return 0; + } +@@ -900,35 +850,26 @@ static int + ipmi_lcd_set_configure_command (struct ipmi_intf * intf, int command) + { + #define LSCC_DATA_LEN 2 +- +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; + uint8_t data[2]; ++ int rc; + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_SET_SYS_INFO; +- req.msg.data_len = 2; +- req.msg.data = data; + data[0] = IPMI_DELL_LCD_CONFIG_SELECTOR; + data[1] = command; /* command - custom, default, none */ + +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_setsysinfo(intf, 2, data); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error setting LCD configuration"); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error setting LCD configuration: Command not supported on this system."); +- + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error setting LCD configuration: %s", +- val2str(rsp->ccode, completion_code_vals)); +- ++ val2str(rc, completion_code_vals)); + return -1; + } + +@@ -955,17 +896,10 @@ ipmi_lcd_set_configure_command_wh (struc + uint8_t errordisp) + { + #define LSCC_DATA_LEN 2 +- +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; + uint8_t data[13]; ++ int rc; + + ipmi_lcd_get_configure_command_wh(intf); +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_SET_SYS_INFO; +- req.msg.data_len = 13; +- req.msg.data = data; + data[0] = IPMI_DELL_LCD_CONFIG_SELECTOR; + + if(mode!=0xFF) +@@ -1016,20 +950,21 @@ ipmi_lcd_set_configure_command_wh (struc + { + data[11]=lcd_mode.error_display; + } +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ ++ rc = ipmi_setsysinfo(intf, 13, data); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error setting LCD configuration"); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error setting LCD configuration: Command not supported on this system."); + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error setting LCD configuration: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + + return -1; + } +@@ -1054,49 +989,34 @@ ipmi_lcd_set_configure_command_wh (struc + static int + ipmi_lcd_get_single_line_text (struct ipmi_intf * intf, char* lcdstring, uint8_t max_length) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- IPMI_DELL_LCD_STRING * lcdstringblock; ++ IPMI_DELL_LCD_STRING lcdstringblock; + int lcdstring_len = 0; + int bytes_copied = 0; +- int ii; ++ int ii, rc; + + for (ii = 0; ii < 4; ii++) { + int bytes_to_copy; + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter*/ +- data[1] = IPMI_DELL_LCD_STRING_SELECTOR; +- data[2] = ii; /* block selector*/ +- data[3] = 00; /* set selector (n/a)*/ +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STRING_SELECTOR, ii, 0, sizeof(lcdstringblock), &lcdstringblock); ++ if (rc < 0) { + lprintf(LOG_ERR, " Error getting text data"); + return -1; +- } else if (rsp->ccode > 0) { ++ } else if (rc > 0) { + lprintf(LOG_ERR, " Error getting text data: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } + +- lcdstringblock = (IPMI_DELL_LCD_STRING *) (void *) rsp->data; +- + /* first block is different - 14 bytes*/ + if (0 == ii) + { +- lcdstring_len = lcdstringblock->lcd_string.selector_0_string.length; ++ lcdstring_len = lcdstringblock.lcd_string.selector_0_string.length; + + if (lcdstring_len < 1 || lcdstring_len > max_length) + break; + + bytes_to_copy = MIN(lcdstring_len, IPMI_DELL_LCD_STRING1_SIZE); +- memcpy (lcdstring, lcdstringblock->lcd_string.selector_0_string.data, bytes_to_copy); ++ memcpy (lcdstring, lcdstringblock.lcd_string.selector_0_string.data, bytes_to_copy); + } + else + { +@@ -1106,7 +1026,7 @@ ipmi_lcd_get_single_line_text (struct ip + if (bytes_to_copy < 1) + break; + string_offset = IPMI_DELL_LCD_STRING1_SIZE + IPMI_DELL_LCD_STRINGN_SIZE * (ii-1); +- memcpy (lcdstring+string_offset, lcdstringblock->lcd_string.selector_n_data, bytes_to_copy); ++ memcpy (lcdstring+string_offset, lcdstringblock.lcd_string.selector_n_data, bytes_to_copy); + } + + bytes_copied += bytes_to_copy; +@@ -1130,14 +1050,10 @@ static int + ipmi_lcd_get_info_wh(struct ipmi_intf * intf) + + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- IPMI_DELL_LCD_CAPS* lcd_caps; ++ IPMI_DELL_LCD_CAPS lcd_caps; + char lcdstring[IPMI_DELL_LCD_STRING_LENGTH_MAX+1] = {0}; + int rc; + +- + printf("LCD info\n"); + + if (ipmi_lcd_get_configure_command_wh (intf) != 0) +@@ -1165,41 +1081,28 @@ ipmi_lcd_get_info_wh(struct ipmi_intf * + } + else if (lcd_mode.lcdmode == IPMI_DELL_LCD_CONFIG_USER_DEFINED) + { +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter*/ +- data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR; +- data[2] = 0; /* set selector (n/a)*/ +- data[3] = 0; /* block selector (n/a)*/ +- + printf(" Setting: User defined\n"); +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities."); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting LCD capabilities: Command not supported on this system."); + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } +- +- lcd_caps = (IPMI_DELL_LCD_CAPS *)rsp->data; +- if (lcd_caps->number_lines > 0) ++ if (lcd_caps.number_lines > 0) + { + memset(lcdstring, 0, IPMI_DELL_LCD_STRING_LENGTH_MAX+1); + +- rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps->max_chars[0]); ++ rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps.max_chars[0]); + printf(" Text: %s\n", lcdstring); + } + else +@@ -1269,10 +1172,7 @@ ipmi_lcd_get_info_wh(struct ipmi_intf * + ******************************************************************/ + static int ipmi_lcd_get_info(struct ipmi_intf * intf) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- IPMI_DELL_LCD_CAPS * lcd_caps; ++ IPMI_DELL_LCD_CAPS lcd_caps; + uint8_t command = 0; + char lcdstring[IPMI_DELL_LCD_STRING_LENGTH_MAX+1] = {0}; + int rc; +@@ -1301,40 +1201,28 @@ static int ipmi_lcd_get_info(struct ipmi + } + else if (command == IPMI_DELL_LCD_CONFIG_USER_DEFINED) + { +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter */ +- data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR; +- data[2] = 0; /* set selector (n/a) */ +- data[3] = 0; /* block selector (n/a) */ +- + printf(" Setting: custom\n"); + +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities."); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting LCD capabilities: Command not supported on this system."); + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } +- +- lcd_caps = (IPMI_DELL_LCD_CAPS *)(void *)rsp->data; +- if (lcd_caps->number_lines > 0) ++ if (lcd_caps.number_lines > 0) + { + memset (lcdstring,0,IPMI_DELL_LCD_STRING_LENGTH_MAX+1); +- rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps->max_chars[0]); ++ rc = ipmi_lcd_get_single_line_text (intf, lcdstring, lcd_caps.max_chars[0]); + printf(" Text: %s\n", lcdstring); + } + else +@@ -1360,44 +1248,26 @@ static int ipmi_lcd_get_info(struct ipmi + static int + ipmi_lcd_get_status_val(struct ipmi_intf * intf, LCD_STATUS* lcdstatus) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- ++ int rc; + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter */ +- data[1] = IPMI_DELL_LCD_STATUS_SELECTOR; +- data[2] = 0; /* block selector */ +- data[3] = 0; +- /* set selector (n/a) */ +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STATUS_SELECTOR, 0, 0, sizeof(*lcdstatus), lcdstatus); ++ printf("lcd %x %x\n", lcdstatus->vKVM_status, lcdstatus->lock_status); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting LCD Status"); + return -1; + } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting LCD status: Command not supported on this system."); + return -1; + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error getting LCD Status: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } +- +- /*lcdstatus= (LCD_STATUS* ) rsp->data; */ +- +- lcdstatus->vKVM_status=rsp->data[1]; +- lcdstatus->lock_status=rsp->data[2]; +- + return 0; + } + +@@ -1427,36 +1297,13 @@ static int IsLCDSupported () + ******************************************************************/ + static void CheckLCDSupport(struct ipmi_intf * intf) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; ++ int rc; + + LcdSupported = 0; +- +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter */ +- data[1] = IPMI_DELL_LCD_STATUS_SELECTOR; +- data[2] = 0; /* block selector */ +- data[3] = 0; +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) +- { +- return; +- } +- else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) +- { +- return; +- } +- else if (rsp->ccode > 0) +- { +- return; +- } ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_STATUS_SELECTOR, 0, 0, 0, NULL); ++ if (rc == 0) { + LcdSupported = 1; +- ++ } + } + + /***************************************************************** +@@ -1644,8 +1491,6 @@ ipmi_lcd_set_lock(struct ipmi_intf * int + static int + ipmi_lcd_set_single_line_text (struct ipmi_intf * intf, char * text) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; + uint8_t data[18]; + int bytes_to_store = strlen(text); + int bytes_stored = 0; +@@ -1667,11 +1512,6 @@ ipmi_lcd_set_single_line_text (struct ip + MIN((bytes_to_store - bytes_stored), IPMI_DELL_LCD_STRING1_SIZE); + if (size_of_copy < 0) /* allow 0 string length*/ + break; +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_SET_SYS_INFO; +- req.msg.data_len = size_of_copy + 4; /* chars, selectors and sizes*/ +- req.msg.data = data; + data[0] = IPMI_DELL_LCD_STRING_SELECTOR; + data[1] = ii; /* block number to use (0)*/ + data[2] = 0; /*string encoding*/ +@@ -1683,24 +1523,18 @@ ipmi_lcd_set_single_line_text (struct ip + MIN((bytes_to_store - bytes_stored), IPMI_DELL_LCD_STRINGN_SIZE); + if (size_of_copy <= 0) + break; +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_SET_SYS_INFO; +- req.msg.data_len = size_of_copy + 2; +- req.msg.data = data; + data[0] = IPMI_DELL_LCD_STRING_SELECTOR; + data[1] = ii; /* block number to use (1,2,3)*/ + memcpy (data+2, text+bytes_stored, size_of_copy); + bytes_stored += size_of_copy; + } +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { ++ rc = ipmi_setsysinfo(intf, 18, data); ++ if (rc < 0) { + lprintf(LOG_ERR, " Error setting text data"); + rc = -1; +- } else if (rsp->ccode > 0) { ++ } else if (rc > 0) { + lprintf(LOG_ERR, " Error setting text data: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + rc = -1; + } + } +@@ -1726,46 +1560,29 @@ static int + ipmi_lcd_set_text(struct ipmi_intf * intf, char * text, int line_number) + { + int rc = 0; ++ IPMI_DELL_LCD_CAPS lcd_caps; + +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- IPMI_DELL_LCD_CAPS * lcd_caps; +- +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; /* get parameter*/ +- data[1] = IPMI_DELL_LCD_GET_CAPS_SELECTOR; +- data[2] = 0; /* set selector (n/a)*/ +- data[3] = 0; /* block selector (n/a)*/ +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_LCD_GET_CAPS_SELECTOR, 0, 0, sizeof(lcd_caps), &lcd_caps); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities"); + return -1; + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error getting LCD capabilities: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + + return -1; + } + +- lcd_caps = (IPMI_DELL_LCD_CAPS *)(void *)rsp->data; +- +- if (lcd_caps->number_lines > 0) { ++ if (lcd_caps.number_lines > 0) { + rc = ipmi_lcd_set_single_line_text (intf, text); + } else { + lprintf(LOG_ERR, "LCD does not have any lines that can be set"); + rc = -1; + } + +- + return rc; + } + +@@ -2209,7 +2026,6 @@ static int ipmi_macinfo_10g (struct ipmi + req.msg.cmd = IPMI_GET_SYS_INFO; + req.msg.data = msg_data; + +- + req.msg.data_len = input_length; + + rsp = intf->sendrecv(intf, &req); +@@ -3980,52 +3796,40 @@ static int ipmi_print_get_power_consmpt_ + ******************************************************************/ + static int ipmi_get_avgpower_consmpt_history(struct ipmi_intf* intf,IPMI_AVGPOWER_CONSUMP_HISTORY* pavgpower ) + { +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = 0xeb; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); ++ int rc; ++ uint8_t *rdata; + +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, 0xeb, 0, 0, sizeof(*pavgpower), pavgpower); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting average power consumption history data .\n"); + return -1; + } +- else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; +- } else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ } else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting average power consumption history data: Command not supported on this system."); + return -1; + } +- else if (rsp->ccode != 0) ++ else if (rc != 0) + { + lprintf(LOG_ERR, " Error getting average power consumption historydata: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + + return -1; + } + + if (verbose > 1) + { ++ rdata = (void *)pavgpower; ++ + printf("Average power consumption history Data :%x %x %x %x %x %x %x\n\n", +- rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7]); ++ rdata[0], rdata[1], rdata[2], rdata[3], ++ rdata[4], rdata[5], rdata[6], rdata[7]); + + } +- +- *pavgpower = *( (IPMI_AVGPOWER_CONSUMP_HISTORY*) rsp->data); + #if WORDS_BIGENDIAN + pavgpower->lastminutepower = BSWAP_16(pavgpower->lastminutepower); + pavgpower->lasthourpower = BSWAP_16(pavgpower->lasthourpower); +@@ -4048,56 +3852,44 @@ static int ipmi_get_avgpower_consmpt_his + ******************************************************************/ + static int ipmi_get_peakpower_consmpt_history(struct ipmi_intf* intf,IPMI_POWER_CONSUMP_HISTORY * pstPeakpower) + { ++ uint8_t *rdata; ++ int rc; + +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = 0xec; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); +- +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, 0xEC, 0, 0, sizeof(*pstPeakpower), pstPeakpower); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting peak power consumption history data .\n"); + return -1; + } +- else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; +- } else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) ++ } else if ((rc == 0xc1)||(rc == 0xcb)) + { + lprintf(LOG_ERR, " Error getting peak power consumption history data: Command not supported on this system."); + return -1; + } +- else if (rsp->ccode != 0) ++ else if (rc != 0) + { + lprintf(LOG_ERR, " Error getting peak power consumption history data: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } + + if (verbose > 1) + { ++ rdata = (void *)pstPeakpower; ++ + printf("Peak power consmhistory Data : %x %x %x %x %x %x %x %x %x %x\n %x %x %x %x %x %x %x %x %x %x %x %x %x\n\n", +- rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10], rsp->data[11], +- rsp->data[12], rsp->data[13], rsp->data[14], rsp->data[15], +- rsp->data[16], rsp->data[17], rsp->data[18], rsp->data[19], +- rsp->data[20], rsp->data[21], rsp->data[22], rsp->data[23] ++ rdata[0], rdata[1], rdata[2], rdata[3], ++ rdata[4], rdata[5], rdata[6], rdata[7], ++ rdata[8], rdata[9], rdata[10], rdata[11], ++ rdata[12], rdata[13], rdata[14], rdata[15], ++ rdata[16], rdata[17], rdata[18], rdata[19], ++ rdata[20], rdata[21], rdata[22], rdata[23] + ); + + } +- *pstPeakpower =* ((IPMI_POWER_CONSUMP_HISTORY*)rsp->data); + #if WORDS_BIGENDIAN + pstPeakpower->lastminutepower = BSWAP_16(pstPeakpower->lastminutepower); + pstPeakpower->lasthourpower = BSWAP_16(pstPeakpower->lasthourpower); +@@ -4124,56 +3916,43 @@ static int ipmi_get_peakpower_consmpt_hi + ******************************************************************/ + static int ipmi_get_minpower_consmpt_history(struct ipmi_intf* intf,IPMI_POWER_CONSUMP_HISTORY * pstMinpower) + { ++ uint8_t *rdata; ++ int rc; + +- struct ipmi_rs * rsp = NULL; +- struct ipmi_rq req = {0}; +- uint8_t data[4]; +- +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- data[0] = 0; +- data[1] = 0xed; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); +- +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, 0xED, 0, 0, sizeof(*pstMinpower), pstMinpower); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting peak power consumption history data .\n"); + return -1; + } +- else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; +- } else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) +- { ++ } else if ((rc == 0xc1)||(rc == 0xcb)) { + lprintf(LOG_ERR, " Error getting peak power consumption history data: Command not supported on this system."); + return -1; + } +- else if (rsp->ccode != 0) ++ else if (rc != 0) + { + lprintf(LOG_ERR, " Error getting peak power consumption history data: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } + + if (verbose > 1) + { ++ rdata = (void *)pstMinpower; ++ + printf("Peak power consmhistory Data : %x %x %x %x %x %x %x %x %x %x\n %x %x %x %x %x %x %x %x %x %x %x %x %x\n\n", +- rsp->data[0], rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10], rsp->data[11], +- rsp->data[12], rsp->data[13], rsp->data[14], rsp->data[15], +- rsp->data[16], rsp->data[17], rsp->data[18], rsp->data[19], +- rsp->data[20], rsp->data[21], rsp->data[22], rsp->data[23] ++ rdata[0], rdata[1], rdata[2], rdata[3], ++ rdata[4], rdata[5], rdata[6], rdata[7], ++ rdata[8], rdata[9], rdata[10], rdata[11], ++ rdata[12], rdata[13], rdata[14], rdata[15], ++ rdata[16], rdata[17], rdata[18], rdata[19], ++ rdata[20], rdata[21], rdata[22], rdata[23] + ); + + } +- *pstMinpower =* ((IPMI_POWER_CONSUMP_HISTORY*)rsp->data); + #if WORDS_BIGENDIAN + pstMinpower->lastminutepower = BSWAP_16(pstMinpower->lastminutepower); + pstMinpower->lasthourpower = BSWAP_16(pstMinpower->lasthourpower); +@@ -4355,70 +4134,35 @@ static int ipmi_print_power_consmpt_hist + + static int ipmi_get_power_cap(struct ipmi_intf* intf,IPMI_POWER_CAP* ipmipowercap ) + { +- struct ipmi_rs * rsp=NULL; +- struct ipmi_rq req={0}; + uint64_t tempbtuphrconv; +- uint8_t data[4]; +- +- /* power supply rating command*/ +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- +- data[0] = 0; +- data[1] = IPMI_DELL_POWER_CAP; +- data[2] = 0; +- data[3] = 0; +- +- +- rsp = intf->sendrecv(intf, &req); ++ uint8_t *rdata; ++ int rc; + +- if (rsp == NULL) { ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_POWER_CAP, 0, 0, sizeof(*ipmipowercap), ipmipowercap); ++ if (rc < 0) { + lprintf(LOG_ERR, " Error getting power cap .\n"); +- if (verbose > 1){ +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- } + return -1; + +- } else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ } else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; +- } else if ((rsp->ccode == 0xc1)||(rsp->ccode == 0xcb)) { +- ++ } else if ((rc == 0xc1)||(rc == 0xcb)) { + lprintf(LOG_ERR, " Error getting power cap: Command not supported on this system."); +- if (verbose > 1){ +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- +- } + return -1; +- } else if (rsp->ccode != 0){ ++ } else if (rc != 0){ + lprintf(LOG_ERR, " Error getting power cap: %s", +- val2str(rsp->ccode, completion_code_vals)); +- if (verbose > 1){ +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- } ++ val2str(rc, completion_code_vals)); + return -1; + } + if (verbose > 1){ ++ rdata = (void*)ipmipowercap; ++ + printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); ++ rdata[1], rdata[2], rdata[3], ++ rdata[4], rdata[5], rdata[6], rdata[7], ++ rdata[8], rdata[9], rdata[10],rdata[11]); + + } +- +- * ipmipowercap = *((IPMI_POWER_CAP*)(rsp->data)); + #if WORDS_BIGENDIAN + ipmipowercap->PowerCap = BSWAP_16(ipmipowercap->PowerCap); + ipmipowercap->MaximumPowerConsmp = BSWAP_16(ipmipowercap->MaximumPowerConsmp); +@@ -4485,9 +4229,8 @@ static int ipmi_print_power_cap(struct i + ******************************************************************/ + static int ipmi_set_power_cap(struct ipmi_intf* intf,int unit,int val ) + { +- struct ipmi_rs *rsp = NULL; +- struct ipmi_rq req={0};; +- uint8_t data[13]; ++ int rc; ++ uint8_t data[13], *rdata; + uint16_t powercapval; + uint64_t maxpowerbtuphr; + uint64_t maxpowerbtuphr1; +@@ -4508,86 +4251,48 @@ static int ipmi_set_power_cap(struct ipm + return -1; + } + +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- memset(data, 0, 4); +- req.msg.data = data; +- +- data[0] = 0; +- data[1] = IPMI_DELL_POWER_CAP; +- data[2] = 0; +- data[3] = 0; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_getsysinfo(intf, IPMI_DELL_POWER_CAP, 0, 0, sizeof(ipmipowercap), &ipmipowercap); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error getting power cap .\n"); +- if (verbose > 1) +- { +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- } + return -1; +- + } +- else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; + } +- else if (rsp->ccode == 0xc1) ++ else if (rc == 0xc1) + { +- + lprintf(LOG_ERR, " Error getting power cap, command not supported on this system.\n"); +- if (verbose > 1){ +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- +- } + return -1; + } +- else if (rsp->ccode != 0) ++ else if (rc != 0) + { + lprintf(LOG_ERR, " Error getting power cap: %s", +- val2str(rsp->ccode, completion_code_vals)); +- if (verbose > 1) +- { +- printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); +- } ++ val2str(rc, completion_code_vals)); + return -1; + } + if (verbose > 1) + { ++ rdata = (void *)&ipmipowercap; + printf("power cap Data :%x %x %x %x %x %x %x %x %x %x ", +- rsp->data[1], rsp->data[2], rsp->data[3], +- rsp->data[4], rsp->data[5], rsp->data[6], rsp->data[7], +- rsp->data[8], rsp->data[9], rsp->data[10],rsp->data[11]); ++ rdata[1], rdata[2], rdata[3], ++ rdata[4], rdata[5], rdata[6], rdata[7], ++ rdata[8], rdata[9], rdata[10],rdata[11]); + + } +- +- ipmipowercap.PowerCap=((rsp->data[1]<<8)+rsp->data[2]); +- ipmipowercap.unit=rsp->data[3]; +- ipmipowercap.MaximumPowerConsmp=((rsp->data[4]<<8)+rsp->data[5]); +- ipmipowercap.MinimumPowerConsmp=((rsp->data[6]<<8)+rsp->data[7]); ++#if WORDS_BIGENDIAN ++ ipmipowercap.PowerCap = BSWAP_16(ipmipowercap.PowerCap); ++ ipmipowercap.MaximumPowerConsump = BSWAP_16(ipmipowercap.MaximumPowerConsump); ++ ipmipowercap.MinumumPowerConsump = BSWAP_16(ipmipowercap.MinimumPowerConsump); ++ ipmipowercap.AvailablePower = BSWAP_16(ipmipowercap.AvailablePower); ++ ipmipowercap.totalnumpowersupp = BSWP_16(ipmipowercap.totalnumpowersupp); ++#endif + + memset(data, 0, 13); +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_SET_SYS_INFO; +- req.msg.data_len = 13; +- req.msg.data = data; + data[0] = IPMI_DELL_POWER_CAP; + powercapval=val; + +- + data[1] = (powercapval&0XFF); + data[2] = ((powercapval&0XFF00)>>8); + data[3] = unit; +@@ -4602,9 +4307,6 @@ static int ipmi_set_power_cap(struct ipm + data[11]=(ipmipowercap.SystemThrottling); + data[12]=0x00; + +- ipmipowercap.MaximumPowerConsmp = BSWAP_16(ipmipowercap.MaximumPowerConsmp); +- ipmipowercap.MinimumPowerConsmp = BSWAP_16(ipmipowercap.MinimumPowerConsmp); +- ipmipowercap.PowerCap = BSWAP_16(ipmipowercap.PowerCap); + if(unit==btuphr) + { + val = btuphr_to_watt_conversion(val); +@@ -4641,123 +4343,30 @@ static int ipmi_set_power_cap(struct ipm + + return -1; + } +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) ++ rc = ipmi_setsysinfo(intf, 13, data); ++ if (rc < 0) + { + lprintf(LOG_ERR, " Error setting power cap"); + return -1; + } +- else if((iDRAC_FLAG == IDRAC_12G) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { ++ else if((iDRAC_FLAG == IDRAC_12G) && (rc == LICENSE_NOT_SUPPORTED)) { + printf("FM001 : A required license is missing or expired\n"); + return -1; + } +- else if (rsp->ccode > 0) ++ else if (rc > 0) + { + lprintf(LOG_ERR, " Error setting power cap: %s", +- val2str(rsp->ccode, completion_code_vals)); ++ val2str(rc, completion_code_vals)); + return -1; + } + if (verbose > 1) + { +- printf("CC for setpowercap :%d ",rsp->ccode); ++ printf("CC for setpowercap :%d ",rc); + } + return 0; + } + + /***************************************************************** +-* Function Name: getpowersupplyfruinfo +-* +-* Description: This function retrieves the FRU header +-* Input: intf - ipmi interface +-* header - watt / btuphr +-* fru - FRU information +-* Output: header - FRU header +-* Return: +-* +-******************************************************************/ +-static int getpowersupplyfruinfo(struct ipmi_intf *intf, uint8_t id, +- struct fru_header header, struct fru_info fru) +-{ +- struct ipmi_rs * rsp; +- struct ipmi_rq req; +- +- uint8_t msg_data[4]; +- +- memset(&fru, 0, sizeof(struct fru_info)); +- memset(&header, 0, sizeof(struct fru_header)); +- +- /* +- * get info about this FRU +- */ +- memset(msg_data, 0, 4); +- msg_data[0] = id; +- +- memset(&req, 0, sizeof(req)); +- req.msg.netfn = IPMI_NETFN_STORAGE; +- req.msg.lun = 0; +- req.msg.cmd = GET_FRU_INFO; +- req.msg.data = msg_data; +- req.msg.data_len = 1; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { +- printf(" Device not present (No Response)\n"); +- return -1; +- } +- if (rsp->ccode > 0) { +- printf(" Device not present (%s)\n", +- val2str(rsp->ccode, completion_code_vals)); +- return -1; +- } +- +- fru.size = (rsp->data[1] << 8) | rsp->data[0]; +- fru.access = rsp->data[2] & 0x1; +- +- lprintf(LOG_DEBUG, "fru.size = %d bytes (accessed by %s)", +- fru.size, fru.access ? "words" : "bytes"); +- +- if (fru.size < 1) { +- lprintf(LOG_ERR, " Invalid FRU size %d", fru.size); +- return -1; +- } +- +- /* +- * retrieve the FRU header +- */ +- msg_data[0] = id; +- msg_data[1] = 0; +- msg_data[2] = 0; +- msg_data[3] = 8; +- +- memset(&req, 0, sizeof(req)); +- req.msg.netfn = IPMI_NETFN_STORAGE; +- req.msg.lun = 0; +- req.msg.cmd = GET_FRU_DATA; +- req.msg.data = msg_data; +- req.msg.data_len = 4; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp == NULL) { +- printf(" Device not present (No Response)\n"); +- return 1; +- } +- if (rsp->ccode > 0) { +- printf(" Device not present (%s)\n", +- val2str(rsp->ccode, completion_code_vals)); +- return 1; +- } +- +- if (verbose > 1) +- printbuf(rsp->data, rsp->data_len, "FRU DATA"); +- +- memcpy(&header, rsp->data + 1, 8); +- +- return 0; +- +- +-} +- +-/***************************************************************** + * Function Name: ipmi_powermonitor_usage + * + * Description: This function prints help message for powermonitor command +@@ -5291,53 +4900,3 @@ ipmi_delloem_setled_main(struct ipmi_int + /* Set drive LEDs */ + return ipmi_setled_state (intf, bayId, slotId, mask); + } +- +- +-/***************************************************************** +- * Function Name: ipmi_getsysinfo +- * +- * Description: This function processes the IPMI Get System Info command +- * Input: intf - ipmi interface +- * param - Parameter # (0xC0..0xFF = OEM) +- * block/set - Block/Set number of parameter +- * len - Length of buffer +- * buffer - Pointer to buffer +- * Output: +- * +- * Return: return code 0 - success +- * -1 - failure +- * other = IPMI ccode +- * +- ******************************************************************/ +-static int +-ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, int len, void *buffer) +-{ +- uint8_t data[4]; +- struct ipmi_rs *rsp = NULL; +- struct ipmi_rq req={0}; +- +- memset(buffer, 0, len); +- memset(data, 0, 4); +- req.msg.netfn = IPMI_NETFN_APP; +- req.msg.lun = 0; +- req.msg.cmd = IPMI_GET_SYS_INFO; +- req.msg.data_len = 4; +- req.msg.data = data; +- +- data[0] = 0; // get/set +- data[1] = param; +- data[2] = block; +- data[3] = set; +- +- rsp = intf->sendrecv(intf, &req); +- if (rsp != NULL) { +- if (rsp->ccode == 0) { +- if (len > rsp->data_len) +- len = rsp->data_len; +- if (len && buffer) +- memcpy(buffer, rsp->data, len); +- } +- return rsp->ccode; +- } +- return -1; +-} +--- ipmitool-1.8.12/lib/ipmi_mc.c 2010-05-04 09:44:19.000000000 -0500 ++++ ipmitool/lib/ipmi_mc.c 2012-08-13 13:48:38.000000000 -0500 +@@ -45,6 +45,8 @@ + + extern int verbose; + ++static int ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv); ++ + /* ipmi_mc_reset - attempt to reset an MC + * + * @intf: ipmi interface +@@ -168,10 +170,17 @@ printf_mc_usage(void) + printf(" selftest\n"); + printf(" getenables\n"); + printf(" setenables ...\n"); +- + for (bf = mc_enables_bf; bf->name != NULL; bf++) { + printf(" %-20s %s\n", bf->name, bf->desc); + } ++ printf(" getsysinfo argument\n"); ++ printf(" setsysinfo argument string\n"); ++ printf(" Valid arguments are:\n"); ++ printf(" primary_os_name Primary operating system name\n"); ++ printf(" os_name Operating system name\n"); ++ printf(" system_name System Name of server (vendor dependent\n"); ++ printf(" delloem_os_version Running version of operating system\n"); ++ printf(" delloem_url Url of bmc webserver\n"); + } + + +@@ -793,9 +802,237 @@ ipmi_mc_main(struct ipmi_intf * intf, in + print_watchdog_usage(); + } + } ++ else if (!strncmp(argv[0], "getsysinfo", 10) || ++ !strncmp(argv[0], "setsysinfo", 10)) { ++ rc = ipmi_sysinfo_main(intf, argc, argv); ++ } + else { + lprintf(LOG_ERR, "Invalid mc/bmc command: %s", argv[0]); + rc = -1; + } + return rc; + } ++ ++ ++static int sysinfo_param(struct ipmi_intf *intf, const char *str, int *maxset) ++{ ++ *maxset = 4; ++ if (!strcmp(str, "system_name")) ++ return IPMI_SYSINFO_HOSTNAME; ++ if (!strcmp(str, "primary_os_name")) ++ return IPMI_SYSINFO_PRIMARY_OS_NAME; ++ if (!strcmp(str, "os_name")) ++ return IPMI_SYSINFO_OS_NAME; ++ ++ if (!strcmp(str, "delloem_os_version")) { ++ *maxset = 4; ++ return IPMI_SYSINFO_DELL_OS_VERSION; ++ } ++ if (!strcmp(str, "delloem_url")) { ++ *maxset = 2; ++ return IPMI_SYSINFO_DELL_URL; ++ } ++ return strtoul(str, 0, 0); ++ return -1; ++} ++ ++static void ipmi_sysinfo_usage() ++{ ++ lprintf(LOG_NOTICE, "usage:"); ++ lprintf(LOG_NOTICE, " getsysinfo argument"); ++ lprintf(LOG_NOTICE, " Retrieves system info from bmc for given argument"); ++ lprintf(LOG_NOTICE, " setsysinfo argument string"); ++ lprintf(LOG_NOTICE, " Stores system info string for given argument to bmc"); ++ lprintf(LOG_NOTICE, ""); ++ lprintf(LOG_NOTICE, " Valid arguments are:"); ++ lprintf(LOG_NOTICE, " primary_os_name Primary operating system name"); ++ lprintf(LOG_NOTICE, " os_name Operating system name"); ++ lprintf(LOG_NOTICE, " system_name System Name of server (vendor dependent"); ++ lprintf(LOG_NOTICE, " delloem_os_version Running version of operating system"); ++ lprintf(LOG_NOTICE, " delloem_url Url of bmc webserver"); ++ ++ lprintf(LOG_NOTICE, ""); ++} ++ ++/***************************************************************** ++ * Function Name: ipmi_getsysinfo ++ * ++ * Description: This function processes the IPMI Get System Info command ++ * Input: intf - ipmi interface ++ * param - Parameter # (0xC0..0xFF = OEM) ++ * block/set - Block/Set number of parameter ++ * len - Length of buffer ++ * buffer - Pointer to buffer ++ * Output: ++ * ++ * Return: return code 0 - success ++ * -1 - failure ++ * other = IPMI ccode ++ * ++ ******************************************************************/ ++int ++ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, ++ int len, void *buffer) ++{ ++ uint8_t data[4]; ++ struct ipmi_rs *rsp = NULL; ++ struct ipmi_rq req={0}; ++ ++ memset(buffer, 0, len); ++ memset(data, 0, 4); ++ req.msg.netfn = IPMI_NETFN_APP; ++ req.msg.lun = 0; ++ req.msg.cmd = IPMI_GET_SYS_INFO; ++ req.msg.data_len = 4; ++ req.msg.data = data; ++ ++ if (verbose > 1) ++ printf("getsysinfo: %.2x/%.2x/%.2x\n", param, block, set); ++ data[0] = 0; // get/set ++ data[1] = param; ++ data[2] = block; ++ data[3] = set; ++ ++ // Format of get output is: ++ // u8 param_rev ++ // u8 selector ++ // u8 encoding bit[0-3]; ++ // u8 length ++ // u8 data0[14] ++ rsp = intf->sendrecv(intf, &req); ++ if (rsp != NULL) { ++ if (rsp->ccode == 0) { ++ if (len > rsp->data_len) ++ len = rsp->data_len; ++ if (len && buffer) ++ memcpy(buffer, rsp->data, len); ++ } ++ return rsp->ccode; ++ } ++ return -1; ++} ++ ++/***************************************************************** ++ * Function Name: ipmi_setsysinfo ++ * ++ * Description: This function processes the IPMI Set System Info command ++ * Input: intf - ipmi interface ++ * len - Length of buffer ++ * buffer - Pointer to buffer ++ * Output: ++ * ++ * Return: return code 0 - success ++ * -1 - failure ++ * other = IPMI ccode ++ * ++ ******************************************************************/ ++int ++ipmi_setsysinfo(struct ipmi_intf * intf, int len, void *buffer) ++{ ++ struct ipmi_rs *rsp = NULL; ++ struct ipmi_rq req={0}; ++ ++ req.msg.netfn = IPMI_NETFN_APP; ++ req.msg.lun = 0; ++ req.msg.cmd = IPMI_SET_SYS_INFO; ++ req.msg.data_len = len; ++ req.msg.data = buffer; ++ ++ // Format of set input: ++ // u8 param rev ++ // u8 selector ++ // u8 data1[16] ++ rsp = intf->sendrecv(intf, &req); ++ if (rsp != NULL) { ++ return rsp->ccode; ++ } ++ return -1; ++} ++ ++ ++static int ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv) ++{ ++ int param, isset; ++ char *str; ++ unsigned char infostr[256]; ++ unsigned char paramdata[18]; ++ int pos, set, rc, maxset, len; ++ ++ /* Is this a setsysinfo or getsysinfo */ ++ isset = !strncmp(argv[0], "setsysinfo\0",11); ++ ++ if (argc == 1 || strcmp(argv[1], "help") == 0 || ++ argc < (isset ? 3 : 2)) { ++ ipmi_sysinfo_usage(); ++ return 0; ++ } ++ memset(infostr, 0, sizeof(infostr)); ++ ++ /* Get Parameters */ ++ param = sysinfo_param(intf, argv[1], &maxset); ++ if (param < 0) { ++ ipmi_sysinfo_usage(); ++ return 0; ++ } ++ ++ rc = 0; ++ if (isset) { ++ str = argv[2]; ++ set = pos = 0; ++ len = strlen(str); ++ ++ /* first block holds 14 bytes, all others hold 16 */ ++ if (((len + 2) + 15) / 16 >= maxset) ++ len = maxset * 16 - 2; ++ do { ++ memset(paramdata, 0, sizeof(paramdata)); ++ paramdata[0] = param; ++ paramdata[1] = set; ++ if (set == 0) { ++ /* First block is special case */ ++ paramdata[2] = 0; // ascii encoding ++ paramdata[3] = len; // length; ++ strncpy(paramdata+4, str+pos, IPMI_SYSINFO_SET0_SIZE); ++ pos += IPMI_SYSINFO_SET0_SIZE; ++ } else { ++ strncpy(paramdata+2, str+pos, IPMI_SYSINFO_SETN_SIZE); ++ pos += IPMI_SYSINFO_SETN_SIZE; ++ } ++ rc = ipmi_setsysinfo(intf, 18, paramdata); ++ if (rc) ++ break; ++ set++; ++ } while (pos < len); ++ } else { ++ /* Read blocks of data */ ++ pos = 0; ++ for (set=0; set 0) { ++ lprintf(LOG_ERR, "%s %s", argv[0], val2str(rc, completion_code_vals)); ++ } ++ return rc; ++} +--- ipmitool-1.8.12/include/ipmitool/ipmi_delloem.h 2012-07-27 10:21:55.000000000 -0500 ++++ ipmitool/include/ipmitool/ipmi_delloem.h 2012-08-14 12:50:18.000000000 -0500 +@@ -39,10 +39,6 @@ POSSIBILITY OF SUCH DAMAGE. + #define MAX(a,b) ((a) > (b) ? (a) : (b)) + + +-/* IPMI 2.0 command for system information*/ +-#define IPMI_SET_SYS_INFO 0x58 +-#define IPMI_GET_SYS_INFO 0x59 +- + /* Dell selector for LCD control - get and set unless specified */ + #define IPMI_DELL_LCD_STRING_SELECTOR 0xC1 /* RW get/set the user string */ + #define IPMI_DELL_LCD_CONFIG_SELECTOR 0xC2 /* RW set to user/default/none */ +@@ -139,6 +135,7 @@ typedef struct _tag_ipmi_dell_lcd_string + + typedef struct _lcd_status + { ++ char parametersel; + char vKVM_status; + char lock_status; + char Resv1; +--- ipmitool-1.8.12/include/ipmitool/ipmi_mc.h 2009-06-09 10:38:09.000000000 -0500 ++++ ipmitool/include/ipmitool/ipmi_mc.h 2012-08-13 13:48:38.000000000 -0500 +@@ -151,4 +151,20 @@ struct ipm_get_watchdog_rsp { + #define IPM_WATCHDOG_CLEAR_BIOS_POST 0x04 + #define IPM_WATCHDOG_CLEAR_BIOS_FRB2 0x02 + ++/* IPMI 2.0 command for system information*/ ++#define IPMI_SET_SYS_INFO 0x58 ++#define IPMI_GET_SYS_INFO 0x59 ++#define IPMI_SYSINFO_SET0_SIZE 14 ++#define IPMI_SYSINFO_SETN_SIZE 16 ++ ++#define IPMI_SYSINFO_HOSTNAME 0x02 ++#define IPMI_SYSINFO_PRIMARY_OS_NAME 0x03 ++#define IPMI_SYSINFO_OS_NAME 0x04 ++#define IPMI_SYSINFO_DELL_OS_VERSION 0xe4 ++#define IPMI_SYSINFO_DELL_URL 0xde ++ ++int ipmi_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, ++ int len, void *buffer); ++int ipmi_setsysinfo(struct ipmi_intf * intf, int len, void *buffer); ++ + #endif /*IPMI_MC_H */ diff --git a/ipmitool.spec b/ipmitool.spec index 8455fbf..b49a05e 100644 --- a/ipmitool.spec +++ b/ipmitool.spec @@ -1,7 +1,7 @@ Name: ipmitool Summary: Utility for IPMI control Version: 1.8.12 -Release: 3%{?dist} +Release: 4%{?dist} License: BSD Group: System Environment/Base URL: http://ipmitool.sourceforge.net/ @@ -23,6 +23,7 @@ Patch3: ipmitool-1.8.11-remove-umask0.patch Patch4: ipmitool-1.8.11-systemd.patch # https://sourceforge.net/tracker/index.php?func=detail&aid=3564701&group_id=95200&atid=610550 Patch5: ipmitool-1.8.12-bigendian.patch +Patch6: ipmitool-cvs-mc-sysinfo-dell.patch %description This package contains a utility for interfacing with devices that support @@ -47,6 +48,7 @@ setting LAN configuration, and chassis power control. %patch3 -p1 -b .umask %patch4 -p1 -b .systemd %patch5 -p1 -b .bigendian +%patch6 -p1 -b .mcsysinfodell for f in AUTHORS ChangeLog; do iconv -f iso-8859-1 -t utf8 < ${f} > ${f}.utf8 @@ -97,6 +99,9 @@ install -Dpm 644 %{SOURCE1} %{buildroot}%{_sysconfdir}/sysconfig/ipmievd %changelog +* Wed Oct 17 2012 Ales Ledvinka 1.8.12-4 +- support setting OS name and Hostname on BMC + * Tue Sep 04 2012 Dan HorĂ¡k - 1.8.12-3 - fix build on big endian arches