You can subscribe to this list here.
2004 |
Jan
(19) |
Feb
(8) |
Mar
(56) |
Apr
(42) |
May
(23) |
Jun
(26) |
Jul
(47) |
Aug
(76) |
Sep
(52) |
Oct
(18) |
Nov
(51) |
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(84) |
Feb
(31) |
Mar
(55) |
Apr
(64) |
May
(72) |
Jun
(32) |
Jul
(36) |
Aug
(25) |
Sep
(19) |
Oct
(1) |
Nov
(6) |
Dec
(1) |
2006 |
Jan
(34) |
Feb
|
Mar
(72) |
Apr
(16) |
May
(29) |
Jun
(3) |
Jul
(12) |
Aug
(11) |
Sep
(18) |
Oct
(4) |
Nov
(12) |
Dec
(2) |
2007 |
Jan
(20) |
Feb
(25) |
Mar
(6) |
Apr
(9) |
May
(10) |
Jun
(4) |
Jul
(10) |
Aug
(20) |
Sep
(5) |
Oct
(7) |
Nov
(4) |
Dec
(17) |
2008 |
Jan
(4) |
Feb
(1) |
Mar
|
Apr
|
May
(5) |
Jun
(7) |
Jul
(17) |
Aug
(4) |
Sep
(14) |
Oct
(4) |
Nov
(1) |
Dec
|
2009 |
Jan
(29) |
Feb
(11) |
Mar
(6) |
Apr
(12) |
May
(2) |
Jun
(12) |
Jul
(1) |
Aug
|
Sep
(1) |
Oct
(3) |
Nov
(2) |
Dec
|
2010 |
Jan
(16) |
Feb
|
Mar
|
Apr
(17) |
May
(8) |
Jun
(3) |
Jul
|
Aug
(4) |
Sep
|
Oct
|
Nov
(6) |
Dec
(1) |
2011 |
Jan
|
Feb
|
Mar
(6) |
Apr
(1) |
May
(1) |
Jun
(1) |
Jul
|
Aug
(1) |
Sep
(1) |
Oct
(1) |
Nov
(2) |
Dec
|
2012 |
Jan
(35) |
Feb
(18) |
Mar
(2) |
Apr
(3) |
May
(15) |
Jun
(5) |
Jul
(11) |
Aug
(7) |
Sep
(6) |
Oct
(11) |
Nov
(14) |
Dec
(12) |
2013 |
Jan
(21) |
Feb
(12) |
Mar
(22) |
Apr
(38) |
May
(14) |
Jun
(9) |
Jul
(67) |
Aug
(22) |
Sep
(6) |
Oct
(63) |
Nov
(6) |
Dec
(11) |
2014 |
Jan
(17) |
Feb
(3) |
Mar
(8) |
Apr
(13) |
May
(8) |
Jun
|
Jul
|
Aug
(6) |
Sep
(3) |
Oct
(7) |
Nov
(8) |
Dec
(13) |
2015 |
Jan
(21) |
Feb
(4) |
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
(5) |
Aug
(3) |
Sep
(2) |
Oct
(5) |
Nov
(4) |
Dec
(2) |
2016 |
Jan
(2) |
Feb
(3) |
Mar
(12) |
Apr
(6) |
May
(14) |
Jun
(8) |
Jul
(2) |
Aug
(3) |
Sep
(1) |
Oct
(4) |
Nov
|
Dec
|
2017 |
Jan
(2) |
Feb
(1) |
Mar
(4) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
(2) |
Apr
(3) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Alexander A. <spi...@us...> - 2018-04-06 09:52:10
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, bugfix/509 has been created at 3f0fa86d93f396263550cfc0399d1804c55739d9 (commit) - Log ----------------------------------------------------------------- commit 3f0fa86d93f396263550cfc0399d1804c55739d9 Author: Alexander Amelkin <ale...@am...> Date: Thu Apr 5 19:18:30 2018 +0300 ID:509 - Fix nm policy range From spec 4.0, policy ID is one Byte data and the range is 0-255. diff --git a/lib/ipmi_dcmi.c b/lib/ipmi_dcmi.c index 5a7093e..6fd982f 100755 --- a/lib/ipmi_dcmi.c +++ b/lib/ipmi_dcmi.c @@ -363,7 +363,7 @@ const struct dcmi_cmd nm_ctl_cmds[] = { const struct dcmi_cmd nm_ctl_domain[] = { { 0x00, "global", "" }, { 0x02, "per_domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x04, "per_policy", "<0-7>" }, + { 0x04, "per_policy", "<0-255>" }, DCMI_CMD_END(0xFF), }; @@ -411,7 +411,7 @@ const struct dcmi_cmd nm_policy_type_vals[] = { const struct dcmi_cmd nm_stats_opts[] = { { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "policy_id", "<0-7>" }, + { 0x02, "policy_id", "<0-255>" }, DCMI_CMD_END(0xFF), }; @@ -432,14 +432,14 @@ const struct dcmi_cmd nm_stats_mode[] = { }; const struct dcmi_cmd nm_policy_action[] = { - { 0x00, "get", "nm policy get policy_id <0-7> " + { 0x00, "get", "nm policy get policy_id <0-255> " "[domain <platform|CPU|Memory>]" }, - { 0x04, "add", "nm policy add policy_id <0-7> " + { 0x04, "add", "nm policy add policy_id <0-255> " "[domain <platform|CPU|Memory>] " "correction auto|soft|hard power <watts> | " "inlet <temp> trig_lim <param> " "stats <seconds> enable|disable" }, - { 0x05, "remove", "nm policy remove policy_id <0-7> " + { 0x05, "remove", "nm policy remove policy_id <0-255> " "[domain <platform|CPU|Memory>]" }, { 0x06, "limiting", "nm policy limiting [domain <platform|CPU|Memory>]" }, @@ -545,7 +545,7 @@ const struct dcmi_cmd nm_thresh_cmds[] = { const struct dcmi_cmd nm_thresh_param[] = { { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "policy_id", "<0-7>" }, + { 0x02, "policy_id", "<0-255>" }, DCMI_CMD_END(0xFF), }; @@ -2588,6 +2588,7 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; struct nm_get_policy policy; memset(&policy, 0, sizeof(policy)); @@ -2609,9 +2610,10 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) break; case 0x0B: /* policy id */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR," Policy ID must be a positive integer 0-7.\n"); + lprintf(LOG_ERR," Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: printf(" Unknown command 0x%x, skipping.\n", option); @@ -2620,7 +2622,7 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2679,6 +2681,7 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) uint8_t correction; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; uint16_t power, period, inlet; uint16_t cores; uint32_t limit; @@ -2763,10 +2766,11 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) break; case 0x0B: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - printf("Policy ID must be a positive integer 0-7.\n"); + printf("Policy ID must be a positive integer (0-255)\n"); return -1; } policy.policy_id = policy_id; + have_policy_id = TRUE; break; case 0x0C: /* volatile */ policy.policy_type |= 0x80; @@ -2796,7 +2800,7 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) printf("limit %x\n", limit); return 0; } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2815,6 +2819,7 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) uint8_t scope = 0; /* default control scope of global */ uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; argv++; argc--; @@ -2844,15 +2849,16 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) } } else if (scope == 0x04) { /* per_policy */ if (str2uchar(argv[0], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; } argc--; argv++; } - if ((scope == 0x04) && (policy_id == 0xFF)) { + if ((scope == 0x04) && !have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2868,6 +2874,7 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; int policy_mode = 0; int cut; char *units = ""; @@ -2899,9 +2906,10 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: break; @@ -2925,7 +2933,7 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) case 0x13: policy_mode = 1; units = (mode == 0x11) ? "Watts" : (mode == 0x12) ? "Celsius" : " %"; - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2998,6 +3006,7 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; argv++; if ((argv[0] == NULL) || @@ -3022,9 +3031,10 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: break; @@ -3032,7 +3042,7 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if (mode && (policy_id == 0xFF)) { + if (mode && !have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -3220,6 +3230,7 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) uint8_t action; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; struct nm_thresh thresh; int i = 0; @@ -3248,9 +3259,10 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; argc--; argv++; break; @@ -3267,7 +3279,7 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) break; } } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -3337,6 +3349,7 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) uint8_t action; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; uint8_t count = 0; struct nm_suspend suspend; int i; @@ -3366,9 +3379,10 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; argc--; argv++; break; @@ -3401,6 +3415,12 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) break; } } + + if (!have_policy_id) { + print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); + return -1; + } + if (action == 0x02) /* get */ return (ipmi_nm_get_suspend(intf, domain, policy_id)); ----------------------------------------------------------------------- hooks/post-receive -- ipmitool |
From: Alexander A. <spi...@us...> - 2018-04-05 18:16:00
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 724f7329a3d7b9966f77ad03d8936a4b1244da4a (commit) via f498e3e29671ec4e2105b44084516485452a32d7 (commit) from 6d9c540f6b2dc16486abc557516f21f8313d6d72 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 724f7329a3d7b9966f77ad03d8936a4b1244da4a Author: Alexander Amelkin <ale...@am...> Date: Thu Apr 5 21:08:22 2018 +0300 dcmi: Refactor - Refactor the ipmi_dcmi code for better readability; - Get rid of space indents; - Use tabs for indent, spaces for alignment; - Wrap too long lines; diff --git a/lib/ipmi_dcmi.c b/lib/ipmi_dcmi.c index 1dc4a19..5a7093e 100755 --- a/lib/ipmi_dcmi.c +++ b/lib/ipmi_dcmi.c @@ -83,29 +83,29 @@ static int ipmi_print_sensor_info(struct ipmi_intf *intf, uint16_t rec_id); /* Main set of DCMI commands */ const struct dcmi_cmd dcmi_cmd_vals[] = { - { 0x00, "discover", " Used to discover supported DCMI capabilities" }, - { 0x01, "power", " Platform power limit command options" }, - { 0x02, "sensors", " Prints the available DCMI sensors" }, - { 0x03, "asset_tag", " Prints the platform's asset tag" }, - { 0x04, "set_asset_tag", " Sets the platform's asset tag" }, - { 0x05, "get_mc_id_string", " Get management controller ID string" }, - { 0x06, "set_mc_id_string", " Set management controller ID string" }, - { 0x07, "thermalpolicy", " Thermal policy get/set" }, - { 0x08, "get_temp_reading", " Get Temperature Readings" }, - { 0x09, "get_conf_param", " Get DCMI Config Parameters" }, - { 0x0A, "set_conf_param", " Set DCMI Config Parameters" }, - { 0x0B, "oob_discover", " Ping/Pong Message for DCMI Discovery" }, + { 0x00, "discover", "Used to discover supported DCMI capabilities" }, + { 0x01, "power", "Platform power limit command options" }, + { 0x02, "sensors", "Prints the available DCMI sensors" }, + { 0x03, "asset_tag", "Prints the platform's asset tag" }, + { 0x04, "set_asset_tag", "Sets the platform's asset tag" }, + { 0x05, "get_mc_id_string", "Get management controller ID string" }, + { 0x06, "set_mc_id_string", "Set management controller ID string" }, + { 0x07, "thermalpolicy", "Thermal policy get/set" }, + { 0x08, "get_temp_reading", "Get Temperature Readings" }, + { 0x09, "get_conf_param", "Get DCMI Config Parameters" }, + { 0x0A, "set_conf_param", "Set DCMI Config Parameters" }, + { 0x0B, "oob_discover", "Ping/Pong Message for DCMI Discovery" }, DCMI_CMD_END(0xFF) }; /* get capabilites */ const struct dcmi_cmd dcmi_capable_vals[] = { - { 0x01, "platform", " Lists the system capabilities" }, + { 0x01, "platform", "Lists the system capabilities" }, { 0x02, "mandatory_attributes", "Lists SEL, identification and" - "temperature attributes" }, - { 0x03, "optional_attributes", " Lists power capabilities" }, - { 0x04, "managebility access", " Lists OOB channel information" }, + "temperature attributes" }, + { 0x03, "optional_attributes", "Lists power capabilities" }, + { 0x04, "managebility access", "Lists OOB channel information" }, DCMI_CMD_END(0xFF) }; @@ -116,47 +116,48 @@ const struct dcmi_cmd dcmi_capable_vals[] = { */ const struct dcmi_cmd dcmi_mandatory_platform_capabilities[] = { { 0x01, "Identification support available", "" }, - { 0x02, "SEL logging available", "" }, - { 0x03, "Chassis power available", "" }, - { 0x04, "Temperature monitor available", "" }, + { 0x02, "SEL logging available", "" }, + { 0x03, "Chassis power available", "" }, + { 0x04, "Temperature monitor available", "" }, DCMI_CMD_END(0xFF) }; /* optional capabilities */ const struct dcmi_cmd dcmi_optional_platform_capabilities[] = { - { 0x01, "Power management available", "" }, + { 0x01, "Power management available", "" }, + DCMI_CMD_END(0xFF) }; /* access capabilties */ const struct dcmi_cmd dcmi_management_access_capabilities[] = { - { 0x01, "In-band KCS channel available", "" }, - { 0x02, "Out-of-band serial TMODE available", "" }, + { 0x01, "In-band KCS channel available", "" }, + { 0x02, "Out-of-band serial TMODE available", "" }, { 0x03, "Out-of-band secondary LAN channel available", "" }, - { 0x04, "Out-of-band primary LAN channel available", "" }, - { 0x05, "SOL enabled", "" }, - { 0x06, "VLAN capable", "" }, + { 0x04, "Out-of-band primary LAN channel available", "" }, + { 0x05, "SOL enabled", "" }, + { 0x06, "VLAN capable", "" }, DCMI_CMD_END(0xFF) }; /* identification capabilities */ const struct dcmi_cmd dcmi_id_capabilities_vals[] = { - { 0x01, "GUID", "" }, + { 0x01, "GUID", "" }, { 0x02, "DHCP hostname", "" }, - { 0x03, "Asset tag", "" }, + { 0x03, "Asset tag", "" }, DCMI_CMD_END(0xFF) }; /* Configuration parameters*/ const struct dcmi_cmd dcmi_conf_param_vals[] = { - { 0x01, "activate_dhcp", "\tActivate DHCP"}, - { 0x02, "dhcp_config", "\tDHCP Configuration" }, - { 0x03, "init", "\t\tInitial timeout interval" }, - { 0x04, "timeout", "\t\tServer contact timeout interval" }, - { 0x05, "retry", "\t\tServer contact retry interval" }, + { 0x01, "activate_dhcp", "\tActivate DHCP" }, + { 0x02, "dhcp_config", "\tDHCP Configuration" }, + { 0x03, "init", "\t\tInitial timeout interval" }, + { 0x04, "timeout", "\t\tServer contact timeout interval" }, + { 0x05, "retry", "\t\tServer contact retry interval" }, DCMI_CMD_END(0xFF) }; @@ -164,9 +165,9 @@ const struct dcmi_cmd dcmi_conf_param_vals[] = { /* temperature monitoring capabilities */ const struct dcmi_cmd dcmi_temp_monitoring_vals[] = { - { 0x01, "inlet", " Inlet air temperature sensors" }, - { 0x02, "cpu", " CPU temperature sensors" }, - { 0x03, "baseboard", "Baseboard temperature sensors" }, + { 0x01, "inlet", "Inlet air temperature sensors" }, + { 0x02, "cpu", "CPU temperature sensors" }, + { 0x03, "baseboard", "Baseboard temperature sensors" }, DCMI_CMD_END(0xFF) }; @@ -176,119 +177,119 @@ const struct dcmi_cmd dcmi_temp_monitoring_vals[] = { * sensor number */ const struct dcmi_cmd dcmi_discvry_snsr_vals[] = { - { 0x40, "Inlet", " Inlet air temperature sensors" }, - { 0x41, "CPU", " CPU temperature sensors" }, - { 0x42, "Baseboard", "Baseboard temperature sensors" }, + { 0x40, "Inlet", "Inlet air temperature sensors" }, + { 0x41, "CPU", "CPU temperature sensors" }, + { 0x42, "Baseboard", "Baseboard temperature sensors" }, DCMI_CMD_END(0xFF) }; /* Temperature Readings */ const struct dcmi_cmd dcmi_temp_read_vals[] = { - { 0x40, "Inlet", "Inlet air temperature(40h) " }, - { 0x41, "CPU", "CPU temperature sensors(41h) " }, - { 0x42, "Baseboard", "Baseboard temperature sensors(42h) " }, + { 0x40, "Inlet", "Inlet air temperature(40h)" }, + { 0x41, "CPU", "CPU temperature sensors(41h)" }, + { 0x42, "Baseboard", "Baseboard temperature sensors(42h)" }, DCMI_CMD_END(0xFF) }; /* power management/control commands */ const struct dcmi_cmd dcmi_pwrmgmt_vals[] = { - { 0x00, "reading", " Get power related readings from the system" }, - { 0x01, "get_limit", " Get the configured power limits" }, - { 0x02, "set_limit", " Set a power limit option" }, - { 0x03, "activate", " Activate the set power limit" }, - { 0x04, "deactivate", "Deactivate the set power limit" }, + { 0x00, "reading", "Get power related readings from the system" }, + { 0x01, "get_limit", "Get the configured power limits" }, + { 0x02, "set_limit", "Set a power limit option" }, + { 0x03, "activate", "Activate the set power limit" }, + { 0x04, "deactivate", "Deactivate the set power limit" }, DCMI_CMD_END(0xFF) }; /* set power limit commands */ const struct dcmi_cmd dcmi_pwrmgmt_set_usage_vals[] = { - { 0x00, "action", " <no_action | sel_logging | power_off>" }, - { 0x01, "limit", " <number in Watts>" }, + { 0x00, "action", "<no_action | sel_logging | power_off>" }, + { 0x01, "limit", "<number in Watts>" }, { 0x02, "correction", "<number in milliseconds>" }, - { 0x03, "sample", " <number in seconds>" }, + { 0x03, "sample", "<number in seconds>" }, DCMI_CMD_END(0xFF) }; /* power management/get action commands */ const struct dcmi_cmd dcmi_pwrmgmt_get_action_vals[] = { - { 0x00, "No Action", ""}, - { 0x01, "Hard Power Off & Log Event to SEL", ""}, - - { 0x02, "OEM reserved (02h)", ""}, - { 0x03, "OEM reserved (03h)", ""}, - { 0x04, "OEM reserved (04h)", ""}, - { 0x05, "OEM reserved (05h)", ""}, - { 0x06, "OEM reserved (06h)", ""}, - { 0x07, "OEM reserved (07h)", ""}, - { 0x08, "OEM reserved (08h)", ""}, - { 0x09, "OEM reserved (09h)", ""}, - { 0x0a, "OEM reserved (0ah)", ""}, - { 0x0b, "OEM reserved (0bh)", ""}, - { 0x0c, "OEM reserved (0ch)", ""}, - { 0x0d, "OEM reserved (0dh)", ""}, - { 0x0e, "OEM reserved (0eh)", ""}, - { 0x0f, "OEM reserved (0fh)", ""}, - { 0x10, "OEM reserved (10h)", ""}, - - { 0x11, "Log Event to SEL", ""}, + { 0x00, "No Action", "" }, + { 0x01, "Hard Power Off & Log Event to SEL", "" }, + + { 0x02, "OEM reserved (02h)", "" }, + { 0x03, "OEM reserved (03h)", "" }, + { 0x04, "OEM reserved (04h)", "" }, + { 0x05, "OEM reserved (05h)", "" }, + { 0x06, "OEM reserved (06h)", "" }, + { 0x07, "OEM reserved (07h)", "" }, + { 0x08, "OEM reserved (08h)", "" }, + { 0x09, "OEM reserved (09h)", "" }, + { 0x0a, "OEM reserved (0ah)", "" }, + { 0x0b, "OEM reserved (0bh)", "" }, + { 0x0c, "OEM reserved (0ch)", "" }, + { 0x0d, "OEM reserved (0dh)", "" }, + { 0x0e, "OEM reserved (0eh)", "" }, + { 0x0f, "OEM reserved (0fh)", "" }, + { 0x10, "OEM reserved (10h)", "" }, + + { 0x11, "Log Event to SEL", "" }, DCMI_CMD_END(0xFF) }; /* power management/set action commands */ const struct dcmi_cmd dcmi_pwrmgmt_action_vals[] = { - { 0x00, "no_action", "No Action"}, - { 0x01, "power_off", "Hard Power Off & Log Event to SEL"}, - { 0x11, "sel_logging", "Log Event to SEL"}, - - { 0x02, "oem_02", "OEM reserved (02h)"}, - { 0x03, "oem_03", "OEM reserved (03h)"}, - { 0x04, "oem_04", "OEM reserved (04h)"}, - { 0x05, "oem_05", "OEM reserved (05h)"}, - { 0x06, "oem_06", "OEM reserved (06h)"}, - { 0x07, "oem_07", "OEM reserved (07h)"}, - { 0x08, "oem_08", "OEM reserved (08h)"}, - { 0x09, "oem_09", "OEM reserved (09h)"}, - { 0x0a, "oem_0a", "OEM reserved (0ah)"}, - { 0x0b, "oem_0b", "OEM reserved (0bh)"}, - { 0x0c, "oem_0c", "OEM reserved (0ch)"}, - { 0x0d, "oem_0d", "OEM reserved (0dh)"}, - { 0x0e, "oem_0e", "OEM reserved (0eh)"}, - { 0x0f, "oem_0f", "OEM reserved (0fh)"}, - { 0x10, "oem_10", "OEM reserved (10h)"}, + { 0x00, "no_action", "No Action" }, + { 0x01, "power_off", "Hard Power Off & Log Event to SEL" }, + { 0x11, "sel_logging", "Log Event to SEL" }, + + { 0x02, "oem_02", "OEM reserved (02h)" }, + { 0x03, "oem_03", "OEM reserved (03h)" }, + { 0x04, "oem_04", "OEM reserved (04h)" }, + { 0x05, "oem_05", "OEM reserved (05h)" }, + { 0x06, "oem_06", "OEM reserved (06h)" }, + { 0x07, "oem_07", "OEM reserved (07h)" }, + { 0x08, "oem_08", "OEM reserved (08h)" }, + { 0x09, "oem_09", "OEM reserved (09h)" }, + { 0x0a, "oem_0a", "OEM reserved (0ah)" }, + { 0x0b, "oem_0b", "OEM reserved (0bh)" }, + { 0x0c, "oem_0c", "OEM reserved (0ch)" }, + { 0x0d, "oem_0d", "OEM reserved (0dh)" }, + { 0x0e, "oem_0e", "OEM reserved (0eh)" }, + { 0x0f, "oem_0f", "OEM reserved (0fh)" }, + { 0x10, "oem_10", "OEM reserved (10h)" }, DCMI_CMD_END(0xFF) }; /* thermal policy action commands */ const struct dcmi_cmd dcmi_thermalpolicy_vals[] = { - { 0x00, "get", "Get thermal policy" }, - { 0x01, "set", "Set thermal policy" }, + { 0x00, "get", "Get thermal policy" }, + { 0x01, "set", "Set thermal policy" }, DCMI_CMD_END(0xFF) }; /* thermal policy action commands */ const struct dcmi_cmd dcmi_confparameters_vals[] = { - { 0x00, "get", "Get configuration parameters" }, - { 0x01, "set", "Set configuration parameters" }, + { 0x00, "get", "Get configuration parameters" }, + { 0x01, "set", "Set configuration parameters" }, DCMI_CMD_END(0xFF) }; /* entityIDs used in thermap policy */ const struct dcmi_cmd dcmi_thermalpolicy_set_parameters_vals[] = { - { 0x00, "volatile", " Current Power Cycle" }, - { 0x01, "nonvolatile", "Set across power cycles" }, - { 0x01, "poweroff", " Hard Power Off system" }, - { 0x00, "nopoweroff", " No 'Hard Power Off' action" }, - { 0x01, "sel", " Log event to SEL" }, - { 0x00, "nosel", " No 'Log event to SEL' action" }, - { 0x00, "disabled", " Disabled" }, + { 0x00, "volatile", "Current Power Cycle" }, + { 0x01, "nonvolatile", "Set across power cycles" }, + { 0x01, "poweroff", "Hard Power Off system" }, + { 0x00, "nopoweroff", "No 'Hard Power Off' action" }, + { 0x01, "sel", "Log event to SEL" }, + { 0x00, "nosel", "No 'Log event to SEL' action" }, + { 0x00, "disabled", "Disabled" }, DCMI_CMD_END(0) }; @@ -323,44 +324,44 @@ const struct valstr dcmi_ccode_vals[] = { */ const struct dcmi_cmd dcmi_sampling_vals[] = { - { 0x05, "5_sec", "" }, + { 0x05, "5_sec", "" }, { 0x0f, "15_sec", "" }, { 0x1E, "30_sec", "" }, - { 0x41, "1_min", "" }, - { 0x43, "3_min", "" }, - { 0x47, "7_min", "" }, + { 0x41, "1_min", "" }, + { 0x43, "3_min", "" }, + { 0x47, "7_min", "" }, { 0x4F, "15_min", "" }, { 0x5E, "30_min", "" }, - { 0x81, "1_hour", ""}, + { 0x81, "1_hour", "" }, DCMI_CMD_END(0) }; /* Primary Node Manager commands */ const struct dcmi_cmd nm_cmd_vals[] = { - { 0x00, "discover", "Discover Node Manager " }, + { 0x00, "discover", "Discover Node Manager" }, { 0x01, "capability", "Get Node Manager Capabilities" }, - { 0x02, "control", "Enable/Disable Policy Control" }, - { 0x03, "policy", "Add/Remove Policies" }, + { 0x02, "control", "Enable/Disable Policy Control" }, + { 0x03, "policy", "Add/Remove Policies" }, { 0x04, "statistics", "Get Statistics" }, - { 0x05, "power", "Set Power Draw Range" }, - { 0x06, "suspend", "Set/Get Policy suspend periods" }, - { 0x07, "reset", "Reset Statistics" }, - { 0x08, "alert", "Set/Get/Clear Alert destination" }, - { 0x09, "threshold", "Set/Get Alert Thresholds" }, + { 0x05, "power", "Set Power Draw Range" }, + { 0x06, "suspend", "Set/Get Policy suspend periods" }, + { 0x07, "reset", "Reset Statistics" }, + { 0x08, "alert", "Set/Get/Clear Alert destination" }, + { 0x09, "threshold", "Set/Get Alert Thresholds" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_ctl_cmds[] = { - { 0x01, "enable", " <control scope>" }, - { 0x00, "disable", "<control scope>"}, + { 0x01, "enable", "<control scope>" }, + { 0x00, "disable", "<control scope>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_ctl_domain[] = { - { 0x00, "global", "" }, + { 0x00, "global", "" }, { 0x02, "per_domain", "<platform|CPU|Memory> (default is platform)" }, { 0x04, "per_policy", "<0-7>" }, @@ -369,11 +370,11 @@ const struct dcmi_cmd nm_ctl_domain[] = { /* Node Manager Domain codes */ const struct dcmi_cmd nm_domain_vals[] = { - { 0x00, "platform", "" }, - { 0x01, "CPU", "" }, - { 0x02, "Memory", "" }, + { 0x00, "platform", "" }, + { 0x01, "CPU", "" }, + { 0x02, "Memory", "" }, { 0x03, "protection", "" }, - { 0x04, "I/O", "" }, + { 0x04, "I/O", "" }, DCMI_CMD_END(0xFF), }; @@ -389,66 +390,72 @@ const struct dcmi_cmd nm_version_vals[] = { }; const struct dcmi_cmd nm_capability_opts[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "inlet", "Inlet temp trigger" }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x02, "inlet", "Inlet temp trigger" }, { 0x03, "missing", "Missing Power reading trigger" }, - { 0x04, "reset", "Time after Host reset trigger" }, - { 0x05, "boot", "Boot time policy" }, + { 0x04, "reset", "Time after Host reset trigger" }, + { 0x05, "boot", "Boot time policy" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_type_vals[] = { - { 0x00, "No trigger, use Power Limit", "" }, - { 0x01, "Inlet temp trigger", "" }, - { 0x02, "Missing Power reading trigger", "" }, - { 0x03, "Time after Host reset trigger", "" }, + { 0x00, "No trigger, use Power Limit", "" }, + { 0x01, "Inlet temp trigger", "" }, + { 0x02, "Missing Power reading trigger", "" }, + { 0x03, "Time after Host reset trigger", "" }, { 0x04, "number of cores to disable at boot time", "" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_stats_opts[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, { 0x02, "policy_id", "<0-7>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_stats_mode[] = { - { 0x01, "power", "global power" }, - { 0x02, "temps", "inlet temperature" }, - { 0x11, "policy_power", "per policy power" }, - { 0x12, "policy_temps", "per policy inlet temp" }, - { 0x13, "policy_throt", "per policy throttling stats" }, - { 0x1B, "requests", "unhandled requests" }, - { 0x1C, "response", "response time" }, + { 0x01, "power", "global power" }, + { 0x02, "temps", "inlet temperature" }, + { 0x11, "policy_power", "per policy power" }, + { 0x12, "policy_temps", "per policy inlet temp" }, + { 0x13, "policy_throt", "per policy throttling stats" }, + { 0x1B, "requests", "unhandled requests" }, + { 0x1C, "response", "response time" }, { 0x1D, "cpu_throttling", "CPU throttling" }, { 0x1E, "mem_throttling", "memory throttling" }, - { 0x1F, "comm_fail", "host communication failures" }, + { 0x1F, "comm_fail", "host communication failures" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_action[] = { - { 0x00, "get", "nm policy get policy_id <0-7> [domain <platform|CPU|Memory>]" }, - { 0x04, "add", "nm policy add policy_id <0-7> [domain <platform|CPU|Memory>] correction auto|soft|hard power <watts>|inlet <temp> trig_lim <param> stats <seconds> enable|disable" }, - { 0x05, "remove", "nm policy remove policy_id <0-7> [domain <platform|CPU|Memory>]" }, + { 0x00, "get", "nm policy get policy_id <0-7> " + "[domain <platform|CPU|Memory>]" }, + { 0x04, "add", "nm policy add policy_id <0-7> " + "[domain <platform|CPU|Memory>] " + "correction auto|soft|hard power <watts> | " + "inlet <temp> trig_lim <param> " + "stats <seconds> enable|disable" }, + { 0x05, "remove", "nm policy remove policy_id <0-7> " + "[domain <platform|CPU|Memory>]" }, { 0x06, "limiting", "nm policy limiting [domain <platform|CPU|Memory>]" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_options[] = { - { 0x01, "enable", "" }, - { 0x02, "disable", "" }, - { 0x03, "domain", "" }, - { 0x04, "inlet", "inlet air temp full limiting (SCRAM)"}, - { 0x06, "correction", "auto, soft, hard" }, - { 0x08, "power", "power limit in watts" }, - { 0x09, "trig_lim", "time to send alert" }, - { 0x0A, "stats", "moving window averaging time" }, + { 0x01, "enable", "" }, + { 0x02, "disable", "" }, + { 0x03, "domain", "" }, + { 0x04, "inlet", "inlet air temp full limiting (SCRAM)" }, + { 0x06, "correction" "auto, soft, hard" }, + { 0x08, "power", "power limit in watts" }, + { 0x09, "trig_lim", "time to send alert" }, + { 0x0A, "stats", "moving window averaging time" }, { 0x0B, "policy_id", "policy number" }, - { 0x0C, "volatile", "save policy in volatiel memory" }, + { 0x0C, "volatile", "save policy in volatiel memory" }, { 0x0D, "cores_off", "at boot time, disable N cores" }, DCMI_CMD_END(0xFF), @@ -456,10 +463,10 @@ const struct dcmi_cmd nm_policy_options[] = { /* if "trigger" command used from nm_policy_options */ const struct dcmi_cmd nm_trigger[] = { - { 0x00, "none", "" }, - { 0x01, "temp", "" }, + { 0x00, "none", "" }, + { 0x01, "temp", "" }, { 0x02, "reset", "" }, - { 0x03, "boot", "" }, + { 0x03, "boot", "" }, DCMI_CMD_END(0xFF), }; @@ -477,92 +484,97 @@ const struct dcmi_cmd nm_correction[] = { const struct dcmi_cmd nm_correction_vals[] = { { 0x00, "no T-state use", "" }, { 0x01, "no T-state use", "" }, - { 0x02, "use T-states", "" }, + { 0x02, "use T-states", "" }, DCMI_CMD_END(0xFF), }; /* if "exception" used from nm_policy_options */ const struct dcmi_cmd nm_exception[] = { - { 0x00, "none", "" }, - { 0x01, "alert", "" }, + { 0x00, "none", "" }, + { 0x01, "alert", "" }, { 0x02, "shutdown", "" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_reset_mode[] = { - { 0x00, "global", "" }, + { 0x00, "global", "" }, { 0x01, "per_policy", "" }, - { 0x1B, "requests", "" }, - { 0x1C, "response", "" }, + { 0x1B, "requests", "" }, + { 0x1C, "response", "" }, { 0x1D, "throttling", "" }, - { 0x1E, "memory", "", }, - { 0x1F, "comm", "" }, + { 0x1E, "memory", "" }, + { 0x1F, "comm", "" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_power_range[] = { { 0x01, "domain", "domain <platform|CPU|Memory> (default is platform)" }, - { 0x02, "min", " min <integer value>" }, - { 0x03, "max", "max <integer value>" }, + { 0x02, "min", "min <integer value>" }, + { 0x03, "max", "max <integer value>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_alert_opts[] = { - { 0x01, "set", "nm alert set chan <chan> dest <dest> string <string>" }, - { 0x02, "get", "nm alert get" }, + { 0x01, "set", "nm alert set chan <chan> dest <dest> string <string>" }, + { 0x02, "get", "nm alert get" }, { 0x03, "clear", "nm alert clear dest <dest>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_set_alert_param[] = { - { 0x01, "chan", "chan <channel>" }, - { 0x02, "dest", "dest <destination>" }, + { 0x01, "chan", "chan <channel>" }, + { 0x02, "dest", "dest <destination>" }, { 0x03, "string", "string <string>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_thresh_cmds[] = { - { 0x01, "set", "nm thresh set [domain <platform|CPU|Memory>] policy_id <policy> thresh_array" }, - { 0x02, "get", "nm thresh get [domain <platform|CPU|Memory>] policy_id <policy>" }, + { 0x01, "set", "nm thresh set [domain <platform|CPU|Memory>] " + "policy_id <policy> thresh_array" }, + { 0x02, "get", "nm thresh get [domain <platform|CPU|Memory>] " + "policy_id <policy>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_thresh_param[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, { 0x02, "policy_id", "<0-7>" }, DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_suspend_cmds[] = { - { 0x01, "set", "nm suspend set [domain <platform|CPU|Memory]> policy_id <policy> <start> <stop> <pattern>" }, - { 0x02, "get", "nm suspend get [domain <platform|CPU|Memory]> policy_id <policy>" }, + { 0x01, "set", "nm suspend set [domain <platform|CPU|Memory]> " + "policy_id <policy> <start> " + "<stop> <pattern>" }, + { 0x02, "get", "nm suspend get [domain <platform|CPU|Memory]> " + "policy_id <policy>" }, DCMI_CMD_END(0xFF), }; const struct valstr nm_ccode_vals[] = { - { 0x80, "Policy ID Invalid"}, - { 0x81, "Domain ID Invalid"}, - { 0x82, "Unknown policy trigger type"}, - { 0x84, "Power Limit out of range"}, - { 0x85, "Correction Time out of range"}, - { 0x86, "Policy Trigger value out of range"}, - { 0x88, "Invalid Mode"}, - { 0x89, "Statistics Reporting Period out of range"}, - { 0x8B, "Invalid value for Aggressive CPU correction field"}, - { 0xA1, "No policy is currently limiting for the specified domain ID"}, - { 0xC4, "No space available"}, - { 0xD4, "Insufficient privledge level due wrong responder LUN"}, - { 0xD5, "Policy exists and param unchangeable while enabled"}, - { 0xD6, "Command subfunction disabled or unavailable"}, + { 0x80, "Policy ID Invalid" }, + { 0x81, "Domain ID Invalid" }, + { 0x82, "Unknown policy trigger type" }, + { 0x84, "Power Limit out of range" }, + { 0x85, "Correction Time out of range" }, + { 0x86, "Policy Trigger value out of range" }, + { 0x88, "Invalid Mode" }, + { 0x89, "Statistics Reporting Period out of range" }, + { 0x8B, "Invalid value for Aggressive CPU correction field" }, + { 0xA1, "No policy is currently limiting for the specified domain ID" }, + { 0xC4, "No space available" }, + { 0xD4, "Insufficient privledge level due wrong responder LUN" }, + { 0xD5, "Policy exists and param unchangeable while enabled" }, + { 0xD6, "Command subfunction disabled or unavailable" }, { 0xFF, NULL }, }; @@ -582,7 +594,7 @@ const struct valstr nm_ccode_vals[] = { */ void print_strs(const struct dcmi_cmd * vs, const char * title, int loglevel, - int verthorz) + int verthorz) { int i; @@ -643,10 +655,8 @@ str2val2(const char *str, const struct dcmi_cmd *vs) return 0; } for (i = 0; vs[i].str != NULL; i++) { - if (strncasecmp(vs[i].str, str, - __maxlen(str, vs[i].str)) == 0) { + if (strncasecmp(vs[i].str, str, __maxlen(str, vs[i].str)) == 0) return vs[i].val; - } } return vs[i].val; } @@ -696,16 +706,17 @@ chk_rsp(struct ipmi_rs * rsp) */ if ((rsp->ccode >= 0x80) && (rsp->ccode <= 0x8F)) { lprintf(LOG_ERR, "\n DCMI request failed because: %s (%x)", - val2str(rsp->ccode, dcmi_ccode_vals), rsp->ccode); + val2str(rsp->ccode, dcmi_ccode_vals), rsp->ccode); return 1; } else if (rsp->ccode > 0) { lprintf(LOG_ERR, "\n DCMI request failed because: %s (%x)", - val2str(rsp->ccode, completion_code_vals), rsp->ccode); + val2str(rsp->ccode, completion_code_vals), rsp->ccode); return 1; } /* check to make sure this is a DCMI firmware */ if(rsp->data[0] != IPMI_DCMI) { - printf("\n A valid DCMI command was not returned! (%x)", rsp->data[0]); + printf("\n A valid DCMI command was not returned! (%x)", + rsp->data[0]); return 1; } return 0; @@ -835,7 +846,7 @@ ipmi_dcmi_prnt_oobDiscover(struct ipmi_intf * intf) if (intf->fd < 0) { lperror(LOG_ERR, "Connect to %s failed", - p->hostname); + p->hostname); intf->close(intf); return -1; } @@ -871,16 +882,17 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) memcpy(&reply, rsp->data, sizeof (reply)); /* check to make sure that this is a 1.0/1.1/1.5 command */ if ((cape.conformance != IPMI_DCMI_CONFORM) - && (cape.conformance != IPMI_DCMI_1_1_CONFORM) - && (cape.conformance != IPMI_DCMI_1_5_CONFORM)) { + && (cape.conformance != IPMI_DCMI_1_1_CONFORM) + && (cape.conformance != IPMI_DCMI_1_5_CONFORM)) + { lprintf(LOG_ERR, - "ERROR! This command is not available on this platform"); + "ERROR! This command is not available on this platform"); return -1; } /* check to make sure that this is a rev .01 or .02 */ if (cape.revision != 0x01 && cape.revision != 0x02) { lprintf(LOG_ERR, - "ERROR! This command is not compatible with this version"); + "ERROR! This command is not compatible with this version"); return -1; } /* 0x01 - platform capabilities @@ -897,20 +909,20 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) * struct */ printf("\n Mandatory platform capabilties\n"); - display_capabilities_attributes( - dcmi_mandatory_platform_capabilities, cape.data_byte1); + display_capabilities_attributes(dcmi_mandatory_platform_capabilities, + cape.data_byte1); /* loop through each of the entries in the second byte from the * struct */ printf("\n Optional platform capabilties\n"); - display_capabilities_attributes( - dcmi_optional_platform_capabilities, cape.data_byte2); + display_capabilities_attributes(dcmi_optional_platform_capabilities, + cape.data_byte2); /* loop through each of the entries in the third byte from the * struct */ printf("\n Managebility access capabilties\n"); - display_capabilities_attributes( - dcmi_management_access_capabilities, cape.data_byte3); + display_capabilities_attributes(dcmi_management_access_capabilities, + cape.data_byte3); break; case 0x02: printf("\n Mandatory platform attributes:\n"); @@ -934,12 +946,12 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf("\n %d SEL entries\n", sel_entries & 0xFFF); /* byte 3 data */ printf("\n Identification Attributes: \n"); - display_capabilities_attributes( - dcmi_id_capabilities_vals, cape.data_byte3); + display_capabilities_attributes(dcmi_id_capabilities_vals, + cape.data_byte3); /* byte 4 data */ printf("\n Temperature Monitoring Attributes: \n"); display_capabilities_attributes(dcmi_temp_monitoring_vals, - cape.data_byte4); + cape.data_byte4); break; case 0x03: printf("\n Optional Platform Attributes: \n"); @@ -949,19 +961,19 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf(" Slave address of device: 20h (BMC)\n" ); } else { printf(" Slave address of device: %xh (8bits)" - "(Satellite/External controller)\n", - cape.data_byte1); + "(Satellite/External controller)\n", + cape.data_byte1); } /* Controller channel number (4-7) bits */ if ((cape.data_byte2>>4) == 0x00) { printf(" Channel number is 0h (Primary BMC)\n"); } else { printf(" Channel number is %xh \n", - (cape.data_byte2>>4)); + (cape.data_byte2 >> 4)); } /* Device revision (0-3) */ printf(" Device revision is %d \n", - cape.data_byte2 &0xf); + cape.data_byte2 & 0xf); break; case 0x04: /* LAN */ @@ -970,20 +982,20 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf(" Primary LAN channel is not available for OOB\n"); } else { printf(" Primary LAN channel number: %d is available\n", - cape.data_byte1); + cape.data_byte1); } if (cape.data_byte2 == 0xFF) { printf(" Secondary LAN channel is not available for OOB\n"); } else { printf(" Secondary LAN channel number: %d is available\n", - cape.data_byte2); + cape.data_byte2); } /* serial */ if (cape.data_byte3 == 0xFF) { printf(" No serial channel is available\n"); } else { printf(" Serial channel number: %d is available\n", - cape.data_byte3); + cape.data_byte3); } break; case 0x05: @@ -1057,8 +1069,9 @@ ipmi_dcmi_prnt_getassettag(struct ipmi_intf * intf) taglength = rsp->data[1]; printf("\n Asset tag: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Add parentheses for clarity */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; rsp = ipmi_dcmi_getassettag(intf, offset, getlength); /* macro has no effect here where can generate sig segv * if rsp occurs with null @@ -1130,8 +1143,9 @@ ipmi_dcmi_prnt_setassettag(struct ipmi_intf * intf, uint8_t * data) } printf("\n Set Asset Tag: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; memcpy(tmpData, data + offset, getlength); rsp = ipmi_dcmi_setassettag(intf, offset, getlength, tmpData); if (chk_rsp(rsp)) { @@ -1195,8 +1209,9 @@ ipmi_dcmi_prnt_getmngctrlids(struct ipmi_intf * intf) printf("\n Get Management Controller Identifier String: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; rsp = ipmi_dcmi_getmngctrlids(intf, offset, getlength); if (chk_rsp(rsp)) { @@ -1272,8 +1287,9 @@ ipmi_dcmi_prnt_setmngctrlids(struct ipmi_intf * intf, uint8_t * data) printf("\n Set Management Controller Identifier String Command: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; memcpy(tmpData, data + offset, getlength); rsp = ipmi_dcmi_setmngctrlids(intf, offset, getlength, tmpData); /* because after call "Set mc id string" RMCP+ will go down @@ -1348,9 +1364,9 @@ ipmi_dcmi_prnt_discvry_snsr(struct ipmi_intf * intf, uint8_t isnsr) } instances = rsp->data[1]; printf("\n%s: %d temperature sensor%s found:\n", - val2str2(isnsr, dcmi_discvry_snsr_vals), - instances, - (instances > 1) ? "s" : ""); + val2str2(isnsr, dcmi_discvry_snsr_vals), + instances, + (instances > 1) ? "s" : ""); while(instances > 0) { ipmi_dcmi_discvry_snsr(intf, isnsr, offset); if (chk_rsp(rsp)) { @@ -1418,15 +1434,15 @@ ipmi_dcmi_pwr_rd(struct ipmi_intf * intf, uint8_t sample_time) gmtime_r(&t, &tm_t); printf("\n"); printf(" Instantaneous power reading: %8d Watts\n", - val.curr_pwr); + val.curr_pwr); printf(" Minimum during sampling period: %8d Watts\n", - val.min_sample); + val.min_sample); printf(" Maximum during sampling period: %8d Watts\n", - val.max_sample); + val.max_sample); printf(" Average power reading over sample period: %8d Watts\n", - val.avg_pwr); + val.avg_pwr); printf(" IPMI timestamp: %s", - asctime(&tm_t)); + asctime(&tm_t)); printf(" Sampling period: "); if (sample_time) printf("%s \n", val2str2(val.sample,dcmi_sampling_vals)); @@ -1477,16 +1493,16 @@ ipmi_dcmi_getthermalpolicy(struct ipmi_intf * intf, uint8_t entityID, memcpy(&val, rsp->data, sizeof (val)); printf("\n"); printf(" Persistence flag is: %s\n", - ((val.exceptionActions & 0x80) ? "set" : "notset")); + ((val.exceptionActions & 0x80) ? "set" : "notset")); printf(" Exception Actions, taken if the Temperature Limit exceeded:\n"); printf(" Hard Power Off system and log event: %s\n", - ((val.exceptionActions & 0x40) ? "active":"inactive")); + ((val.exceptionActions & 0x40) ? "active":"inactive")); printf(" Log event to SEL only: %s\n", - ((val.exceptionActions & 0x20) ? "active":"inactive")); + ((val.exceptionActions & 0x20) ? "active":"inactive")); printf(" Temperature Limit %d degrees\n", - val.tempLimit); + val.tempLimit); printf(" Exception Time %d seconds\n", - val.exceptionTime); + val.exceptionTime); printf("\n\n"); return 0; } @@ -1497,14 +1513,14 @@ ipmi_dcmi_getthermalpolicy(struct ipmi_intf * intf, uint8_t entityID, */ int ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, - uint8_t entityID, - uint8_t entityInst, - uint8_t persistanceFlag, - uint8_t actionHardPowerOff, - uint8_t actionLogToSEL, - uint8_t tempLimit, - uint8_t samplingTimeLSB, - uint8_t samplingTimeMSB) + uint8_t entityID, + uint8_t entityInst, + uint8_t persistanceFlag, + uint8_t actionHardPowerOff, + uint8_t actionLogToSEL, + uint8_t tempLimit, + uint8_t samplingTimeLSB, + uint8_t samplingTimeMSB) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1515,8 +1531,8 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, msg_data[2] = entityInst; /* Entity Instance */ /* persistance and actions or disabled if no actions */ msg_data[3] = (((persistanceFlag ? 1 : 0) << 7) | - ((actionHardPowerOff? 1 : 0) << 6) | - ((actionLogToSEL ? 1 : 0) << 5)); + ((actionHardPowerOff? 1 : 0) << 6) | + ((actionLogToSEL ? 1 : 0) << 5)); msg_data[4] = tempLimit; msg_data[5] = samplingTimeLSB; msg_data[6] = samplingTimeMSB; @@ -1535,7 +1551,7 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, } /* rsp->data[0] is equal to response data byte 2 in spec */ printf("\nThermal policy %d for %0Xh entity successfully set.\n\n", - entityInst, entityID); + entityInst, entityID); return 0; } @@ -1547,9 +1563,9 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, */ struct ipmi_rs * ipmi_dcmi_get_temp_readings(struct ipmi_intf * intf, - uint8_t entityID, - uint8_t entityInst, - uint8_t entityInstStart) + uint8_t entityID, + uint8_t entityInst, + uint8_t entityInstStart) { struct ipmi_rq req; uint8_t msg_data[5]; /* number of request data bytes */ @@ -1579,7 +1595,8 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) for (i = 0; dcmi_temp_read_vals[i].str != NULL; i++) { /* get all of the information about this sensor */ rsp = ipmi_dcmi_get_temp_readings(intf, - dcmi_temp_read_vals[i].val, 0, 0); + dcmi_temp_read_vals[i].val, + 0, 0); if (chk_rsp(rsp)) { continue; } @@ -1588,10 +1605,11 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) tota_inst = rsp->data[1]; while (tota_inst > 0) { get_inst = ((tota_inst / DCMI_MAX_BYTE_TEMP_READ_SIZE) ? - DCMI_MAX_BYTE_TEMP_READ_SIZE : - (tota_inst % DCMI_MAX_BYTE_TEMP_READ_SIZE)); + DCMI_MAX_BYTE_TEMP_READ_SIZE : + (tota_inst % DCMI_MAX_BYTE_TEMP_READ_SIZE)); rsp = ipmi_dcmi_get_temp_readings(intf, - dcmi_temp_read_vals[i].val, offset, 0); + dcmi_temp_read_vals[i].val, + offset, 0); if (chk_rsp(rsp)) { continue; } @@ -1602,8 +1620,9 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) /* Print Instance temperature info */ printf("\n%s",dcmi_temp_read_vals[i].desc); printf("\t\t%i\t\t%c%i C", rsp->data[j+4], - ((rsp->data[j+3]) >> 7) ? - '-' : '+', (rsp->data[j+3] & 127)); + ((rsp->data[j+3]) >> 7) ? '-' + : '+', + (rsp->data[j+3] & 127)); } offset += get_inst; tota_inst -= get_inst; @@ -1648,8 +1667,10 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) int param_selector; uint16_t tmp_value = 0; /* We are not interested in parameter 1 which always will return 0 */ - for (param_selector = 2 ; param_selector <= dcmi_conf_params; - param_selector++) { + for (param_selector = 2; + param_selector <= dcmi_conf_params; + param_selector++) + { rsp = ipmi_dcmi_getconfparam(intf, param_selector); if (chk_rsp(rsp)) { return -1; @@ -1660,9 +1681,10 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) tmp_value = (rsp->data[4])& 1; printf("\n\tDHCP Discovery method\t: "); printf("\n\t\tManagement Controller ID String is %s", - tmp_value ? "enabled" : "disabled"); - printf("\n\t\tVendor class identifier DCMI IANA and Vendor class-specific Informationa are %s", - ((rsp->data[4])& 2) ? "enabled" : "disabled" ); + tmp_value ? "enabled" : "disabled"); + printf("\n\t\tVendor class identifier DCMI IANA and Vendor " + "class-specific Informationa are %s", + ((rsp->data[4])& 2) ? "enabled" : "disabled" ); break; case 3: printf("\n\tInitial timeout interval\t: %i seconds", @@ -1670,11 +1692,11 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) break; case 4: printf("\n\tServer contact timeout interval\t: %i seconds", - rsp->data[4] + (rsp->data[5]<<8)); + rsp->data[4] + (rsp->data[5]<<8)); break; case 5: printf("\n\tServer contact retry interval\t: %i seconds", - rsp->data[4] + (rsp->data[5] << 8)); + rsp->data[4] + (rsp->data[5] << 8)); break; default: printf("\n\tConfiguration Parameter not supported."); @@ -1784,10 +1806,10 @@ ipmi_dcmi_pwr_prnt_glimit(struct ipmi_intf * intf) /* printf("Group Extension Identification: %02x\n", rsp->data[0]); */ memcpy(&val, rsp->data, sizeof (val)); printf("\n Current Limit State: %s\n", - (realCc == 0) ? - "Power Limit Active" : "No Active Power Limit"); + (realCc == 0) ? + "Power Limit Active" : "No Active Power Limit"); printf(" Exception actions: %s\n", - val2str2(val.action, dcmi_pwrmgmt_get_action_vals)); + val2str2(val.action, dcmi_pwrmgmt_get_action_vals)); printf(" Power Limit: %i Watts\n", val.limit); printf(" Correction time: %i milliseconds\n", val.correction); printf(" Sampling period: %i seconds\n", val.sample); @@ -1845,8 +1867,8 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, * val.sample = *(uint16_t*)(&rsp->data[12]); */ lprintf(LOG_INFO, - "DCMI IN Limit=%d Correction=%d Action=%d Sample=%d\n", - val.limit, val.correction, val.action, val.sample); + "DCMI IN Limit=%d Correction=%d Action=%d Sample=%d\n", + val.limit, val.correction, val.action, val.sample); switch (str2val2(option, dcmi_pwrmgmt_set_usage_vals)) { case 0x00: /* action */ @@ -1926,7 +1948,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, case 0xFF: /* error - not a string we knew what to do with */ lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return -1; } break; @@ -1934,7 +1956,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* limit */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.limit = *(uint16_t*)(&lvalue); @@ -1943,7 +1965,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* correction */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.correction = *(uint32_t*)(&lvalue); @@ -1952,7 +1974,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* sample */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.sample = *(uint16_t*)(&lvalue); @@ -2073,7 +2095,8 @@ _ipmi_nm_discover(struct ipmi_intf * intf, struct nm_discover *disc) * @caps: fills in capability struct */ static int -_ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, uint8_t trigger, struct nm_capability *caps) +_ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, + uint8_t trigger, struct nm_capability *caps) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2098,7 +2121,8 @@ _ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, uint8_t trigge } static int -_ipmi_nm_get_policy(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, struct nm_get_policy *policy) +_ipmi_nm_get_policy(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, struct nm_get_policy *policy) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2132,7 +2156,9 @@ _ipmi_nm_set_policy(struct ipmi_intf * intf, struct nm_policy *policy) req.msg.cmd = IPMI_NM_SET_POLICY; req.msg.data = (uint8_t *)policy; req.msg.data_len = sizeof(struct nm_policy); - policy->intel_id[0] = 0x57; policy->intel_id[1] =1; policy->intel_id[2] =0; + policy->intel_id[0] = 0x57; + policy->intel_id[1] = 1; + policy->intel_id[2] = 0; rsp = intf->sendrecv(intf, &req); if (chk_nm_rsp(rsp)) { return -1; @@ -2166,7 +2192,8 @@ _ipmi_nm_policy_limiting(struct ipmi_intf * intf, uint8_t domain) } static int -_ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, uint8_t domain, uint8_t policy_id) +_ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, + uint8_t domain, uint8_t policy_id) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2200,7 +2227,8 @@ _ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, uint8_t domain, uint8_t * @selector: Parameter selector */ static int -_ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8_t policy_id, struct nm_statistics *caps) +_ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, + uint8_t policy_id, struct nm_statistics *caps) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2226,7 +2254,8 @@ _ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8 } static int -_ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8_t policy_id) +_ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, + uint8_t domain, uint8_t policy_id) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2251,7 +2280,8 @@ _ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint } static int -_nm_set_range(struct ipmi_intf * intf, uint8_t domain, uint16_t minimum, uint16_t maximum) +_nm_set_range(struct ipmi_intf * intf, uint8_t domain, + uint16_t minimum, uint16_t maximum) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2333,7 +2363,8 @@ _ipmi_nm_set_alert(struct ipmi_intf * intf, struct nm_set_alert *alert) * This array is filled in for valid thresholds returned. */ static int -_ipmi_nm_get_thresh(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, uint16_t *list) +_ipmi_nm_get_thresh(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, uint16_t *list) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2406,7 +2437,8 @@ _ipmi_nm_set_thresh(struct ipmi_intf * intf, struct nm_thresh * thresh) * */ static int -_ipmi_nm_get_suspend(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, int *count, struct nm_period *periods) +_ipmi_nm_get_suspend(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, int *count, struct nm_period *periods) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2449,9 +2481,12 @@ _ipmi_nm_set_suspend(struct ipmi_intf * intf, struct nm_suspend *suspend) msg_data[1] = 1; msg_data[2] = 0; msg_data[3] = suspend->domain; - msg_data[4] = suspend->policy_id; + msg_data[4] = suspend->policy_id; msg_data[5] = suspend->count; - for (i = 0, periods = &suspend->period[0]; i < (suspend->count*3); i += 3, periods++) { + for (i = 0, periods = &suspend->period[0]; + i < (suspend->count*3); + i += 3, periods++) + { msg_data[6+i] = periods->start; msg_data[7+i] = periods->stop; msg_data[8+i] = periods->repeat; @@ -2461,8 +2496,8 @@ _ipmi_nm_set_suspend(struct ipmi_intf * intf, struct nm_suspend *suspend) req.msg.netfn = IPMI_NETFN_OEM; req.msg.cmd = IPMI_NM_SET_SUSPEND; req.msg.data = msg_data; - rsp = intf->sendrecv(intf, &req); - if (chk_nm_rsp(rsp)) { + rsp = intf->sendrecv(intf, &req); + if (chk_nm_rsp(rsp)) { return -1; } return 0; @@ -2476,7 +2511,7 @@ ipmi_nm_getcapabilities(struct ipmi_intf * intf, int argc, char **argv) uint8_t trigger = 0; /* default power policy (no trigger) */ struct nm_capability caps; - while (--argc > 0) { + while (--argc > 0) { argv++; if (argv[0] == NULL) break; if ((option = str2val2(argv[0], nm_capability_opts)) == 0xFF) { @@ -2514,35 +2549,35 @@ ipmi_nm_getcapabilities(struct ipmi_intf * intf, int argc, char **argv) return -1; if (csv_output) { printf("%d,%u,%u,%u,%u,%u,%u,%s\n", - caps.max_settings, caps.max_value,caps.min_value, - caps.min_corr/1000, caps.max_corr/1000, - caps.min_stats, caps.max_stats, - val2str2(caps.scope&0xF, nm_domain_vals)); + caps.max_settings, caps.max_value,caps.min_value, + caps.min_corr/1000, caps.max_corr/1000, + caps.min_stats, caps.max_stats, + val2str2(caps.scope&0xF, nm_domain_vals)); return 0; } printf(" power policies:\t\t%d\n", caps.max_settings); switch (trigger&0xF) { case 0: /* power */ printf(" max_power\t\t%7u Watts\n min_power\t\t%7u Watts\n", - caps.max_value, caps.min_value); + caps.max_value, caps.min_value); break; case 1: /* Inlet */ printf(" max_temp\t\t%7u C\n min_temp\t\t%7u C\n", - caps.max_value, caps.min_value); + caps.max_value, caps.min_value); break; case 2: /* Missing reading time */ case 3: /* Time after host reset */ printf(" max_time\t\t%7u Secs\n min_time\t\t%7u Secs\n", - caps.max_value/10, caps.min_value/10); + caps.max_value/10, caps.min_value/10); break; case 4: /* boot time policy does not use these values */ default: break; } printf(" min_corr\t\t%7u secs\n max_corr\t\t%7u secs\n", - caps.min_corr/1000, caps.max_corr/1000); + caps.min_corr/1000, caps.max_corr/1000); printf(" min_stats\t\t%7u secs\n max_stats\t\t%7u secs\n", - caps.min_stats, caps.max_stats); + caps.min_stats, caps.max_stats); printf(" domain scope:\t%s\n", val2str2(caps.scope&0xF, nm_domain_vals)); return 0; } @@ -2585,53 +2620,54 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if (policy_id == 0xFF) { + if (policy_id == 0xFF) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); - return -1; - } + return -1; + } if (_ipmi_nm_get_policy(intf, policy.domain, policy_id, &policy)) return -1; if (csv_output) { printf("%s,0x%x,%s,%s,%s,%u,%u,%u,%u,%s\n", - val2str2(policy.domain&0xF, nm_domain_vals), - policy.domain, - (policy.policy_type & 0x10) ? "power" : "nopower ", - val2str2(policy.policy_type & 0xF, nm_policy_type_vals), - val2str2(policy.policy_exception, nm_exception), - policy.policy_limits, - policy.corr_time, - policy.trigger_limit, - policy.stats_period, - policy.policy_type & 0x80 ? "volatile" : "non-volatile"); + val2str2(policy.domain&0xF, nm_domain_vals), + policy.domain, + (policy.policy_type & 0x10) ? "power" : "nopower ", + val2str2(policy.policy_type & 0xF, nm_policy_type_vals), + val2str2(policy.policy_exception, nm_exception), + policy.policy_limits, + policy.corr_time, + policy.trigger_limit, + policy.stats_period, + policy.policy_type & 0x80 ? "volatile" : "non-volatile"); return 0; } printf(" Power domain: %s\n", - val2str2(policy.domain&0xF, nm_domain_vals)); + val2str2(policy.domain&0xF, nm_domain_vals)); printf(" Policy is %s %s%s%s\n", - policy.domain&0x10 ? "enabled" : "not enabled", - policy.domain&0x20 ? "per Domain " : "", - policy.domain&0x40 ? "Globally " : "", - policy.domain&0x80 ? "via DCMI api " : ""); - printf(" Policy is %sa power control type.\n", (policy.policy_type & 0x10) ? "" : "not "); + policy.domain&0x10 ? "enabled" : "not enabled", + policy.domain&0x20 ? "per Domain " : "", + policy.domain&0x40 ? "Globally " : "", + policy.domain&0x80 ? "via DCMI api " : ""); + printf(" Policy is %sa power control type.\n", + (policy.policy_type & 0x10) ? "" : "not "); printf(" Policy Trigger Type: %s\n", - val2str2(policy.policy_type & 0xF, nm_policy_type_vals)); + val2str2(policy.policy_type & 0xF, nm_policy_type_vals)); printf(" Correction Aggressiveness: %s\n", - val2str2((policy.policy_type>> 5) & 0x3, nm_correction_vals)); + val2str2((policy.policy_type>> 5) & 0x3, nm_correction_vals)); printf(" Policy Exception Actions: %s\n", - val2str2(policy.policy_exception, nm_exception)); + val2str2(policy.policy_exception, nm_exception)); printf(" Power Limit: %u Watts\n", - policy.policy_limits); + policy.policy_limits); printf(" Correction Time Limit: %u milliseconds\n", - policy.corr_time); + policy.corr_time); printf(" Trigger Limit: %u units\n", - policy.trigger_limit); + policy.trigger_limit); printf(" Statistics Reporting Period: %u seconds\n", - policy.stats_period); + policy.stats_period); printf(" Policy retention: %s\n", - policy.policy_type & 0x80 ? "volatile" : "non-volatile"); + policy.policy_type & 0x80 ? "volatile" : "non-volatile"); if ( (policy_id == 0) && ((policy.domain & 0xf) == 0x3) ) printf(" HW Prot Power domain: %s\n", - policy.policy_type & 0x80 ? "Secondary" : "Primary"); + policy.policy_type & 0x80 ? "Secondary" : "Primary"); return 0; } @@ -2659,7 +2695,9 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) return (ipmi_nm_get_policy(intf, argc, argv)); memset(&policy, 0, sizeof(policy)); /* - * nm policy add [domain <param>] enable|disable policy_id <param> correction <opt> power <watts> limit <param> period <param> + * nm policy add [domain <param>] enable|disable policy_id <param> + * correction <opt> power <watts> limit <param> + * period <param> * nm policy remove [domain <param>] policy_id <param> * nm policy limiting {domain <param>] */ @@ -2782,7 +2820,8 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) argc--; /* nm_ctl_cmds returns 0 for disable, 1 for enable */ if ((argv[0] == NULL) || - ((action = str2val2(argv[0], nm_ctl_cmds)) == 0xFF)) { + ((action = str2val2(argv[0], nm_ctl_cmds)) == 0xFF)) + { print_strs(nm_ctl_cmds, "Control parameters:", LOG_ERR, 0); print_strs(nm_ctl_domain, "control Scope (required):", LOG_ERR, 0); return -1; @@ -2791,7 +2830,8 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) while (--argc) { /* nm_ctl_domain returns correct bit field except for action */ if ((argv[0] == NULL) || - ((scope = str2val2(argv[0], nm_ctl_domain)) == 0xFF)) { + ((scope = str2val2(argv[0], nm_ctl_domain)) == 0xFF)) + { print_strs(nm_ctl_domain, "Control Scope (required):", LOG_ERR, 0); return -1; } @@ -2803,7 +2843,6 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) return -1; } } else if (scope == 0x04) { /* per_policy */ - if (str2uchar(argv[0], &policy_id) < 0) { lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); return -1; @@ -2813,7 +2852,7 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if ((scope == 0x04) && (policy_id == 0xFF)) { + if ((scope == 0x04) && (policy_id == 0xFF)) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2839,7 +2878,8 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) argv++; if ((argv[0] == NULL) || - ((mode = str2val2(argv[0], nm_stats_mode)) == 0xFF)) { + ((mode = str2val2(argv[0], nm_stats_mode)) == 0xFF)) + { print_strs(nm_stats_mode, "Statistics commands", LOG_ERR, 0); return -1; } @@ -2847,7 +2887,7 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) argv++; if (argv[0] == NULL) break; if ((option = str2val2(argv[0], nm_stats_opts)) == 0xFF) { - print_strs(nm_stats_opts, "Control Scope options", LOG_ERR, 0); + print_strs(nm_stats_opts, "Control Scope options", LOG_ERR, 0); return -1; } switch (option) { @@ -2902,40 +2942,51 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) datebuf[cut] = 0; if (csv_output) { printf("%s,%s,%s,%s,%s,%d,%d,%d,%d,%s,%d\n", - val2str2(stats.id_state & 0xF, nm_domain_vals), - ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" : "Globally Enabled") : "Disabled" , - ((stats.id_state >> 5) & 1) ? "active" : "suspended", - ((stats.id_state >> 6) & 1) ? "in progress" : "suspended", - ((stats.id_state >> 7) & 1) ? "triggered" : "not triggered", - stats.curr_value, - stats.min_value, - stats.max_value, - stats.ave_value, - datebuf, - stats.stat_period); + val2str2(stats.id_state & 0xF, nm_domain_vals), + ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" + : "Globally Enabled") + : "Disabled" , + ((stats.id_state >> 5) & 1) ? "active" + : "suspended", + ((stats.id_state >> 6) & 1) ? "in progress" + : "suspended", + ((stats.id_state >> 7) & 1) ? "triggered" + : "not triggered", + stats.curr_value, + stats.min_value, + stats.max_value, + stats.ave_value, + datebuf, + stats.stat_period); return 0; } printf(" Power domain: %s\n", - val2str2(stats.id_state & 0xF, nm_domain_vals)); + val2str2(stats.id_state & 0xF, nm_domain_vals)); printf(" Policy/Global Admin state %s\n", - ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" : "Globally Enabled") : "Disabled" ); + ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" + : "Globally Enabled") + : "Disabled" ); printf(" Policy/Global Operational state %s\n", - ((stats.id_state >> 5) & 1) ? "active" : "suspended"); + ((stats.id_state >> 5) & 1) ? "active" + : "suspended"); printf(" Policy/Global Measurement state %s\n", - ((stats.id_state >> 6) & 1) ? "in progress" : "suspended"); + ((stats.id_state >> 6) & 1) ? "in progress" + : "suspended"); printf(" Policy Activation state %s\n", - ((stats.id_state >> 7) & 1) ? "triggered" : "not triggered"); + ((stats.id_state >> 7) & 1) ? "triggered" + : "not triggered"); printf(" Instantaneous reading: %8d %s\n", - stats.curr_value, units); + stats.curr_value, units); printf(" Minimum during sampling period: %8d %s\n... [truncated message content] |
From: Alexander A. <spi...@us...> - 2018-04-03 17:03:20
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated from 60723084e6ab3171f42281d7dbe29dab545f4e56 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- ipmitool |
From: Alexander A. <spi...@sf...> - 2018-03-30 09:47:20
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 60723084e6ab3171f42281d7dbe29dab545f4e56 (commit) from 9d41136c9b7c7d392f1a3f3adeb6d7fe3bd3135e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 60723084e6ab3171f42281d7dbe29dab545f4e56 Author: Alexander Amelkin <ale...@am...> Date: Fri Mar 30 12:45:03 2018 +0300 vendor: Add YADRO VESNIN identification Signed-off-by: Alexander Amelkin <ale...@am...> diff --git a/include/ipmitool/ipmi.h b/include/ipmitool/ipmi.h index 6e42d06..78bb689 100644 --- a/include/ipmitool/ipmi.h +++ b/include/ipmitool/ipmi.h @@ -300,7 +300,8 @@ typedef enum IPMI_OEM { IPMI_OEM_ADLINK_24339 = 24339, IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS = 28458, IPMI_OEM_VITA = 33196, - IPMI_OEM_SUPERMICRO_47488 = 47488 + IPMI_OEM_SUPERMICRO_47488 = 47488, + IPMI_OEM_YADRO = 49769, } IPMI_OEM; extern const struct valstr completion_code_vals[]; diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c index 90188d3..e0b36c9 100644 --- a/lib/ipmi_strings.c +++ b/lib/ipmi_strings.c @@ -48,6 +48,7 @@ const struct valstr ipmi_oem_info[] = { const struct oemvalstr ipmi_oem_product_info[] = { /* Keep OEM grouped together */ + /* Intel stuff, thanks to Tim Bell */ { IPMI_OEM_INTEL, 0x000C, "TSRLT2" }, { IPMI_OEM_INTEL, 0x001B, "TIGPR2U" }, @@ -61,6 +62,7 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_INTEL, 0x0808, "MPCBL0001" }, { IPMI_OEM_INTEL, 0x0811, "TIGW1U" }, { IPMI_OEM_INTEL, 0x4311, "NSI2U" }, + /* Kontron */ { IPMI_OEM_KONTRON,4000, "AM4000 AdvancedMC" }, { IPMI_OEM_KONTRON,4001, "AM4001 AdvancedMC" }, @@ -88,10 +90,13 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_KONTRON,5007, "AT8050" }, { IPMI_OEM_KONTRON,5301, "AT8400" }, { IPMI_OEM_KONTRON,5303, "AT8901" }, + /* Broadcom */ { IPMI_OEM_BROADCOM, 5725, "BCM5725" }, + /* Ericsson */ { IPMI_OEM_ERICSSON, 0x0054, "Phantom" }, + /* Advantech */ /* ATCA Blades */ { IPMI_OEM_ADVANTECH, 0x3393, "MIC-3393" }, @@ -174,6 +179,7 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_ADVANTECH, 0x9212, "ESP-9212" }, { IPMI_OEM_ADVANTECH, 0x6000, "CGS-6000" }, { IPMI_OEM_ADVANTECH, 0x6010, "CGS-6010" }, + /* ADLINK Technology Inc. */ /* AdvancedTCA Processor Blades */ { IPMI_OEM_ADLINK_24339, 0x3100, "aTCA-3100" }, @@ -231,6 +237,9 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_ADLINK_24339, 0x2600, "MCN-2600" }, { IPMI_OEM_ADLINK_24339, 0x1500, "MCN-1500" }, + /* YADRO */ + { IPMI_OEM_YADRO, 0x0001, "VESNIN BMC" }, + { 0xffffff , 0xffff , NULL }, }; ----------------------------------------------------------------------- Summary of changes: include/ipmitool/ipmi.h | 3 ++- lib/ipmi_strings.c | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) hooks/post-receive -- ipmitool |
From: Alexander A. <spi...@sf...> - 2018-03-29 23:35:07
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 9d41136c9b7c7d392f1a3f3adeb6d7fe3bd3135e (commit) from ecb4cfbff855bb24099f2a80a6dd558518702c7d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9d41136c9b7c7d392f1a3f3adeb6d7fe3bd3135e Author: Alexander Amelkin <ale...@am...> Date: Fri Mar 30 02:05:16 2018 +0300 ID:491 - Fetch vendor IDs from IANA Prior to this commit, ipmitool had hard-coded list of OEM Vendor IDs that it recognized. With this commit, the list is fetched directly from IANA PEN registry at build time, so that each release will now contain an up-to-date list of vendors. Only basic ASCII characters are supported now. Any Unicode or extended ASCII will be either transliterated (cyrillic and diacritic) or simply removed (chinese). Closes: ID:491 https://sourceforge.net/p/ipmitool/bugs/491/ ID:505 https://sourceforge.net/p/ipmitool/bugs/505/ Signed-off-by: Alexander Amelkin <ale...@am...> diff --git a/lib/Makefile.am b/lib/Makefile.am index cc69a8f..50310ee 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -31,6 +31,7 @@ AUTOMAKE_OPTIONS = subdir-objects AM_CPPFLAGS = -I$(top_srcdir)/include MAINTAINERCLEANFILES = Makefile.in +PEN_LIST = $(srcdir)/ipmi_pen_list.inc.c noinst_LTLIBRARIES = libipmitool.la libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.c \ @@ -48,3 +49,8 @@ libipmitool_la_LDFLAGS = -export-dynamic libipmitool_la_LIBADD = -lm libipmitool_la_DEPENDENCIES = +$(PEN_LIST): + $(srcdir)/create_pen_list $(PEN_LIST) + +ipmi_strings.lo: $(PEN_LIST) + diff --git a/lib/create_pen_list b/lib/create_pen_list new file mode 100755 index 0000000..e2b44d2 --- /dev/null +++ b/lib/create_pen_list @@ -0,0 +1,75 @@ +#!/bin/bash +# vi: set ts=2 sw=2 et : +# +# IANA PEN List generator +# +# This script takes the official IANA PEN registry and generates +# a C language output for inclusion into ipmi_strings.c +# +# Copyright (c) 2018 Alexander Amelkin <ale...@am...> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions 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. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +OUTFILE=$1 +PENLIST_URL=https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers + +if [ -z "$OUTFILE" ]; then + echo $0: Must specify output file + exit +fi + +parse_pen_list() { + iconv -f utf8 -t ascii//TRANSLIT//IGNORE \ + | awk ' + /^[0-9]+/ { + if(PEN) { + print "{ " PEN ", \"" ENTERPRISE "\" }," + } + PEN=$1 + } + + /^ [[:alnum:]]/ { + # Remove leading spaces + sub(/^[[:space:]]+/,"") + # Remove question marks (Chinese characters after iconv) + gsub(/\?/,""); + # Remove non-printable characters + gsub(/[^[:print:]]/,""); + # Escape slashes and double quotes + gsub(/["\\]/,"\\\\&") + ENTERPRISE=$0; + } + + END { + print "{ " PEN ", \"" ENTERPRISE "\" }," + }' +} + +echo "Generating IANA PEN list..." +curl -# "$PENLIST_URL" | parse_pen_list > "$OUTFILE" diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c index 94b2abd..90188d3 100644 --- a/lib/ipmi_strings.c +++ b/lib/ipmi_strings.c @@ -39,63 +39,10 @@ const struct valstr ipmi_oem_info[] = { { IPMI_OEM_UNKNOWN, "Unknown" }, - { IPMI_OEM_HP, "Hewlett-Packard" }, - { IPMI_OEM_SUN, "Sun Microsystems" }, - { IPMI_OEM_INTEL, "Intel Corporation" }, - { IPMI_OEM_LMC, "LMC" }, - { IPMI_OEM_RADISYS, "RadiSys Corporation" }, - { IPMI_OEM_TYAN, "Tyan Computer Corporation" }, - { IPMI_OEM_NEWISYS, "Newisys" }, - { IPMI_OEM_SUPERMICRO, "Supermicro" }, - { IPMI_OEM_GOOGLE, "Google" }, - { IPMI_OEM_KONTRON, "Kontron" }, - { IPMI_OEM_NOKIA, "Nokia" }, - { IPMI_OEM_PICMG, "PICMG" }, - { IPMI_OEM_PEPPERCON, "Peppercon AG" }, - { IPMI_OEM_DELL, "DELL Inc" }, - { IPMI_OEM_NEC, "NEC" }, - { IPMI_OEM_MAGNUM, "Magnum Technologies" }, - { IPMI_OEM_FUJITSU_SIEMENS, "Fujitsu Siemens" }, - { IPMI_OEM_TATUNG, "Tatung" }, - { IPMI_OEM_AMI, "AMI" }, - { IPMI_OEM_RARITAN, "Raritan" }, - { IPMI_OEM_AVOCENT, "Avocent" }, - { IPMI_OEM_OSA, "OSA" }, - { IPMI_OEM_TOSHIBA, "Toshiba" }, - { IPMI_OEM_HITACHI_116, "Hitachi" }, - { IPMI_OEM_HITACHI_399, "Hitachi" }, - { IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS, "Nokia Solutions and Networks" }, - { IPMI_OEM_BULL, "Bull Company" }, - { IPMI_OEM_PPS, "Pigeon Point Systems" }, - { IPMI_OEM_BROADCOM, "Broadcom Corporation" }, - { IPMI_OEM_ERICSSON, "Ericsson AB"}, - { IPMI_OEM_QUANTA, "Quanta" }, - { IPMI_OEM_VITA, "VITA" }, - { IPMI_OEM_ADVANTECH, "Advantech" }, - /************************************************************************ - * Add ID String for IANA Enterprise Number of IBM & ADLINK - * https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers - * 2 - * IBM - * Kristine Adamson - * adamson&us.ibm.com - * 4769 - * IBM Corporation - * Victor Sample - * vsample&us.ibm.com - * 20301 - * IBM eServer X - * Lynn Fore - * sls&us.ibm.com - * 24339 - * ADLINK TECHNOLOGY INC. - * Ryan Hsu - * ryan.hsu&adlinktech.com - ************************************************************************/ - { IPMI_OEM_IBM_2, "IBM" }, - { IPMI_OEM_IBM_4769, "IBM Corporation" }, - { IPMI_OEM_IBM_20301, "IBM eServer X" }, - { IPMI_OEM_ADLINK_24339, "ADLINK Technology Inc." }, + +/* The included file is auto-generated from offical IANA PEN list */ +#include "ipmi_pen_list.inc.c" + { 0xffff , NULL }, }; ----------------------------------------------------------------------- Summary of changes: lib/Makefile.am | 6 +++++ lib/create_pen_list | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/ipmi_strings.c | 61 +++---------------------------------------- 3 files changed, 85 insertions(+), 57 deletions(-) create mode 100755 lib/create_pen_list hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-04-06 19:54:24
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via ecb4cfbff855bb24099f2a80a6dd558518702c7d (commit) from 1664902525a1c3771b4d8b3ccab7ea1ba6b2bdd1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ecb4cfbff855bb24099f2a80a6dd558518702c7d Author: srinivasa_mareedu <sri...@de...> Date: Mon Jan 23 16:41:09 2017 +0530 ID:472 - Fix The Most recent Addition/Erase date Fix the Most recent Addition/Erase date are not matched between in-band and out-band. ipmitool SDR code doesn't have to check for valid date to print based on 'Delete SDR command supported' and 'Partial Add SDR command supported', if 0xffffffff is taken. Also 'Timestamp' data type needs to change to time_t(long) because same data type is using for gmtime(time_t) API, it has different behaviour for Linux and Windows C. diff --git a/lib/ipmi_sdr.c b/lib/ipmi_sdr.c index 2a9cbe3..167c252 100644 --- a/lib/ipmi_sdr.c +++ b/lib/ipmi_sdr.c @@ -4217,7 +4217,7 @@ ipmi_sdr_get_info(struct ipmi_intf *intf, * returns pointer to static buffer */ static char * -ipmi_sdr_timestamp(uint32_t stamp) +ipmi_sdr_timestamp(time_t stamp) { static char tbuf[40]; time_t s = (time_t) stamp; @@ -4240,7 +4240,7 @@ ipmi_sdr_timestamp(uint32_t stamp) int ipmi_sdr_print_info(struct ipmi_intf *intf) { - uint32_t timestamp; + time_t timestamp; uint16_t free_space; struct get_sdr_repository_info_rsp sdr_repository_info; @@ -4274,21 +4274,51 @@ ipmi_sdr_print_info(struct ipmi_intf *intf) break; } - timestamp = - (sdr_repository_info.most_recent_addition_timestamp[3] << 24) | - (sdr_repository_info.most_recent_addition_timestamp[2] << 16) | - (sdr_repository_info.most_recent_addition_timestamp[1] << 8) | - sdr_repository_info.most_recent_addition_timestamp[0]; - printf("Most recent Addition : %s\n", - ipmi_sdr_timestamp(timestamp)); - - timestamp = - (sdr_repository_info.most_recent_erase_timestamp[3] << 24) | - (sdr_repository_info.most_recent_erase_timestamp[2] << 16) | - (sdr_repository_info.most_recent_erase_timestamp[1] << 8) | - sdr_repository_info.most_recent_erase_timestamp[0]; - printf("Most recent Erase : %s\n", - ipmi_sdr_timestamp(timestamp)); + if(sdr_repository_info.delete_sdr_supported && sdr_repository_info.partial_add_sdr_supported) + { + timestamp = + (sdr_repository_info.most_recent_addition_timestamp[3] << 24) | + (sdr_repository_info.most_recent_addition_timestamp[2] << 16) | + (sdr_repository_info.most_recent_addition_timestamp[1] << 8) | + sdr_repository_info.most_recent_addition_timestamp[0]; + printf("Most recent Addition : %s\n", + ipmi_sdr_timestamp(timestamp)); + + timestamp = + (sdr_repository_info.most_recent_erase_timestamp[3] << 24) | + (sdr_repository_info.most_recent_erase_timestamp[2] << 16) | + (sdr_repository_info.most_recent_erase_timestamp[1] << 8) | + sdr_repository_info.most_recent_erase_timestamp[0]; + printf("Most recent Erase : %s\n", + ipmi_sdr_timestamp(timestamp)); + } + else if (sdr_repository_info.partial_add_sdr_supported) + { + timestamp = + (sdr_repository_info.most_recent_addition_timestamp[3] << 24) | + (sdr_repository_info.most_recent_addition_timestamp[2] << 16) | + (sdr_repository_info.most_recent_addition_timestamp[1] << 8) | + sdr_repository_info.most_recent_addition_timestamp[0]; + printf("Most recent Addition : %s\n", + ipmi_sdr_timestamp(timestamp)); + printf("Most recent Erase : NA\n"); + } + else if(sdr_repository_info.delete_sdr_supported) + { + printf("Most recent Addition : NA\n"); + timestamp = + (sdr_repository_info.most_recent_erase_timestamp[3] << 24) | + (sdr_repository_info.most_recent_erase_timestamp[2] << 16) | + (sdr_repository_info.most_recent_erase_timestamp[1] << 8) | + sdr_repository_info.most_recent_erase_timestamp[0]; + printf("Most recent Erase : %s\n", + ipmi_sdr_timestamp(timestamp)); + } + else + { + printf("Most recent Addition : NA\n"); + printf("Most recent Erase : NA\n"); + } printf("SDR overflow : %s\n", (sdr_repository_info.overflow_flag ? "yes" : "no")); ----------------------------------------------------------------------- Summary of changes: lib/ipmi_sdr.c | 64 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 17 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-04-04 18:55:25
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 1664902525a1c3771b4d8b3ccab7ea1ba6b2bdd1 (commit) from f004b4b7197fc83e7d47ec8cbcaefffa9a922717 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1664902525a1c3771b4d8b3ccab7ea1ba6b2bdd1 Author: Holger Liebig <hol...@ts...> Date: Tue Apr 4 20:43:05 2017 +0200 ID:480 - Call EVP_CIPHER_CTX_free() instead of EVP_CIPHER_CTX_cleanup() Call EVP_CIPHER_CTX_free() instead of EVP_CIPHER_CTX_cleanup() to fix memory leak. diff --git a/src/plugins/lanplus/lanplus_crypt_impl.c b/src/plugins/lanplus/lanplus_crypt_impl.c index 0e330c1..9652a5e 100644 --- a/src/plugins/lanplus/lanplus_crypt_impl.c +++ b/src/plugins/lanplus/lanplus_crypt_impl.c @@ -165,13 +165,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, uint32_t * bytes_written) { EVP_CIPHER_CTX *ctx = NULL; - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - *bytes_written = 0; - return; - } - EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_CIPHER_CTX_set_padding(ctx, 0); *bytes_written = 0; @@ -185,6 +178,14 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, printbuf(input, input_length, "encrypting this data"); } + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) { + lprintf(LOG_DEBUG, "ERROR: EVP_CIPHER_CTX_new() failed"); + return; + } + EVP_CIPHER_CTX_init(ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); + EVP_CIPHER_CTX_set_padding(ctx, 0); /* * The default implementation adds a whole block of padding if the input @@ -198,7 +199,6 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, { /* Error */ *bytes_written = 0; - return; } else { @@ -206,16 +206,17 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, if(!EVP_EncryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) { + /* Error */ *bytes_written = 0; - return; /* Error */ } else { /* Success */ *bytes_written += tmplen; - EVP_CIPHER_CTX_cleanup(ctx); } } + /* performs cleanup and free */ + EVP_CIPHER_CTX_free(ctx); } @@ -243,13 +244,6 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, uint32_t * bytes_written) { EVP_CIPHER_CTX *ctx = NULL; - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - *bytes_written = 0; - return; - } - EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_CIPHER_CTX_set_padding(ctx, 0); if (verbose >= 5) { @@ -258,12 +252,20 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, printbuf(input, input_length, "decrypting this data"); } - *bytes_written = 0; if (input_length == 0) return; + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) { + lprintf(LOG_DEBUG, "ERROR: EVP_CIPHER_CTX_new() failed"); + return; + } + EVP_CIPHER_CTX_init(ctx); + EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); + EVP_CIPHER_CTX_set_padding(ctx, 0); + /* * The default implementation adds a whole block of padding if the input * data is perfectly aligned. We would like to keep that from happening. @@ -277,7 +279,6 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, /* Error */ lprintf(LOG_DEBUG, "ERROR: decrypt update failed"); *bytes_written = 0; - return; } else { @@ -285,20 +286,21 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, if (!EVP_DecryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) { + /* Error */ char buffer[1000]; ERR_error_string(ERR_get_error(), buffer); lprintf(LOG_DEBUG, "the ERR error %s", buffer); lprintf(LOG_DEBUG, "ERROR: decrypt final failed"); *bytes_written = 0; - return; /* Error */ } else { /* Success */ *bytes_written += tmplen; - EVP_CIPHER_CTX_cleanup(ctx); } } + /* performs cleanup and free */ + EVP_CIPHER_CTX_free(ctx); if (verbose >= 5) { ----------------------------------------------------------------------- Summary of changes: src/plugins/lanplus/lanplus_crypt_impl.c | 44 +++++++++++++++++--------------- 1 file changed, 23 insertions(+), 21 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-03-26 13:16:23
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via f004b4b7197fc83e7d47ec8cbcaefffa9a922717 (commit) from ba01dc84b4e225c86eac3f562e629662d752040f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit f004b4b7197fc83e7d47ec8cbcaefffa9a922717 Author: Zdenek Styblik <st...@tu...> Date: Sun Mar 12 14:00:35 2017 +0100 ID:480 - ipmitool coredumps in EVP_CIPHER_CTX_init IPMI tool coredumps due to changes introduced in ID:461. This shouldn't be surprise as a NULL pointer is passed to init. Commit addresses this issue by calling EVP_CIPHER_CTX_new() instead of EVP_CIPHER_CTX_init(), which is deprecated, and by checking return value of call to former function. diff --git a/src/plugins/lanplus/lanplus_crypt_impl.c b/src/plugins/lanplus/lanplus_crypt_impl.c index d12d0e3..0e330c1 100644 --- a/src/plugins/lanplus/lanplus_crypt_impl.c +++ b/src/plugins/lanplus/lanplus_crypt_impl.c @@ -165,10 +165,13 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, uint32_t * bytes_written) { EVP_CIPHER_CTX *ctx = NULL; - EVP_CIPHER_CTX_init(ctx); + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) { + *bytes_written = 0; + return; + } EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_CIPHER_CTX_set_padding(ctx, 0); - *bytes_written = 0; @@ -240,11 +243,14 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, uint32_t * bytes_written) { EVP_CIPHER_CTX *ctx = NULL; - EVP_CIPHER_CTX_init(ctx); + ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) { + *bytes_written = 0; + return; + } EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_CIPHER_CTX_set_padding(ctx, 0); - if (verbose >= 5) { printbuf(iv, 16, "decrypting with this IV"); ----------------------------------------------------------------------- Summary of changes: src/plugins/lanplus/lanplus_crypt_impl.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-03-19 18:20:59
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, version-script has been deleted was 532aead9367e3987b979c07e438a867be25dc666 - Log ----------------------------------------------------------------- 532aead9367e3987b979c07e438a867be25dc666 Make git revision more descriptive ----------------------------------------------------------------------- hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-03-19 18:02:40
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via ba01dc84b4e225c86eac3f562e629662d752040f (commit) from 497f7767cd8e80ad67d08680ae165271441017fc (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ba01dc84b4e225c86eac3f562e629662d752040f Author: Alexander Amelkin <ale...@am...> Date: Tue Feb 7 14:06:47 2017 +0300 Make git revision more descriptive The previously introduced mechanism of generating a git revision was only using the abbreviated hash. That approach doesn't give a clue whether version 1.8.18.2c99bf6 is newer or older than 1.8.18.7f8d374. The project uses tags, so `git describe` can be employed to produce an incremental revision number since the last tag. Version 1.8.18.13 is much more understandable and comparable. Howerver that doesn't answer the question "what codebase was used". To address that, the abbreviated hash should also be preserved. Hence, this commit introduces a new versioning scheme like `1.8.18.13.gee01aa5`. For git snapshots when git program is absent the version will be like `1.8.18.0.gsnapshot`. For cases when .git directory is missing (Release compilation?) the suffix part will be omitted completely yielding a version like `1.8.18`. The suffix generation has been moved to the added csv-revision script. The script is absolutely POSIX-ly correct and doesn't require XSI or any other POSIX extensions. diff --git a/configure.ac b/configure.ac index f7676c9..ad1657d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,8 +1,8 @@ dnl dnl autoconf for ipmitool dnl -m4_define([git_suffix], m4_esyscmd_s(git describe --always --dirty=wc 2>/dev/null || echo git_snapshot)) -AC_INIT([ipmitool], [1.8.18.git_suffix]) +m4_define([git_suffix], m4_esyscmd_s(./csv-revision)) +AC_INIT([ipmitool], [1.8.18git_suffix]) AC_CONFIG_SRCDIR([src/ipmitool.c]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE([foreign]) diff --git a/csv-revision b/csv-revision new file mode 100755 index 0000000..289c133 --- /dev/null +++ b/csv-revision @@ -0,0 +1,10 @@ +#!/bin/sh + +git describe --first-parent --tags 2>/dev/null | ( + IFS=- read tag rev hash + if [ $? ] && [ -n "$rev" ]; then + echo .$rev.$hash + elif [ -d .git ]; then + echo .0.gsnapshot + fi +) ----------------------------------------------------------------------- Summary of changes: configure.ac | 4 ++-- csv-revision | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100755 csv-revision hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-03-19 17:40:57
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, version-script has been created at 532aead9367e3987b979c07e438a867be25dc666 (commit) - Log ----------------------------------------------------------------- commit 532aead9367e3987b979c07e438a867be25dc666 Author: Alexander Amelkin <ale...@am...> Date: Tue Feb 7 14:06:47 2017 +0300 Make git revision more descriptive The previously introduced mechanism of generating a git revision was only using the abbreviated hash. That approach doesn't give a clue whether version 1.8.18.2c99bf6 is newer or older than 1.8.18.7f8d374. The project uses tags, so `git describe` can be employed to produce an incremental revision number since the last tag. Version 1.8.18.13 is much more understandable and comparable. Howerver that doesn't answer the question "what codebase was used". To address that, the abbreviated hash should also be preserved. Hence, this commit introduces a new versioning scheme like `1.8.18.13.gee01aa5`. For git snapshots when git program is absent the version will be like `1.8.18.0.gsnapshot`. For cases when .git directory is missing (Release compilation?) the suffix part will be omitted completely yielding a version like `1.8.18`. The suffix generation has been moved to the added csv-revision script. The script is absolutely POSIX-ly correct and doesn't require XSI or any other POSIX extensions. diff --git a/configure.ac b/configure.ac index 88232a6..a67c3cf 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,8 @@ dnl dnl autoconf for ipmitool dnl -AC_INIT([ipmitool], [1.8.18-csv]) +m4_define([git_suffix], m4_esyscmd_s(./csv-revision)) +AC_INIT([ipmitool], [1.8.18git_suffix]) AC_CONFIG_SRCDIR([src/ipmitool.c]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE diff --git a/csv-revision b/csv-revision new file mode 100755 index 0000000..289c133 --- /dev/null +++ b/csv-revision @@ -0,0 +1,10 @@ +#!/bin/sh + +git describe --first-parent --tags 2>/dev/null | ( + IFS=- read tag rev hash + if [ $? ] && [ -n "$rev" ]; then + echo .$rev.$hash + elif [ -d .git ]; then + echo .0.gsnapshot + fi +) ----------------------------------------------------------------------- hooks/post-receive -- ipmitool |
From: Allura u. <al...@ch...> - 2017-02-12 06:58:17
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 497f7767cd8e80ad67d08680ae165271441017fc (commit) via 7b0302cef5b7f22bd707f0d07c4098d7a6c57aa6 (commit) via 840f5730831b0d7cdb976b07e6c9c1aafc86f978 (commit) via 41fa699ae9480435cb888fa52405734e0ef6f349 (commit) via b35a6349087e64406ff6d4787c0612ae982ab4c4 (commit) via bc7d23761d07e67dad91c9d1dfb140c7d07c1a12 (commit) via e45dc6234bf887fa8356684c13f2468c3041c542 (commit) from 5db314f694f75c575cd7c9ffe9ee57aaf3a88866 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 497f7767cd8e80ad67d08680ae165271441017fc Author: Alexander Amelkin <ale...@am...> Date: Thu Feb 2 15:25:44 2017 +0300 ID:477 - fru: Fix decoding of non-text data in get_fru_area_str() The get_fru_area_str() function is used to decode FRU area fields into text. Areas may be encoded as text, binary, BCDplus or 6-bit ASCII. Decoding of 6-bit ASCII and BCDplus was broken. There was an error in the formulas used to calculate the resulting string length, plus the decoding formulas for BCDplus was wrong. For BCDplus the resulting length was considered equal the encoded data length, while in fact it's twice as big. Only one character instead of two was being extracted from a single input byte while two nibbles must have been taken into account. For 6-bit ASCII rounding of 3 to 4 bytes conversion was done improperly adding 2 to the original length instead of the result of multiplication. diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index cf00eff..42c1f19 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -107,7 +107,7 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) { static const char bcd_plus[] = "0123456789 -.:,_"; char * str; - int len, off, size, i, j, k, typecode; + int len, off, size, i, j, k, typecode, char_idx; union { uint32_t bits; char chars[4]; @@ -126,15 +126,15 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) switch (typecode) { case 0: /* 00b: binary/unspecified */ - /* hex dump -> 2x length */ - size = (len*2); + case 1: /* 01b: BCD plus */ + /* hex dump or BCD -> 2x length */ + size = (len * 2); break; case 2: /* 10b: 6-bit ASCII */ /* 4 chars per group of 1-3 bytes */ - size = ((((len+2)*4)/3) & ~3); + size = (((len * 4 + 2) / 3) & ~3); break; case 3: /* 11b: 8-bit ASCII */ - case 1: /* 01b: BCD plus */ /* no length adjustment */ size = len; break; @@ -149,7 +149,7 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) return NULL; memset(str, 0, size+1); - if (len == 0) { + if (size == 0) { str[0] = '\0'; *offset = off; return str; @@ -157,30 +157,30 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) switch (typecode) { case 0: /* Binary */ - strncpy(str, buf2str(&data[off], len), len*2); + strncpy(str, buf2str(&data[off], len), size); break; case 1: /* BCD plus */ - for (k=0; k<len; k++) - str[k] = bcd_plus[(data[off+k] & 0x0f)]; + for (k = 0; k < size; k++) + str[k] = bcd_plus[((data[off + k / 2] >> ((k % 2) ? 0 : 4)) & 0x0f)]; str[k] = '\0'; break; case 2: /* 6-bit ASCII */ - for (i=j=0; i<len; i+=3) { + for (i = j = 0; i < len; i += 3) { u.bits = 0; - k = ((len-i) < 3 ? (len-i) : 3); + k = ((len - i) < 3 ? (len - i) : 3); #if WORDS_BIGENDIAN u.chars[3] = data[off+i]; u.chars[2] = (k > 1 ? data[off+i+1] : 0); u.chars[1] = (k > 2 ? data[off+i+2] : 0); -#define CHAR_IDX 3 + char_idx = 3; #else memcpy((void *)&u.bits, &data[off+i], k); -#define CHAR_IDX 0 + char_idx = 0; #endif for (k=0; k<4; k++) { - str[j++] = ((u.chars[CHAR_IDX] & 0x3f) + 0x20); + str[j++] = ((u.chars[char_idx] & 0x3f) + 0x20); u.bits >>= 6; } } @@ -188,8 +188,8 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) break; case 3: - memcpy(str, &data[off], len); - str[len] = '\0'; + memcpy(str, &data[off], size); + str[size] = '\0'; break; } commit 7b0302cef5b7f22bd707f0d07c4098d7a6c57aa6 Author: Alexander Amelkin <ale...@am...> Date: Tue Jan 24 14:09:57 2017 +0300 ID:479 - ekanalyzer: fix processing of custom mfg. fields Ekanalyzer was not reading the type/length byte for the 2nd and subsequent custom fields. Also the message it displayed when lacked data for custom fields was very relaxing and incorrect. diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c index 35aa850..f6d8b90 100644 --- a/lib/ipmi_ekanalyzer.c +++ b/lib/ipmi_ekanalyzer.c @@ -2697,6 +2697,7 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, int ret = 0; unsigned char len = 0; unsigned int size_board = 0; + int custom_fields = 0; if (input_file == NULL || board_type == NULL || board_length == NULL) { return (size_t)(-1); @@ -2758,7 +2759,12 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, /* take the rest of data in the area minus 1 byte of * checksum */ - printf("Additional Custom Mfg. length: 0x%02x\n", len); + if (custom_fields) { + printf("End of Custom Mfg. fields (0x%02x)\n", len); + } else { + printf("No Additional Custom Mfg. fields (0x%02x)\n", len); + } + padding = (*board_length) - 1; if ((padding > 0) && (!feof(input_file))) { printf("Unused space: %d (bytes)\n", padding); @@ -2772,6 +2778,7 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, printf("Checksum: 0x%02x\n", checksum); goto out; } + custom_fields++; printf("Additional Custom Mfg. length: 0x%02x\n", len); if ((size_board > 0) && (size_board < (*board_length))) { unsigned char *additional_data, *str; @@ -2801,9 +2808,17 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, additional_data = NULL; (*board_length) -= size_board; + ret = fread(&len, 1, 1, input_file); + if ((ret != 1) || ferror(input_file)) { + lprintf(LOG_ERR, "Invalid Length!"); + goto out; + } + (*board_length)--; + size_board = (len & 0x3f); } else { - printf("No Additional Custom Mfg. %d\n", *board_length); + printf("ERROR: File has insufficient data (%d bytes) for the " + "Additional Custom Mfg. field\n", *board_length); goto out; } } commit 840f5730831b0d7cdb976b07e6c9c1aafc86f978 Author: Alexander Amelkin <ale...@am...> Date: Mon Jan 23 12:47:35 2017 +0300 ID:478 - ekanalyzer: Fixed decoding of FRU fields Got rid of the field decoding code that was only capable of processing ASCII and binary fields, and switched to using get_fru_area_str() that can also decode BCDplus and 6-bit ASCII and maybe will eventually be enabled to decode Unicode text as well. This is the first step to completely get rid of the completely awfully written FRU data decoding functionality of ekanalyzer that essentially duplicates that of ipmi_fru.c module. diff --git a/include/ipmitool/ipmi_fru.h b/include/ipmitool/ipmi_fru.h index 65696ba..d03abfc 100644 --- a/include/ipmitool/ipmi_fru.h +++ b/include/ipmitool/ipmi_fru.h @@ -614,5 +614,6 @@ typedef struct ipmi_fru_bloc { int ipmi_fru_main(struct ipmi_intf *intf, int argc, char **argv); int ipmi_fru_print(struct ipmi_intf *intf, struct sdr_record_fru_locator *fru); +char *get_fru_area_str(uint8_t *data, uint32_t *offset); #endif /* IPMI_FRU_H */ diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c index 7a6c63d..35aa850 100644 --- a/lib/ipmi_ekanalyzer.c +++ b/lib/ipmi_ekanalyzer.c @@ -37,6 +37,7 @@ #include <ipmitool/log.h> #include <ipmitool/helper.h> #include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_fru.h> #include <stdlib.h> #include <string.h> @@ -2702,6 +2703,12 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } file_offset = ftell(input_file); + /* + * TODO: This whole file's code is extremely dirty and wicked. + * Must eventually switch to using ipmi_fru.c code or some + * specialized FRU library. + */ + /* Board length*/ ret = fread(&len, 1, 1, input_file); if ((ret != 1) || ferror(input_file)) { @@ -2717,14 +2724,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, goto out; } if (strncmp(board_type, "Custom", 6 ) != 0) { - unsigned char *data; + unsigned char *data, *str; unsigned int i = 0; - data = malloc(size_board); + data = malloc(size_board + 1); /* Make room for type/length field */ if (data == NULL) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (size_t)(-1); } - ret = fread(data, size_board, 1, input_file); + data[0] = len; /* Save the type/length byte in 'data' */ + ret = fread(data + 1, size_board, 1, input_file); if ((ret != 1) || ferror(input_file)) { lprintf(LOG_ERR, "Invalid board type size!"); free(data); @@ -2733,17 +2741,11 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } printf("%s type: 0x%02x\n", board_type, len); printf("%s: ", board_type); - for (i = 0; i < size_board; i++) { - if ((len & TYPE_CODE) == TYPE_CODE) { - printf("%c", data[i]); - } else { - /* other than language code (binary, BCD, - * ASCII 6 bit...) is not supported - */ - printf("%02x", data[i]); - } - } - printf("\n"); + i = 0; + str = (unsigned char *)get_fru_area_str(data, &i); + printf("%s\n", str); + free(str); + str = NULL; free(data); data = NULL; (*board_length) -= size_board; @@ -2772,14 +2774,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } printf("Additional Custom Mfg. length: 0x%02x\n", len); if ((size_board > 0) && (size_board < (*board_length))) { - unsigned char * additional_data = NULL; + unsigned char *additional_data, *str; unsigned int i = 0; - additional_data = malloc(size_board); + additional_data = malloc(size_board + 1); /* Make room for type/length field */ if (additional_data == NULL) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (size_t)(-1); } - ret = fread(additional_data, size_board, 1, input_file); + additional_data[0] = len; + ret = fread(additional_data + 1, size_board, 1, input_file); if ((ret != 1) || ferror(input_file)) { lprintf(LOG_ERR, "Invalid Additional Data!"); if (additional_data != NULL) { @@ -2788,14 +2791,15 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } goto out; } - printf("Additional Custom Mfg. Data: %02x", - additional_data[0]); - for (i = 1; i < size_board; i++) { - printf("-%02x", additional_data[i]); - } - printf("\n"); + printf("Additional Custom Mfg. Data: "); + i = 0; + str = (unsigned char *)get_fru_area_str(additional_data, &i); + printf("%s\n", str); + free(str); + str = NULL; free(additional_data); additional_data = NULL; + (*board_length) -= size_board; } else { commit 41fa699ae9480435cb888fa52405734e0ef6f349 Author: Alexander Amelkin <ale...@am...> Date: Tue Aug 11 02:28:19 2015 +0300 Add some more configure/build/editor byproducts to .gitignore diff --git a/.gitignore b/.gitignore index 5b8cb0a..58ca89e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,30 @@ +.deps +.libs +*.o +*.lo +*.la +*.*~ +Makefile Makefile.in aclocal.m4 autom4te.cache compile config.guess +config.h config.h.in +config.log +config.status config.sub configure depcomp install-sh ltmain.sh +libtool missing +stamp-h1 +control/ipmitool.spec +control/pkginfo +control/prototype +control/rpmmacros +src/ipmievd +src/ipmitool commit b35a6349087e64406ff6d4787c0612ae982ab4c4 Author: Alexander Amelkin <ale...@am...> Date: Tue Aug 11 02:52:33 2015 +0300 Add git hash and dirty mark to ipmitool version Replace the static 'csv' suffix with a short hash and a 'dirty' mark (when the tree is modified). When git is not available, '.git_snapshot' suffix will be used. diff --git a/configure.ac b/configure.ac index 896577b..f7676c9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,8 @@ dnl dnl autoconf for ipmitool dnl -AC_INIT([ipmitool], [1.8.18-csv]) +m4_define([git_suffix], m4_esyscmd_s(git describe --always --dirty=wc 2>/dev/null || echo git_snapshot)) +AC_INIT([ipmitool], [1.8.18.git_suffix]) AC_CONFIG_SRCDIR([src/ipmitool.c]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE([foreign]) commit bc7d23761d07e67dad91c9d1dfb140c7d07c1a12 Author: Alexander Amelkin <ale...@am...> Date: Tue Aug 11 02:26:32 2015 +0300 Prevent autoreconf from complaining about missing NEWS diff --git a/configure.ac b/configure.ac index 88232a6..896577b 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ dnl AC_INIT([ipmitool], [1.8.18-csv]) AC_CONFIG_SRCDIR([src/ipmitool.c]) AC_CANONICAL_SYSTEM -AM_INIT_AUTOMAKE +AM_INIT_AUTOMAKE([foreign]) AM_CONFIG_HEADER(config.h) AC_PREREQ(2.50) AC_SUBST(ac_configure_args) commit e45dc6234bf887fa8356684c13f2468c3041c542 Author: Sergey Kleymenov <ser...@gm...> Date: Thu Mar 19 08:31:53 2015 +0300 Add bootstrap support for Mac diff --git a/bootstrap b/bootstrap index 6347427..c38b12b 100755 --- a/bootstrap +++ b/bootstrap @@ -31,7 +31,15 @@ # EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. aclocal -libtoolize --automake --copy + +case `uname` in + Darwin*) + glibtoolize --automake --copy + ;; + *) + libtoolize --automake --copy + ;; +esac autoheader automake --foreign --add-missing --copy ----------------------------------------------------------------------- Summary of changes: .gitignore | 18 ++++++++++++ bootstrap | 10 ++++++- configure.ac | 5 ++-- include/ipmitool/ipmi_fru.h | 1 + lib/ipmi_ekanalyzer.c | 69 +++++++++++++++++++++++++++++---------------- lib/ipmi_fru.c | 32 ++++++++++----------- 6 files changed, 91 insertions(+), 44 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-01-21 16:07:49
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 5db314f694f75c575cd7c9ffe9ee57aaf3a88866 (commit) from 77fe5635037ebaf411cae46cf5045ca819b5c145 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5db314f694f75c575cd7c9ffe9ee57aaf3a88866 Author: Leonid Nevecherya <nev...@gm...> Date: Tue Jan 17 11:00:37 2017 +0300 ID:474 - Compile fix on nonlinux systems This patch fixes compilation on systems without a separate <malloc.h>. diff --git a/lib/ipmi_cfgp.c b/lib/ipmi_cfgp.c index b8af80d..dfc4743 100644 --- a/lib/ipmi_cfgp.c +++ b/lib/ipmi_cfgp.c @@ -30,7 +30,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <malloc.h> +#ifdef HAVE_MALLOC_H +# include <malloc.h> +#else +# include <stdlib.h> +#endif #include <string.h> #include <ipmitool/helper.h> ----------------------------------------------------------------------- Summary of changes: lib/ipmi_cfgp.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2017-01-15 14:15:19
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 77fe5635037ebaf411cae46cf5045ca819b5c145 (commit) via 7b102293e873054e2a1666c003b4d700280563f5 (commit) via b57487e360916ab3eaa50aa6d021c73b6337a4a0 (commit) via 80345ac56a753d64e1998664a91521193a8fa1b4 (commit) via 0ea110a247f831e5083861a84cdd34b6222b7ba4 (commit) via 2cc196d5187657a666787c3c604a614afe6ec74a (commit) from 076ffb56503c8eedb03c2a164291d0ccd2185b9e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 77fe5635037ebaf411cae46cf5045ca819b5c145 Author: Zdenek Styblik <st...@tu...> Date: Sun Jan 15 15:11:25 2017 +0100 ID:461 - Make compiler happier about changes related to OpenSSL 1.1 Complaint was that ctx isn't initialized. diff --git a/src/plugins/lanplus/lanplus_crypt_impl.c b/src/plugins/lanplus/lanplus_crypt_impl.c index 3c0df23..d12d0e3 100644 --- a/src/plugins/lanplus/lanplus_crypt_impl.c +++ b/src/plugins/lanplus/lanplus_crypt_impl.c @@ -164,7 +164,7 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, uint8_t * output, uint32_t * bytes_written) { - EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX *ctx = NULL; EVP_CIPHER_CTX_init(ctx); EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_CIPHER_CTX_set_padding(ctx, 0); @@ -239,7 +239,7 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, uint8_t * output, uint32_t * bytes_written) { - EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX *ctx = NULL; EVP_CIPHER_CTX_init(ctx); EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); EVP_CIPHER_CTX_set_padding(ctx, 0); commit 7b102293e873054e2a1666c003b4d700280563f5 Merge: 80345ac b57487e Author: Zdenek Styblik <st...@tu...> Date: Sun Jan 15 15:01:38 2017 +0100 Merge commit 'b57487e360916ab3eaa50aa6d021c73b6337a4a0' commit b57487e360916ab3eaa50aa6d021c73b6337a4a0 Author: Dennis Schridde <den...@un...> Date: Wed Nov 30 17:33:00 2016 +0100 ID:461 - OpenSSL 1.1 compatibility - "error: storage size of 'ctx' isn't known" In OpenSSL 1.1 EVP_CIPHER_CTX became opaque, cf. `man 3ssl EVP_EncryptInit` Fixes: ID:461 diff --git a/src/plugins/lanplus/lanplus_crypt_impl.c b/src/plugins/lanplus/lanplus_crypt_impl.c index d5fac37..3c0df23 100644 --- a/src/plugins/lanplus/lanplus_crypt_impl.c +++ b/src/plugins/lanplus/lanplus_crypt_impl.c @@ -164,10 +164,10 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, uint8_t * output, uint32_t * bytes_written) { - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); - EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_CIPHER_CTX_set_padding(&ctx, 0); + EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX_init(ctx); + EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); + EVP_CIPHER_CTX_set_padding(ctx, 0); *bytes_written = 0; @@ -191,7 +191,7 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, assert((input_length % IPMI_CRYPT_AES_CBC_128_BLOCK_SIZE) == 0); - if(!EVP_EncryptUpdate(&ctx, output, (int *)bytes_written, input, input_length)) + if(!EVP_EncryptUpdate(ctx, output, (int *)bytes_written, input, input_length)) { /* Error */ *bytes_written = 0; @@ -201,7 +201,7 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, { uint32_t tmplen; - if(!EVP_EncryptFinal_ex(&ctx, output + *bytes_written, (int *)&tmplen)) + if(!EVP_EncryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) { *bytes_written = 0; return; /* Error */ @@ -210,7 +210,7 @@ lanplus_encrypt_aes_cbc_128(const uint8_t * iv, { /* Success */ *bytes_written += tmplen; - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_cleanup(ctx); } } } @@ -239,10 +239,10 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, uint8_t * output, uint32_t * bytes_written) { - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); - EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv); - EVP_CIPHER_CTX_set_padding(&ctx, 0); + EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX_init(ctx); + EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); + EVP_CIPHER_CTX_set_padding(ctx, 0); if (verbose >= 5) @@ -266,7 +266,7 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, assert((input_length % IPMI_CRYPT_AES_CBC_128_BLOCK_SIZE) == 0); - if (!EVP_DecryptUpdate(&ctx, output, (int *)bytes_written, input, input_length)) + if (!EVP_DecryptUpdate(ctx, output, (int *)bytes_written, input, input_length)) { /* Error */ lprintf(LOG_DEBUG, "ERROR: decrypt update failed"); @@ -277,7 +277,7 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, { uint32_t tmplen; - if (!EVP_DecryptFinal_ex(&ctx, output + *bytes_written, (int *)&tmplen)) + if (!EVP_DecryptFinal_ex(ctx, output + *bytes_written, (int *)&tmplen)) { char buffer[1000]; ERR_error_string(ERR_get_error(), buffer); @@ -290,7 +290,7 @@ lanplus_decrypt_aes_cbc_128(const uint8_t * iv, { /* Success */ *bytes_written += tmplen; - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_cleanup(ctx); } } commit 80345ac56a753d64e1998664a91521193a8fa1b4 Merge: 0ea110a 2cc196d Author: Bjoern Spruck <bs...@un...> Date: Wed Nov 2 10:33:09 2016 +0100 Merge branch 'master' of ssh://git.code.sourceforge.net/u/spruckb/ipmitool commit 0ea110a247f831e5083861a84cdd34b6222b7ba4 Author: Bjoern Spruck <bs...@un...> Date: Tue Sep 6 16:31:11 2016 +0200 fix typo diff --git a/include/ipmitool/ipmi_sel.h b/include/ipmitool/ipmi_sel.h index ab8eaa9..a6a2a42 100644 --- a/include/ipmitool/ipmi_sel.h +++ b/include/ipmitool/ipmi_sel.h @@ -579,7 +579,7 @@ static const struct ipmi_event_sensor_types sensor_specific_event_types[] = { { 0xF1, 0x00, 0xff, "IPMB-A disabled, IPMB-B disabled" }, { 0xF1, 0x01, 0xff, "IPMB-A enabled, IPMB-B disabled" }, { 0xF1, 0x02, 0xff, "IPMB-A disabled, IPMB-B enabled" }, - { 0xF1, 0x03, 0xff, "IPMB-A enabled, IPMP-B enabled" }, + { 0xF1, 0x03, 0xff, "IPMB-A enabled, IPMB-B enabled" }, /* PICMG Module Hot Swap */ { 0xF2, 0x00, 0xff, "Module Handle Closed" }, { 0xF2, 0x01, 0xff, "Module Handle Opened" }, @@ -599,7 +599,7 @@ static const struct ipmi_event_sensor_types vita_sensor_event_types[] = { { 0xF1, 0x00, 0xFF, "IPMB-A disabled, IPMB-B disabled" }, { 0xF1, 0x01, 0xFF, "IPMB-A enabled, IPMB-B disabled" }, { 0xF1, 0x02, 0xFF, "IPMB-A disabled, IPMB-B enabled" }, - { 0xF1, 0x03, 0xFF, "IPMB-A enabled, IPMP-B enabled" }, + { 0xF1, 0x03, 0xFF, "IPMB-A enabled, IPMB-B enabled" }, /* VITA FRU Temperature */ { 0xF3, 0x00, 0xff, "At or below Lower Non-critical" }, { 0xF3, 0x01, 0xff, "At or below Lower Critical" }, commit 2cc196d5187657a666787c3c604a614afe6ec74a Author: Bjoern Spruck <bs...@un...> Date: Tue Sep 6 16:31:11 2016 +0200 fix typo diff --git a/include/ipmitool/ipmi_sel.h b/include/ipmitool/ipmi_sel.h index ab8eaa9..a6a2a42 100644 --- a/include/ipmitool/ipmi_sel.h +++ b/include/ipmitool/ipmi_sel.h @@ -579,7 +579,7 @@ static const struct ipmi_event_sensor_types sensor_specific_event_types[] = { { 0xF1, 0x00, 0xff, "IPMB-A disabled, IPMB-B disabled" }, { 0xF1, 0x01, 0xff, "IPMB-A enabled, IPMB-B disabled" }, { 0xF1, 0x02, 0xff, "IPMB-A disabled, IPMB-B enabled" }, - { 0xF1, 0x03, 0xff, "IPMB-A enabled, IPMP-B enabled" }, + { 0xF1, 0x03, 0xff, "IPMB-A enabled, IPMB-B enabled" }, /* PICMG Module Hot Swap */ { 0xF2, 0x00, 0xff, "Module Handle Closed" }, { 0xF2, 0x01, 0xff, "Module Handle Opened" }, @@ -599,7 +599,7 @@ static const struct ipmi_event_sensor_types vita_sensor_event_types[] = { { 0xF1, 0x00, 0xFF, "IPMB-A disabled, IPMB-B disabled" }, { 0xF1, 0x01, 0xFF, "IPMB-A enabled, IPMB-B disabled" }, { 0xF1, 0x02, 0xFF, "IPMB-A disabled, IPMB-B enabled" }, - { 0xF1, 0x03, 0xFF, "IPMB-A enabled, IPMP-B enabled" }, + { 0xF1, 0x03, 0xFF, "IPMB-A enabled, IPMB-B enabled" }, /* VITA FRU Temperature */ { 0xF3, 0x00, 0xff, "At or below Lower Non-critical" }, { 0xF3, 0x01, 0xff, "At or below Lower Critical" }, ----------------------------------------------------------------------- Summary of changes: include/ipmitool/ipmi_sel.h | 4 ++-- src/plugins/lanplus/lanplus_crypt_impl.c | 28 ++++++++++++++-------------- 2 files changed, 16 insertions(+), 16 deletions(-) hooks/post-receive -- ipmitool |
From: Allura u. <al...@ch...> - 2016-10-08 08:28:16
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 076ffb56503c8eedb03c2a164291d0ccd2185b9e (commit) via 89cffb984b4dee8edc1740a9837876a2164f8b73 (commit) via 3f7e82a6b4883d49d9836978cfc66c6a9ad63cf4 (commit) via c6cd49ea37da24d6e0a445845d0e63f2d2256418 (commit) from b5ce925744851b58193ad3ee18957ce88f6efc26 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 076ffb56503c8eedb03c2a164291d0ccd2185b9e Merge: b5ce925 89cffb9 Author: Zdenek Styblik <allura@localhost> Date: Sat Oct 8 08:28:15 2016 +0000 Merge /u/spruckb/ipmitool/ branch master into master https://sourceforge.net/p/ipmitool/source/merge-requests/12/ commit 89cffb984b4dee8edc1740a9837876a2164f8b73 Author: Bjoern Spruck <bs...@un...> Date: Thu Sep 1 11:27:38 2016 +0200 replaced/removed defines which are already present in ipmi_picmg.h Signed-off-by: Bjoern Spruck <bs...@un...> diff --git a/lib/ipmi_picmg.c b/lib/ipmi_picmg.c index c7d9c8e..2166cbe 100644 --- a/lib/ipmi_picmg.c +++ b/lib/ipmi_picmg.c @@ -37,11 +37,6 @@ #include <ipmitool/ipmi_strings.h> #include <ipmitool/log.h> -#define PICMG_EXTENSION_ATCA_MAJOR_VERSION 2 -#define PICMG_EXTENSION_AMC0_MAJOR_VERSION 4 -#define PICMG_EXTENSION_UTCA_MAJOR_VERSION 5 - - #define PICMG_EKEY_MODE_QUERY 0 #define PICMG_EKEY_MODE_PRINT_ALL 1 #define PICMG_EKEY_MODE_PRINT_ENABLED 2 @@ -2367,9 +2362,9 @@ picmg_discover(struct ipmi_intf *intf) { } 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_EXTENSION_ATCA_MAJOR_VERSION - && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_AMC0_MAJOR_VERSION - && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_UTCA_MAJOR_VERSION) { + } else if ((rsp->data[1] & 0x0F) != PICMG_ATCA_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_AMC_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_UTCA_MAJOR_VERSION) { lprintf(LOG_INFO,"Unknown PICMG Extension Version %d.%d", (rsp->data[1] & 0x0F), (rsp->data[1] >> 4)); } else { commit 3f7e82a6b4883d49d9836978cfc66c6a9ad63cf4 Author: Bjoern Spruck <bs...@un...> Date: Thu Sep 1 11:27:10 2016 +0200 added microTCA major version Signed-off-by: Bjoern Spruck <bs...@un...> diff --git a/include/ipmitool/ipmi_picmg.h b/include/ipmitool/ipmi_picmg.h index 3d70454..0bcbd93 100644 --- a/include/ipmitool/ipmi_picmg.h +++ b/include/ipmitool/ipmi_picmg.h @@ -12,6 +12,7 @@ #define PICMG_CPCI_MAJOR_VERSION 1 #define PICMG_ATCA_MAJOR_VERSION 2 #define PICMG_AMC_MAJOR_VERSION 4 +#define PICMG_UTCA_MAJOR_VERSION 5 /* PICMG commands */ #define PICMG_GET_PICMG_PROPERTIES_CMD 0x00 commit c6cd49ea37da24d6e0a445845d0e63f2d2256418 Author: Bjoern Spruck <bs...@un...> Date: Thu Sep 1 11:26:44 2016 +0200 fix typo Signed-off-by: Bjoern Spruck <bs...@un...> diff --git a/include/ipmitool/ipmi_sel.h b/include/ipmitool/ipmi_sel.h index 1c325db..ab8eaa9 100644 --- a/include/ipmitool/ipmi_sel.h +++ b/include/ipmitool/ipmi_sel.h @@ -580,7 +580,7 @@ static const struct ipmi_event_sensor_types sensor_specific_event_types[] = { { 0xF1, 0x01, 0xff, "IPMB-A enabled, IPMB-B disabled" }, { 0xF1, 0x02, 0xff, "IPMB-A disabled, IPMB-B enabled" }, { 0xF1, 0x03, 0xff, "IPMB-A enabled, IPMP-B enabled" }, - /* PICNG Moduke Hot Swap */ + /* PICMG Module Hot Swap */ { 0xF2, 0x00, 0xff, "Module Handle Closed" }, { 0xF2, 0x01, 0xff, "Module Handle Opened" }, { 0xF2, 0x02, 0xff, "Quiesced" }, ----------------------------------------------------------------------- Summary of changes: include/ipmitool/ipmi_picmg.h | 1 + include/ipmitool/ipmi_sel.h | 2 +- lib/ipmi_picmg.c | 11 +++-------- 3 files changed, 5 insertions(+), 9 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-10-08 08:25:36
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The tag, IPMITOOL_1_8_18 has been created at b5ce925744851b58193ad3ee18957ce88f6efc26 (commit) - Log ----------------------------------------------------------------- commit b5ce925744851b58193ad3ee18957ce88f6efc26 Author: Zdenek Styblik <st...@tu...> Date: Sat Oct 8 10:17:55 2016 +0200 Release Version 1.8.18 Update ChangeLog, configure.ac ----------------------------------------------------------------------- hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-10-08 08:21:33
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via b5ce925744851b58193ad3ee18957ce88f6efc26 (commit) from 1487681b8c4c10ef40aa8a3613d4f5f209ccceb6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b5ce925744851b58193ad3ee18957ce88f6efc26 Author: Zdenek Styblik <st...@tu...> Date: Sat Oct 8 10:17:55 2016 +0200 Release Version 1.8.18 Update ChangeLog, configure.ac diff --git a/ChangeLog b/ChangeLog index 767891c..ee25801 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,67 @@ +version 1.8.18 2016-10-08 + * Add mac2str() and str2mac() to print/parse MAC address + * Change formatting, remove commented-out code in + src/plugins/imb/imbapi.c + * Export find_lan_channel() as global + * Expose _ipmi_get_channel_info() + * Extend buf2str to allow separator + * Fix indentation of #define in src/plugins/imb/imbapi.c + * Fix missing `goto out_free;` when ipmi_parse_hex() returns (-1) + * Fix warning for buf2str argument + * ID 408 - fix sel list last X listing + * ID: 38 - Protocol violating SOL retries when talking to + SIMSO-HTC + * ID: 459 - Fix reading FRU on Artesyn (Emerson) shelf manager, + MF105. + * ID: 464 - ipmievd crash fix in log_event + * ID:230 - check return value of malloc() in lib/ipmi_ekanalyzer.c + * ID:261 - Fix err. output consistency for % ipmitool chassis + INV_PARAM; + * ID:287 - Fix print-out of DDR3 SDRAM Serial Number + * ID:287 - Remove trailing white-spaces from dimm_spd.c + * ID:289 - bmx-snmp-proxy: PEF alerting does not work for + multiple destinations + * ID:312 - BREAKING CHANGE - Re-design of PEF user interface + * ID:312 - Fix bitmask in _ipmi_set_pef_policy_entry() + * ID:335 - Check return value of fseek(), prevent segfault + * ID:335 - Check return value of fseek(), prevent segfault + * ID:355 - Comment out statement without effect in lib/ipmi_sel.c + * ID:355 - Fix 'missing initializer' in struct lan_param + * ID:355 - Fix ``warning: ISO C forbids zero-size array 'data''' + * ID:355 - Fix different pointer type in lib/ipmi_picmg.c + * ID:355 - Fix missing struct initializers in lib/ipmi_firewall.c + * ID:355 - Fix printf format in lib/ipmi_sunoem.c + * ID:355 - Fix printf() related warnings in lib/ipmi_delloem.c + * ID:355 - Fix signedness warnings in lib/ipmi_sdr.c + * ID:355 - Fix statements without effect in lib/ipmi_ekanalyzer.c + * ID:355 - Move section_id from ipmi_fru. to ipmi_fru.c + * ID:355 - Replace DEBUG() macro with lprintf(LOG_DEBUG, ...) + * ID:375 - Add lan6 subcommand to handle IPv6 LAN parameters + * ID:400 - Add support for VITA-specific sensor types and events. + * ID:441 - Add support for HMAC_MD5 and HMAC_SHA256 + * ID:443 - Disable USB driver by default on non-Linux systems + * ID:444 - Cleanup of defaults in configure.ac + * ID:445 - Fix of compilation on FreeBSD + * ID:446 - Fix broken firewall reset iterator + * ID:447 - Fix access beyond array limits in serial_terminal + * ID:449 - ipmitool close console session for sol deactivate + command + * ID:451 - Modify the memory ecc error display of SEL for new + supermicro motherboards. + * ID:452 - Add PICMG extension 5.x for PICMG extension check + * ID:454 - Add support for PICMG 3.1 R2.0 Link Types and Link + Classes. + * ID:456 - Unable to disable the VLAN ID using ipmitool + * ID:457 - Display User ID enable/disable status + * ID:463 - Removal of Nokia Siemens Networks + * ID:465 - Supermicro memory ecc Modify the memory ecc error + display of SEL for new supermicro boards. + * Moved ipmi_parse_hex() to helper.c + * Re-work ipmi_mc_get_guid() and turn it into reusable code + * Revert "ID:335 - Check return value of fseek(), prevent + segfault" + * Rewrite code with the notion that Kg is binary data, not string + version 1.8.17 2016-05-01 * Add INSTALL and NEWS, mandated by autoconf * Added missing ipmi_sel_supermicro.h to template Makefile.am diff --git a/configure.ac b/configure.ac index f3db651..88232a6 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl dnl autoconf for ipmitool dnl -AC_INIT([ipmitool], [1.8.17-cvs]) +AC_INIT([ipmitool], [1.8.18-csv]) AC_CONFIG_SRCDIR([src/ipmitool.c]) AC_CANONICAL_SYSTEM AM_INIT_AUTOMAKE ----------------------------------------------------------------------- Summary of changes: ChangeLog | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 65 insertions(+), 1 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-10-06 04:19:43
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 1487681b8c4c10ef40aa8a3613d4f5f209ccceb6 (commit) from 75a79e164d1162dad75d221aac3ade5efada7330 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1487681b8c4c10ef40aa8a3613d4f5f209ccceb6 Author: kc...@su... <kc...@su...> Date: Wed Oct 5 16:09:55 2016 +0800 ID:465 - Supermicro memory ecc Modify the memory ecc error display of SEL for new supermicro boards. diff --git a/include/ipmitool/ipmi_sel_supermicro.h b/include/ipmitool/ipmi_sel_supermicro.h index 1679bd8..98960e6 100644 --- a/include/ipmitool/ipmi_sel_supermicro.h +++ b/include/ipmitool/ipmi_sel_supermicro.h @@ -34,18 +34,37 @@ #ifndef IPMI_SEL_SUPERMICRO_H # define IPMI_SEL_SUPERMICRO_H +static uint16_t supermicro_x11[] = { + 0x0958, 0x0955, 0x0953, 0x0952, 0x0941, 0x093A, 0x0939, 0x0938, 0x0937, 0x0930, 0x0927, 0x091D, + 0x091C, 0x0917, 0x090D, 0x0909, 0x0907, 0x0901, 0x089F, 0x089C, 0x089B, 0x089A, 0x0898, 0x0896, + 0x0895, 0x0894, 0x0891, 0x0890, 0x0888, 0x0886, 0x0885, 0x0884, 0xFFFF +}; + +static uint16_t supermicro_b11[] = { + 0xFFFF +}; + +static uint16_t supermicro_b2[] = { + 0x0951, 0x094E, 0x0931, 0x092E, 0x092A, 0x0928, 0x0908, 0xFFFF +}; + static uint16_t supermicro_x10OBi[] = { 0x0923, 0xFFFF }; -static uint16_t supermicro_x10QRH_X10QBL[] = { - 0x0872, 0x0853, 0xFFFF +static uint16_t supermicro_x10QRH[] = { + 0x0872, 0xFFFF +}; + +static uint16_t supermicro_x10QBL[] = { + 0x0853, 0xFFFF }; static uint16_t supermicro_brickland[] = { 0x0726, 0x083A, 0xFFFF }; + static uint16_t supermicro_x9dal[] = { 0x0635, 0xFFFF }; @@ -62,38 +81,75 @@ static uint16_t supermicro_x9[] = { 0x0635, 0x0733, 0x0722, 0x0703, 0x0721, 0x0716, 0x0637, 0x0651, 0xFFFF }; +static uint16_t supermicro_romely[] = { + 0x0841, 0x0732, 0x0731, 0x0730, 0x0727, 0x0725, 0x0724, 0x0723, 0x0720, 0x0718, 0x0717, 0x0715, + 0x0713, 0x0711, 0x070E, 0x070A, 0x0709, 0x0708, 0x0706, 0x0705, 0x0704, 0x0702, 0x0701, 0x0700, + 0x066F, 0x066E, 0x066D, 0x0669, 0x0667, 0x0666, 0x0665, 0x0664, 0x0662, 0x0660, 0x0636, 0x0630, + 0x062F, 0x062C, 0x0628, 0x0626, 0x0827, 0x070F, 0x0707, 0x0840, 0x0729, 0x0719, 0x0712, 0x070D, + 0x066C, 0x066A, 0x0625, 0x0714, 0x0710, 0x070C, 0x070B, 0x0668, 0x0663, 0x0661, 0x062B, 0x062A, + 0x0629, 0x093E, 0x0932, 0x092D, 0x092B, 0x0924, 0x0922, 0x0921, 0x091E, 0x0919, 0x0916, 0x089D, + 0x0899, 0x0893, 0x0892, 0x0882, 0x0881, 0x0880, 0x087F, 0x087D, 0x0879, 0x0877, 0x086F, 0x086E, + 0x086D, 0x086C, 0x086B, 0x085C, 0x085B, 0x084B, 0x0865, 0x0864, 0x0860, 0x0859, 0x0858, 0x0857, + 0x0854, 0x0852, 0x0845, 0x0844, 0x0843, 0x0842, 0x083B, 0x0838, 0x0837, 0x0836, 0x0835, 0x0834, + 0x0833, 0x0832, 0x0831, 0x0830, 0x0826, 0x0825, 0x0824, 0x0822, 0x0821, 0x0819, 0x0818, 0x0817, + 0x0816, 0x0815, 0x0814, 0x0728, 0x0813, 0x0812, 0x0810, 0x0807, 0x0806, 0x0805, 0x0804, 0x0803, + 0x0802, 0x0801, 0x0889, 0x0861, 0x083E, 0x0846, 0x0946, 0x0950, 0xFFFF +}; + static uint16_t supermicro_b8[] = { 0x000A, 0x061c, 0x0620, 0x0101, 0x061f, 0x0612, 0x061e, 0xFFFF }; static uint16_t supermicro_h8[] = { 0xa111, 0x0408, 0x0811, 0x1411, 0x0911, 0x1211, 0x1011, 0xcd11, 0x1111, 0xbe11, 0xce11, 0xbd11, - 0xbc11, 0xa911, 0xaa11, 0xbd11, 0xcb11, 0xad11, 0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, - 0x2511, 0xbf11, 0x1511, 0x2211, 0x2411, 0x1911, 0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, - 0xa311, 0x1311, 0xba11, 0xa711, 0xd111, 0x1711, 0xcf11, 0x2011, 0x1811, 0xFFFF + 0xbc11, 0xa911, 0xaa11, 0xcb11, 0xad11, 0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, 0x2511, + 0xbf11, 0x1511, 0x2211, 0x2411, 0x1911, 0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, 0xa311, + 0x1311, 0xba11, 0xa711, 0xd111, 0x1711, 0xcf11, 0x2011, 0x1811, 0xFFFF }; static uint16_t supermicro_p8[] = { - 0x6480, 0x7380, 0x6280, 0x7480, 0x5980, 0xFFFF + 0x5980, 0x6280, 0x6480, 0x7380, 0x7480, 0x0933, 0x094F, 0xFFFF }; static uint16_t supermicro_x8[] = { 0xa880, 0x0403, 0x0100, 0x0601, 0x0001, 0x0404, 0x0606, 0x0608, 0x0632, 0x0400, 0x0401, 0x0006, 0x040a, 0xf280, 0x060f, 0x0609, 0x0008, 0x0613, 0x061b, 0x0007, 0x0600, 0x060c, 0x060d, 0x0614, - 0x060c, 0x0003, 0x040b, 0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, - 0x061a, 0xf580, 0x062e, 0x0009, 0xFFFF + 0x0003, 0x040b, 0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, 0x061a, + 0xf580, 0x062e, 0x0009, 0xFFFF }; static uint16_t supermicro_X8[] = { 0x000A, 0x061c, 0x0620, 0x0101, 0x061f, 0x0612, 0x061e, 0xa111, 0x0408, 0x0811, 0x1411, 0x0911, - 0x1211, 0x1011, 0xcd11, 0x1111, 0xbe11, 0xce11, 0xbd11, 0xbc11, 0xa911, 0xaa11, 0xbd11, 0xcb11, - 0xad11, 0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, 0x2511, 0xbf11, 0x1511, 0x2211, 0x2411, - 0x1911, 0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, 0xa311, 0x1311, 0xba11, 0xa711, 0xd111, - 0x1711, 0xcf11, 0x2011, 0x1811, 0x6480, 0x7380, 0x6280, 0x7480, 0x5980, 0xa880, 0x0403, 0x0100, - 0x0601, 0x0001, 0x0404, 0x0606, 0x0608, 0x0632, 0x0400, 0x0401, 0x0006, 0x040a, 0xf280, 0x060f, - 0x0609, 0x0008, 0x0613, 0x061b, 0x0007, 0x0600, 0x060c, 0x060d, 0x0614, 0x060c, 0x0003, 0x040b, - 0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, 0x061a, 0xf580, 0x062e, + 0x1211, 0x1011, 0xcd11, 0x1111, 0xbe11, 0xce11, 0xbd11, 0xbc11, 0xa911, 0xaa11, 0xcb11, 0xad11, + 0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, 0x2511, 0xbf11, 0x1511, 0x2211, 0x2411, 0x1911, + 0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, 0xa311, 0x1311, 0xba11, 0xa711, 0xd111, 0x1711, + 0xcf11, 0x2011, 0x1811, 0x5980, 0x6280, 0x6480, 0x7380, 0x7480, 0x0933, 0x094F, 0xa880, 0x0403, + 0x0100, 0x0601, 0x0001, 0x0404, 0x0606, 0x0608, 0x0632, 0x0400, 0x0401, 0x0006, 0x040a, 0xf280, + 0x060f, 0x0609, 0x0008, 0x0613, 0x061b, 0x0007, 0x0600, 0x060c, 0x060d, 0x0614, 0x0003, 0x040b, + 0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, 0x061a, 0xf580, 0x062e, 0x0009, 0xFFFF }; +static uint16_t supermicro_older[] = { + 0x8080, 0x8180, 0x8280, 0x8480, 0x8580, 0x8680, 0x8780, 0x8880, 0x8980, 0x9080, 0x9180, 0x9280, + 0x9380, 0x9480, 0x9580, 0x9680, 0x9780, 0xA080, 0x9880, 0x9980, 0xB080, 0xB180, 0xB280, 0xB380, + 0xB480, 0xA280, 0xB580, 0xB680, 0xA580, 0xB780, 0xD180, 0xA380, 0xA480, 0xD680, 0xBA80, 0xD280, + 0x2111, 0xD380, 0xBC80, 0xBD80, 0xBE80, 0xC080, 0xC180, 0xAA80, 0xBE80, 0xBF80, 0xAB80, 0xD480, + 0xD580, 0xAF80, 0xAE80, 0xC280, 0xAC80, 0xD080, 0xDA80, 0xDB80, 0xDC80, 0xDD80, 0xA680, 0xDE80, + 0xAA80, 0xDF80, 0xBB80, 0xA780, 0xF080, 0xF180, 0xB880, 0xC380, 0xB780, 0x2311, 0xA980, 0xF480, + 0xB980, 0x0002, 0xba80, 0x0602, 0x0603, 0x0604, 0x0607, 0x0410, 0xA611, 0x060A, 0x0611, 0xBB11, + 0x061D, 0x0622, 0x0623, 0x0624, 0x0627, 0x0631, 0x0633, 0x0634, 0x0690, 0x0691, 0x0640, 0x0641, + 0x0642, 0x066B, 0x0743, 0x0644, 0x0645, 0x0645, 0x0646, 0x0647, 0x0648, 0x0647, 0x0650, 0x0652, + 0x0653, 0x0654, 0x0655, 0x0808, 0x0809, 0x0656, 0x0657, 0x0658, 0x0659, 0x0820, 0x0820, 0x0734, + 0x0823, 0x0828, 0x0829, 0x0839, 0x083C, 0x083D, 0x083F, 0x0847, 0x0848, 0x0849, 0x0850, 0x0851, + 0x0855, 0x0856, 0x0862, 0x0863, 0x0866, 0x0867, 0x0868, 0x0869, 0x084A, 0x084C, 0x084D, 0x084F, + 0x085A, 0x085D, 0x085E, 0x085F, 0x086A, 0x0870, 0x0873, 0x0874, 0x0875, 0x0876, 0x0878, 0x087A, + 0x087B, 0x087C, 0x087E, 0x0883, 0x0887, 0x088A, 0x088B, 0x088C, 0x088D, 0x088E, 0x088F, 0x0897, + 0x089E, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x090A, 0x090B, 0x090C, 0x090E, 0x090F, 0x0910, + 0x0912, 0x0913, 0x0914, 0x0915, 0x0918, 0x091A, 0x091B, 0x091F, 0x0920, 0x0925, 0x0926, 0x0929, + 0x092C, 0x092F, 0x0934, 0x0935, 0x0936, 0x093B, 0x093C, 0x093D, 0x093F, 0x0940, 0x0942, 0x0943, + 0x0944, 0x0945, 0x0947, 0x0948, 0x0949, 0x094A, 0x094B, 0x094C, 0x094D, 0x094E, 0x0954, 0x0956, + 0x0957, 0x0959, 0xFFFF +}; + #endif /* IPMI_SEL_SUPERMICRO_H */ diff --git a/lib/ipmi_sel.c b/lib/ipmi_sel.c index 0c07cf4..8b0395e 100644 --- a/lib/ipmi_sel.c +++ b/lib/ipmi_sel.c @@ -548,7 +548,7 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) struct ipmi_rs *rsp; struct ipmi_rq req; char *desc = NULL; - int chipset_type = 1; + int chipset_type = 4; int data1; int data2; int data3; @@ -614,6 +614,18 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) break; } } + for (i = 0; supermicro_older[i] != 0xFFFF; i++) { + if (oem_id == supermicro_older[i]) { + chipset_type = 0; + break; + } + } + for (i = 0; supermicro_romely[i] != 0xFFFF; i++) { + if (oem_id == supermicro_romely[i]) { + chipset_type = 1; + break; + } + } for (i = 0; supermicro_x9[i] != 0xFFFF; i++) { if (oem_id == supermicro_x9[i]) { chipset_type = 2; @@ -626,8 +638,14 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) break; } } - for (i = 0; supermicro_x10QRH_X10QBL[i] != 0xFFFF; i++) { - if (oem_id == supermicro_x10QRH_X10QBL[i]) { + for (i = 0; supermicro_x10QRH[i] != 0xFFFF; i++) { + if (oem_id == supermicro_x10QRH[i]) { + chipset_type = 4; + break; + } + } + for (i = 0; supermicro_x10QBL[i] != 0xFFFF; i++) { + if (oem_id == supermicro_x10QBL[i]) { chipset_type = 4; break; } ----------------------------------------------------------------------- Summary of changes: include/ipmitool/ipmi_sel_supermicro.h | 86 ++++++++++++++++++++++++++------ lib/ipmi_sel.c | 24 ++++++++- 2 files changed, 92 insertions(+), 18 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-09-24 19:21:23
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 75a79e164d1162dad75d221aac3ade5efada7330 (commit) via 2d4762d573658895ac96e5ccaee9f018e7154f43 (commit) from 052655cd91e9173e43c4540737d52d031a7a9046 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 75a79e164d1162dad75d221aac3ade5efada7330 Author: Marcin Bernatowicz <mar...@gm...> Date: Fri Sep 16 10:20:14 2016 +0200 ID: 464 - ipmievd crash fix in log_event added missing format specifier for sensor number in lprintf diff --git a/src/ipmievd.c b/src/ipmievd.c index 81695c8..67788e5 100644 --- a/src/ipmievd.c +++ b/src/ipmievd.c @@ -332,7 +332,7 @@ log_event(struct ipmi_event_intf * eintf, struct sel_event_record * evt) break; default: - lprintf(LOG_NOTICE, "%s%s sensor - %s", + lprintf(LOG_NOTICE, "%s%s sensor (0x%02x) - %s", eintf->prefix, type, evt->sel_type.standard_type.sensor_num, desc ? desc : ""); break; commit 2d4762d573658895ac96e5ccaee9f018e7154f43 Author: Mikko Piironen <mik...@no...> Date: Mon Sep 12 15:18:47 2016 +0300 ID:463 - Removal of Nokia Siemens Networks diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c index cd8d492..94b2abd 100644 --- a/lib/ipmi_strings.c +++ b/lib/ipmi_strings.c @@ -64,7 +64,7 @@ const struct valstr ipmi_oem_info[] = { { IPMI_OEM_TOSHIBA, "Toshiba" }, { IPMI_OEM_HITACHI_116, "Hitachi" }, { IPMI_OEM_HITACHI_399, "Hitachi" }, - { IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS, "Nokia Solutions and Networks (formerly 'Nokia Siemens Networks')" }, + { IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS, "Nokia Solutions and Networks" }, { IPMI_OEM_BULL, "Bull Company" }, { IPMI_OEM_PPS, "Pigeon Point Systems" }, { IPMI_OEM_BROADCOM, "Broadcom Corporation" }, ----------------------------------------------------------------------- Summary of changes: lib/ipmi_strings.c | 2 +- src/ipmievd.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-08-31 17:36:01
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 052655cd91e9173e43c4540737d52d031a7a9046 (commit) via fa2c1550b9e36c4ecd6aa27446df34cec56f4001 (commit) from 51198a17490e5c81f675fee9a4bb042de65a7a96 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 052655cd91e9173e43c4540737d52d031a7a9046 Author: B BALAJI SINGH <b_b...@de...> Date: Tue Aug 30 03:05:46 2016 -0400 ID:456 - Unable to disable the VLAN ID using ipmitool Currently, when a LAN parameter set command is sent through ipmitool, the corresponding parameter data is requested and compared to the command to verify that the data was written correctly. Since we do send the VLAN ID in this return data, regardless of whether VLAN is disabled or not, this mismatch between requested and received parameters causes ipmitool to retry the command 10 times and return an error. ipmitool is sending "0x00 0x00" reading back data from BMC as "0x01 0x00" which is NOT matching & hence pops up the error /warning "LAN Parameter Data does not match! Write may have failed." After 10 retries when we check "ipmitool lan print" VLAN ID is disabled successfully. diff --git a/lib/ipmi_lanp.c b/lib/ipmi_lanp.c index 16a3a3e..65d881b 100644 --- a/lib/ipmi_lanp.c +++ b/lib/ipmi_lanp.c @@ -1204,12 +1204,27 @@ get_cmdline_ipaddr(char * arg, uint8_t * buf) static int ipmi_lan_set_vlan_id(struct ipmi_intf *intf, uint8_t chan, char *string) { + struct lan_param *p; uint8_t data[2]; int rc; if (string == NULL) { - data[0] = 0; - data[1] = 0; + lprintf(LOG_DEBUG, "Get current VLAN ID from BMC."); + p = get_lan_param(intf, chan, IPMI_LANP_VLAN_ID); + if (p != NULL && p->data != NULL && p->data_len > 1) { + int id = ((p->data[1] & 0x0f) << 8) + p->data[0]; + if (id < 1 || id > 4094) { + lprintf(LOG_ERR, + "Retrieved VLAN ID %i is out of range <1..4094>.", + id); + return (-1); + } + data[0] = p->data[0]; + data[1] = p->data[1] & 0x0F; + } else { + data[0] = 0; + data[1] = 0; + } } else { int id = 0; commit fa2c1550b9e36c4ecd6aa27446df34cec56f4001 Author: Dmitry Rakhchev <rd...@pi...> Date: Fri Aug 26 23:08:16 2016 +0300 ID: 459 - Fix reading FRU on Artesyn (Emerson) shelf manager, MF105. Treat 0xC7 as an indication that requested data length in the FRU read shall be decreased. diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index 9a6fc6c..cf00eff 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -684,9 +684,9 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, break; } if (rsp->ccode > 0) { - /* if we get C8h or CAh completion code then we requested too + /* if we get C7h or C8h or CAh return code then we requested too * many bytes at once so try again with smaller size */ - if ((rsp->ccode == 0xc8 || rsp->ccode == 0xca) + if ((rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) && fru->max_read_size > 8) { if (fru->max_read_size > 32) { /* subtract read length more aggressively */ ----------------------------------------------------------------------- Summary of changes: lib/ipmi_fru.c | 4 ++-- lib/ipmi_lanp.c | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-08-21 12:10:35
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 51198a17490e5c81f675fee9a4bb042de65a7a96 (commit) from cc9a6b3964629fef0c3b4a03c4eaed8730fa1550 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 51198a17490e5c81f675fee9a4bb042de65a7a96 Author: Zdenek Styblik <st...@tu...> Date: Sun Aug 21 13:16:16 2016 +0200 ID: 38 - Protocol violating SOL retries when talking to SIMSO-HTC c&p from the ticket: ~~~ When I try to use CVS-ipmitool on Ubuntu 8.04 x86_64 to talk to a SuperMicros SIMSO-HTC (Rev. 2.5, IPMI 2.0) chip on a X7SBi-Board via SOL I often get doubled characters when typing fast, making the SOL interface basically unusable for anyone accustomed to using a keyboard for longer than a month ;) At first I thought this was an issue with SuperMicros implementation of the protocol and/or the flow control setup on the machine, but their own app works fine (but not the Linux CLI, which is maybe based on ipmitool?). But after reading the IPMI 2.0 SOL specs and watching the debug output for a bit, it seems that is really an issue with lanplus-SOL protocol implentation of ipmitool in general. Specifically, in lanplus.c:ipmi_lanplus_send_payload, when waiting for a SOL response the case that a non SOL packet is returned is not being checked. Also the "if (is_sol_packet(rsp) && rsp->data_len)" branch does terminate with a break, but instead goes for a send try, that seems counterintuitive, Both these things cause doubled characters for me. The attached patch seems to solve these issues in my case, but I don't claim to fully understand your protocol code and/or the protocol, so maybe it will cause problems elsewhere, especially under packet loss conditions. ~~~ diff --git a/src/plugins/lanplus/lanplus.c b/src/plugins/lanplus/lanplus.c index a9ff926..a0e388c 100644 --- a/src/plugins/lanplus/lanplus.c +++ b/src/plugins/lanplus/lanplus.c @@ -2369,6 +2369,10 @@ ipmi_lanplus_send_payload( rsp = ipmi_lanplus_recv_sol(intf); /* Grab the next packet */ + if (!is_sol_packet(rsp)) { + break; + } + if (sol_response_acks_packet(rsp, payload)) break; @@ -2381,6 +2385,7 @@ ipmi_lanplus_send_payload( intf->session->sol_data.sol_input_handler(rsp); /* In order to avoid duplicate output, just set data_len to 0 */ rsp->data_len = 0; + break; } } ----------------------------------------------------------------------- Summary of changes: src/plugins/lanplus/lanplus.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-08-21 11:10:04
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via cc9a6b3964629fef0c3b4a03c4eaed8730fa1550 (commit) via ea471ed5faa99689fb4691f32dd6530ddb951ebb (commit) via e30c357db78b977017ae88a5953c8071142848a7 (commit) from 95eb252ecd7c502463b1884ccd11974c1c58f49a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cc9a6b3964629fef0c3b4a03c4eaed8730fa1550 Author: Zdenek Styblik <st...@tu...> Date: Sun Aug 21 12:17:10 2016 +0200 ID:457 - Display User ID enable/disable status Commit implements `Enable status` which shows/is in alignment with (22.27) Get User Access Command and displays User ID Enable/Disable status of given User ID at given channel. diff --git a/include/ipmitool/ipmi_strings.h b/include/ipmitool/ipmi_strings.h index 3ded61f..63bbea9 100644 --- a/include/ipmitool/ipmi_strings.h +++ b/include/ipmitool/ipmi_strings.h @@ -52,6 +52,7 @@ extern const struct valstr ipmi_auth_algorithms[]; extern const struct valstr ipmi_integrity_algorithms[]; extern const struct valstr ipmi_encryption_algorithms[]; extern const struct valstr ipmi_oem_info[]; +extern const struct valstr ipmi_user_enable_status_vals[]; extern const struct valstr picmg_frucontrol_vals[]; extern const struct valstr picmg_clk_family_vals[]; diff --git a/lib/ipmi_channel.c b/lib/ipmi_channel.c index 5171644..fab2e54 100644 --- a/lib/ipmi_channel.c +++ b/lib/ipmi_channel.c @@ -734,7 +734,8 @@ ipmi_get_user_access(struct ipmi_intf *intf, uint8_t channel, uint8_t user_id) (user_access.ipmi_messaging) ? "en" : "dis"); printf("Privilege Level : %s\n", val2str(user_access.privilege_limit, ipmi_privlvl_vals)); - + printf("Enable Status : %s\n", + val2str(user_access.enable_status, ipmi_user_enable_status_vals)); curr_uid ++; } while (!user_id && curr_uid <= max_uid); diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c index f14bc21..cd8d492 100644 --- a/lib/ipmi_strings.c +++ b/lib/ipmi_strings.c @@ -646,6 +646,14 @@ const struct valstr ipmi_encryption_algorithms[] = { { 0x00, NULL } }; +const struct valstr ipmi_user_enable_status_vals[] = { + { 0x00, "unknown" }, + { 0x40, "enabled" }, + { 0x80, "disabled" }, + { 0xC0, "reserved" }, + { 0xFF, NULL }, +}; + const struct valstr picmg_frucontrol_vals[] = { { 0, "Cold Reset" }, { 1, "Warm Reset" }, commit ea471ed5faa99689fb4691f32dd6530ddb951ebb Author: Dan Gora <dg...@ad...> Date: Thu Jul 28 18:00:22 2016 -0300 ID:454 - Add support for PICMG 3.1 R2.0 Link Types and Link Classes. PICMG 3.1 R2.0 introduces new a new Link Class field in the FRU Link Descriptors which is the upper 4 bits of the Link Type field. This new Link Class field specifies SERDES lanes with 10.3125Gbd signalling rate. It also introduces the new Base-KX and Base-KX4 types which are the new IEEE replacements for the PICMG 3.0 Base-BX and Base-BX4 types. This patch decodes these new types and fields and will print out proper descriptions for each one based on PICMG 3.1 R2.0 diff --git a/include/ipmitool/ipmi_fru.h b/include/ipmitool/ipmi_fru.h index b371f44..65696ba 100644 --- a/include/ipmitool/ipmi_fru.h +++ b/include/ipmitool/ipmi_fru.h @@ -297,22 +297,24 @@ struct fru_picmgext_link_desc { unsigned int desig_channel:6; unsigned int desig_if:2; unsigned int desig_port:4; -#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 +#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03 -#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 -#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 +#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 +#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 +#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD 0x32 unsigned int type:8; unsigned int ext:4; unsigned int grouping:8; #else unsigned int grouping:8; unsigned int ext:4; -#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 +#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02 #define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03 -#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 -#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 +#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04 +#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05 +#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD 0x32 unsigned int type:8; unsigned int desig_port:4; unsigned int desig_if:2; diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index e5396d8..9a6fc6c 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -2288,8 +2288,7 @@ static void ipmi_fru_picmg_ext_print(uint8_t * fru_data, int off, int length) printf(" Link Type Extension: 0x%02x - ", d->ext); if (d->type == FRU_PICMGEXT_LINK_TYPE_BASE) { - switch (d->ext) - { + switch (d->ext) { case 0: printf("10/100/1000BASE-T Link (four-pair)\n"); break; @@ -2297,76 +2296,93 @@ static void ipmi_fru_picmg_ext_print(uint8_t * fru_data, int off, int length) printf("ShMC Cross-connect (two-pair)\n"); break; default: - printf("Unknwon\n"); + printf("Unknown\n"); break; } } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET) { - switch (d->ext) - { + switch (d->ext) { case 0: - printf("Fixed 1000Base-BX\n"); + printf("1000Base-BX\n"); break; case 1: - printf("Fixed 10GBASE-BX4 [XAUI]\n"); + printf("10GBase-BX4 [XAUI]\n"); break; case 2: printf("FC-PI\n"); break; + case 3: + printf("1000Base-KX\n"); + break; + case 4: + printf("10GBase-KX4\n"); + break; default: - printf("Unknwon\n"); + printf("Unknown\n"); + break; + } + } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD) { + switch (d->ext) { + case 0: + printf("10GBase-KR\n"); + break; + case 1: + printf("40GBase-KR4\n"); + break; + default: + printf("Unknown\n"); break; } } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND) { - printf("Unknwon\n"); + printf("Unknown\n"); } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR) { - printf("Unknwon\n"); + printf("Unknown\n"); } else if (d->type == FRU_PICMGEXT_LINK_TYPE_PCIE) { - printf("Unknwon\n"); + printf("Unknown\n"); } else { - printf("Unknwon\n"); + printf("Unknown\n"); } printf(" Link Type: 0x%02x - ", d->type); - if (d->type == 0 || d->type == 0xff) { - printf("Reserved\n"); - } - else if (d->type >= 0x06 && d->type <= 0xef) { - printf("Reserved\n"); - } - else if (d->type >= 0xf0 && d->type <= 0xfe) { - printf("OEM GUID Definition\n"); - } - else { - switch (d->type) - { - case FRU_PICMGEXT_LINK_TYPE_BASE: - printf("PICMG 3.0 Base Interface 10/100/1000\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET: - printf("PICMG 3.1 Ethernet Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND: - printf("PICMG 3.2 Infiniband Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR: - printf("PICMG 3.3 Star Fabric Interface\n"); - break; - case FRU_PICMGEXT_LINK_TYPE_PCIE: - printf("PICMG 3.4 PCI Express Fabric Interface\n"); - break; - default: + switch (d->type) { + case FRU_PICMGEXT_LINK_TYPE_BASE: + printf("PICMG 3.0 Base Interface 10/100/1000\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET: + printf("PICMG 3.1 Ethernet Fabric Interface\n"); + printf(" Base signaling Link Class\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND: + printf("PICMG 3.2 Infiniband Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR: + printf("PICMG 3.3 Star Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_PCIE: + printf("PICMG 3.4 PCI Express Fabric Interface\n"); + break; + case FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD: + printf("PICMG 3.1 Ethernet Fabric Interface\n"); + printf(" 10.3125Gbd signaling Link Class\n"); + break; + default: + if (d->type == 0 || d->type == 0xff) { + printf("Reserved\n"); + } else if (d->type >= 0x06 && d->type <= 0xef) { + printf("Reserved\n"); + } else if (d->type >= 0xf0 && d->type <= 0xfe) { + printf("OEM GUID Definition\n"); + } else { printf("Invalid\n"); - break; - } + } + break; } printf(" Link Designator: \n"); printf(" Port Flag: 0x%02x\n", d->desig_port); printf(" Interface: 0x%02x - ", d->desig_if); - switch (d->desig_if) - { + switch (d->desig_if) { case FRU_PICMGEXT_DESIGN_IF_BASE: printf("Base Interface\n"); break; commit e30c357db78b977017ae88a5953c8071142848a7 Author: Dmitry Rakhchev <rd...@pi...> Date: Mon Jul 4 18:14:42 2016 +0300 ID:375 - Add lan6 subcommand to handle IPv6 LAN parameters diff --git a/include/ipmitool/Makefile.am b/include/ipmitool/Makefile.am index 160e354..9093a56 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_vita.h ipmi_sel_supermicro.h - + ipmi_delloem.h ipmi_dcmi.h ipmi_vita.h ipmi_sel_supermicro.h \ + ipmi_cfgp.h ipmi_lanp6.h diff --git a/include/ipmitool/ipmi_cfgp.h b/include/ipmitool/ipmi_cfgp.h new file mode 100644 index 0000000..ab8acb3 --- /dev/null +++ b/include/ipmitool/ipmi_cfgp.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2016 Pentair Technical Products. 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 Pentair Technical Products 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef IPMI_CFGP_H +#define IPMI_CFGP_H + +#include <stdio.h> + +/* Forward declarations. */ +struct ipmi_cfgp; +struct ipmi_cfgp_ctx; + +/* + * Action types. + */ +enum { + /* parse dumped parameter data */ + CFGP_PARSE, + /* get parameter from BMC */ + CFGP_GET, + /* set parameter to BMC */ + CFGP_SET, + /* output parameter data in form that can be parsed back */ + CFGP_SAVE, + /* print parameter in user-friendly format */ + CFGP_PRINT +}; + +/* + * Action-specific information. + */ +struct ipmi_cfgp_action { + /* Action type. */ + int type; + + /* Set selector. */ + int set; + + /* Block selector. */ + int block; + + /* No error output needed. */ + int quiet; + + /* Number of command line arguments (only for parse action). */ + int argc; + + /* Command line arguments (only for parse action). */ + const char **argv; + + /* Output file (only for dump/print actions). */ + FILE *file; +}; + +/* + * Access types. + */ +enum { + CFGP_RDWR, + CFGP_RDONLY, + CFGP_WRONLY, + CFGP_RESERVED +}; + +/* + * Configuration parameter descriptor. + */ +struct ipmi_cfgp { + /* Parameter name. */ + const char *name; + + /* Parameter format description. */ + const char *format; + + /* Various parameter traits. */ + unsigned int size; /* block size */ + unsigned int access:2; /* read-write/read-only/write-only */ + unsigned int is_set:1; /* takes non-zero set selectors */ + unsigned int first_set:1; /* 1 = 1-based set selector */ + unsigned int has_blocks:1; /* takes non-zero block selectors */ + unsigned int first_block:1; /* 1 = 1-based block selector */ + + /* Parameter-specific data. */ + int specific; +}; + +/* Parameter callback. */ +typedef int (*ipmi_cfgp_handler_t)(void *priv, + const struct ipmi_cfgp *p, const struct ipmi_cfgp_action *action, + unsigned char *data); + +/* + * Parameter selector. + */ +struct ipmi_cfgp_sel { + int param; + int set; + int block; +}; + +/* + * Configuration parameter data. + */ +struct ipmi_cfgp_data { + struct ipmi_cfgp_data *next; + struct ipmi_cfgp_sel sel; + unsigned char data[]; +}; + +/* + * Configuration parameter operation context. + */ +struct ipmi_cfgp_ctx { + /* Set of parameters. */ + const struct ipmi_cfgp *set; + + /* Descriptor count. */ + int count; + + /* Parameter action handler. */ + ipmi_cfgp_handler_t handler; + + /* ipmitool cmd name */ + const char *cmdname; + + /* List of parameter values. */ + struct ipmi_cfgp_data *v; + + /* Private data. */ + void *priv; +}; + +/* Initialize configuration context. */ +extern int ipmi_cfgp_init(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp *set, unsigned int count, + const char *cmdname, + ipmi_cfgp_handler_t handler, void *priv); + +/* Uninitialize context, free allocated memory. */ +extern int ipmi_cfgp_uninit(struct ipmi_cfgp_ctx *ctx); + +/* Print parameter usage. */ +void ipmi_cfgp_usage(const struct ipmi_cfgp *set, int count, int write); + +/* Parse parameter selector from command line. */ +extern int ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx, + int argc, const char **argv, struct ipmi_cfgp_sel *sel); + +/* Parse parameter data from command line. */ +extern int ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, int argc, const char **argv); + +/* Get parameter data from BMC. */ +extern int ipmi_cfgp_get(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel); + +/* Set parameter data to BMC. */ +extern int ipmi_cfgp_set(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel); + +/* Write parameter data to file. */ +extern int ipmi_cfgp_save(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, FILE *file); + +/* Print parameter data in user-friendly format. */ +extern int ipmi_cfgp_print(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, FILE *file); + +#endif /* IPMI_CFGP_H */ diff --git a/include/ipmitool/ipmi_lanp.h b/include/ipmitool/ipmi_lanp.h index 0972544..0ef2d96 100644 --- a/include/ipmitool/ipmi_lanp.h +++ b/include/ipmitool/ipmi_lanp.h @@ -78,6 +78,37 @@ enum { IPMI_LANP_RMCP_PRIV_LEVELS, IPMI_LANP_VLAN_TAGS, IPMI_LANP_BAD_PASS_THRESH, + IPMI_LANP_IP6_SUPPORT=50, + IPMI_LANP_IP6_ENABLES, + IPMI_LANP_IP6_TRAFFIC_CLASS, + IPMI_LANP_IP6_STATIC_HOPS, + IPMI_LANP_IP6_FLOW_LABEL, + IPMI_LANP_IP6_STATUS, + IPMI_LANP_IP6_STATIC_ADDR, + IPMI_LANP_IP6_STATIC_DUID_STG, + IPMI_LANP_IP6_STATIC_DUID, + IPMI_LANP_IP6_DYNAMIC_ADDR, + IPMI_LANP_IP6_DYNAMIC_DUID_STG, + IPMI_LANP_IP6_DYNAMIC_DUID, + IPMI_LANP_IP6_DHCP6_CFG_SUP, + IPMI_LANP_IP6_DHCP6_CFG, + IPMI_LANP_IP6_ROUTER_CFG, + IPMI_LANP_IP6_STATIC_RTR1_ADDR, + IPMI_LANP_IP6_STATIC_RTR1_MAC, + IPMI_LANP_IP6_STATIC_RTR1_PFX_LEN, + IPMI_LANP_IP6_STATIC_RTR1_PFX, + IPMI_LANP_IP6_STATIC_RTR2_ADDR, + IPMI_LANP_IP6_STATIC_RTR2_MAC, + IPMI_LANP_IP6_STATIC_RTR2_PFX_LEN, + IPMI_LANP_IP6_STATIC_RTR2_PFX, + IPMI_LANP_IP6_NUM_DYNAMIC_RTRS, + IPMI_LANP_IP6_DYNAMIC_RTR_ADDR, + IPMI_LANP_IP6_DYNAMIC_RTR_MAC, + IPMI_LANP_IP6_DYNAMIC_RTR_PFX_LEN, + IPMI_LANP_IP6_DYNAMIC_RTR_PFX, + IPMI_LANP_IP6_DYNAMIC_HOPS, + IPMI_LANP_IP6_NDSLAAC_CFG_SUP, + IPMI_LANP_IP6_NDSLAAC_CFG, IPMI_LANP_OEM_ALERT_STRING=96, IPMI_LANP_ALERT_RETRY=97, IPMI_LANP_UTC_OFFSET=98, diff --git a/include/ipmitool/ipmi_lanp6.h b/include/ipmitool/ipmi_lanp6.h new file mode 100644 index 0000000..91799e5 --- /dev/null +++ b/include/ipmitool/ipmi_lanp6.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016 Pentair Technical Products. 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 Pentair Technical Products 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef IPMI_LANP6_H +#define IPMI_LANP6_H + +#include <ipmitool/ipmi_intf.h> + +/* + * LAN configuration parameter. + */ +struct ipmi_lanp { + int selector; + const char *name; + int size; +}; + +/* + * Private data for LAN configuration. + */ +struct ipmi_lanp_priv { + struct ipmi_intf *intf; + int channel; +}; + +#endif /* IPMI_LANP6_H */ diff --git a/lib/Makefile.am b/lib/Makefile.am index 359cb30..cc69a8f 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -41,6 +41,7 @@ libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.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_vita.c \ + ipmi_lanp6.c ipmi_cfgp.c \ ../src/plugins/lan/md5.c ../src/plugins/lan/md5.h libipmitool_la_LDFLAGS = -export-dynamic diff --git a/lib/ipmi_cfgp.c b/lib/ipmi_cfgp.c new file mode 100644 index 0000000..b8af80d --- /dev/null +++ b/lib/ipmi_cfgp.c @@ -0,0 +1,542 @@ +/* + * Copyright (c) 2016 Pentair Technical Products. 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 Pentair Technical Products 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <malloc.h> +#include <string.h> + +#include <ipmitool/helper.h> +#include <ipmitool/ipmi_cfgp.h> +#include <ipmitool/log.h> + +/* ipmi_cfgp_init initialize configuration parameter context + * @param ctx context to initialize + * @param set array of parameter descriptors + * @param count amount of descriptors supplied + * @param handler function to do real job on parameters from the set + * @param priv private data for the handler + */ +int +ipmi_cfgp_init(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *set, + unsigned int count, const char *cmdname, + ipmi_cfgp_handler_t handler, void *priv) +{ + if (ctx == NULL || set == NULL || handler == NULL || !cmdname) { + return -1; + } + + memset(ctx, 0, sizeof(struct ipmi_cfgp_ctx)); + + ctx->set = set; + ctx->count = count; + ctx->cmdname = cmdname; + ctx->handler = handler; + ctx->priv = priv; + + return 0; +} + +/* ipmi_cfgp_uninit destroy data list attached to context + * @param ctx parameter context to clear + * @returns 0 -- list destroyed + * -1 -- ctx is NULL + */ +int +ipmi_cfgp_uninit(struct ipmi_cfgp_ctx *ctx) +{ + struct ipmi_cfgp_data *d; + + if (ctx == NULL) { + return -1; + } + + while (ctx->v) { + d = ctx->v; + ctx->v = d->next; + free(d); + d = NULL; + } + + return 0; +} + +/* lookup_cfgp -- find a parameter in a set*/ +static const struct ipmi_cfgp * +lookup_cfgp(const struct ipmi_cfgp_ctx *ctx, const char *name) +{ + const struct ipmi_cfgp *p; + int i; + + for (i = 0; i < ctx->count; i++) { + p = &ctx->set[i]; + + if (p->name && !strcasecmp(p->name, name)) { + return p; + } + } + + return NULL; +} + +/* ipmi_cfgp_parse_sel parse parameter selector + * (parameter ID, set selector, block selector) from cmdline. + * + * @param ctx configuration parameter context to use + * @param argc elements left in argv + * @param argv array of arguments + * @param sel where to store parsed selector + * + * @returns >=0 number of argv elements used + * <0 error + */ +int +ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx, + int argc, const char **argv, struct ipmi_cfgp_sel *sel) +{ + const struct ipmi_cfgp *p; + + if (ctx == NULL || argv == NULL || sel == NULL) { + return -1; + } + + sel->param = -1; + sel->set = -1; + sel->block = -1; + + if (argc == 0) { + /* no parameter specified, good for print, save */ + return 0; + } + + p = lookup_cfgp(ctx, argv[0]); + if (p == NULL) { + lprintf(LOG_ERR, "invalid parameter"); + return -1; + } + + sel->param = p - ctx->set; + sel->set = p->is_set ? -1 : 0; + sel->block = p->has_blocks ? -1 : 0; + + if (argc == 1 || !p->is_set) { + /* No set and block selector applicable or specified */ + return 1; + } + + if (str2int(argv[1], &sel->set) + || sel->set < 0 + || (sel->set == 0 && p->first_set)) { + lprintf(LOG_ERR, "invalid set selector"); + return -1; + } + + if (argc == 2 || !p->has_blocks) { + /* No block selector applicable or specified */ + return 2; + } + + if (str2int(argv[2], &sel->block) + || sel->block < 0 + || (sel->block == 0 && p->first_block)) { + lprintf(LOG_ERR, "invalid block selector"); + return -1; + } + + return 3; +} + +/* cfgp_add_data adds block of data to list in the configuration + * parameter context + * + * @param ctx context to add data to + * @param data parameter data + */ +static void +cfgp_add_data(struct ipmi_cfgp_ctx *ctx, struct ipmi_cfgp_data *data) +{ + struct ipmi_cfgp_data **pprev = &ctx->v; + + data->next = NULL; + + while (*pprev) { + pprev = &(*pprev)->next; + } + + *pprev = data; +} + +/* cfgp_usage prints format for configuration parameter + * + * @param p configuration parameter descriptor + * @param write 0 if no value is expected, !=0 otherwise + */ +static void +cfgp_usage(const struct ipmi_cfgp *p, int write) +{ + if (p->name == NULL) { + return; + } + + if (write && p->format == NULL) { + return; + } + + printf(" %s%s%s %s\n", + p->name, p->is_set ? " <set_sel>" : "", + p->has_blocks ? " <block_sel>" : "", + write ? p->format : ""); +} + +/* ipmi_cfgp_usage prints format for configuration parameter set + * + * @param set configuration parameter descriptor array + * @param count number of elements in set + * @param write 0 if no value is expected, !=0 otherwise + */ +void +ipmi_cfgp_usage(const struct ipmi_cfgp *set, int count, int write) +{ + const struct ipmi_cfgp *p; + int i; + + if (set == NULL) { + return; + } + + for (i = 0; i < count; i++) { + p = &set[i]; + + if (write && p->access == CFGP_RDONLY) { + continue; + } + + if (!write && p->access == CFGP_WRONLY) { + continue; + } + + cfgp_usage(p, write); + } +} + +/* ipmi_cfgp_parse_data parse parameter data from command line into context + * @param ctx context to add data + * @param sel parameter selector + * @param argc number of elements in argv + * @param argv array of unparsed arguments + * + * @returns 0 on success + * <0 on error + */ +int +ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, int argc, const char **argv) +{ + const struct ipmi_cfgp *p; + struct ipmi_cfgp_data *data; + struct ipmi_cfgp_action action; + + if (ctx == NULL || sel == NULL || argv == NULL) { + return -1; + } + + if (sel->param == -1 || sel->param >= ctx->count) { + lprintf(LOG_ERR, "invalid parameter, must be one of:"); + ipmi_cfgp_usage(ctx->set, ctx->count, 1); + return -1; + } + + if (sel->set == -1) { + lprintf(LOG_ERR, "set selector is not specified"); + return -1; + } + + if (sel->block == -1) { + lprintf(LOG_ERR, "block selector is not specified"); + return -1; + } + + p = &ctx->set[sel->param]; + + if (p->size == 0) { + return -1; + } + + data = malloc(sizeof(struct ipmi_cfgp_data) + p->size); + if (data == NULL) { + return -1; + } + + memset(data, 0, sizeof(struct ipmi_cfgp_data) + p->size); + + action.type = CFGP_PARSE; + action.set = sel->set; + action.block = sel->block; + action.argc = argc; + action.argv = argv; + action.file = NULL; + + if (ctx->handler(ctx->priv, p, &action, data->data) != 0) { + ipmi_cfgp_usage(p, 1, 1); + free(data); + data = NULL; + return -1; + } + + data->sel = *sel; + + cfgp_add_data(ctx, data); + return 0; +} + +/* cfgp_get_param -- get parameter data from MC into data list within context + * + * @param ctx context + * @param p parameter descriptor + * @param set parameter set selector, can be -1 to scan all set selectors + * @param block parameter block selector, can be -1 to get all blocks + * @param quiet set to non-zero to continue on errors + * (required for -1 to work) + * @returns 0 on success, non-zero otherwise + */ +static int +cfgp_get_param(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *p, + int set, int block, int quiet) +{ + struct ipmi_cfgp_data *data; + struct ipmi_cfgp_action action; + int cset; + int cblock; + int ret; + + if (p->size == 0) { + return -1; + } + + action.type = CFGP_GET; + action.argc = 0; + action.argv = NULL; + action.file = NULL; + + if (set == -1 && !p->is_set) { + set = 0; + } + + if (block == -1 && !p->has_blocks) { + block = 0; + } + + if (set == -1) { + cset = p->first_set; + } else { + cset = set; + } + + action.quiet = quiet; + + do { + if (block == -1) { + cblock = p->first_block; + } else { + cblock = block; + } + + do { + data = malloc(sizeof(struct ipmi_cfgp_data) + p->size); + if (data == NULL) { + return -1; + } + + memset(data, 0, sizeof(struct ipmi_cfgp_data) + p->size); + + action.set = cset; + action.block = cblock; + + ret = ctx->handler(ctx->priv, p, &action, data->data); + if (ret != 0) { + free(data); + data = NULL; + + if (!action.quiet) { + return ret; + } + break; + } + + data->sel.param = p - ctx->set; + data->sel.set = cset; + data->sel.block = cblock; + + cfgp_add_data(ctx, data); + + cblock++; + action.quiet = 1; + } while (block == -1); + + if (ret != 0 && cblock == p->first_block) { + break; + } + + cset++; + } while (set == -1); + + return 0; +} + +/* ipmi_cfgp_get -- get parameters data from MC into data list within context + * + * @param ctx context + * @param sel parameter selector + * @returns 0 on success, non-zero otherwise + */ +int +ipmi_cfgp_get(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel) +{ + int i; + int ret; + + if (ctx == NULL || sel == NULL) { + return -1; + } + + if (sel->param != -1) { + if (sel->param >= ctx->count) { + return -1; + } + + ret = cfgp_get_param(ctx, &ctx->set[sel->param], + sel->set, sel->block, 0); + if (ret) { + return -1; + } + return 0; + } + + for (i = 0; i < ctx->count; i++) { + if (ctx->set[i].access == CFGP_WRONLY) { + continue; + } + + if (cfgp_get_param(ctx, &ctx->set[i], sel->set, sel->block, 1)) { + return -1; + } + } + + return 0; +} + +static int +cfgp_do_action(struct ipmi_cfgp_ctx *ctx, int action_type, + const struct ipmi_cfgp_sel *sel, FILE *file, int filter) +{ + const struct ipmi_cfgp *p; + struct ipmi_cfgp_data *data; + struct ipmi_cfgp_action action; + int ret; + + if (ctx == NULL || sel == NULL) { + return -1; + } + + action.type = action_type; + action.argc = 0; + action.argv = NULL; + action.file = file; + + for (data = ctx->v; data != NULL; data = data->next) { + if (sel->param != -1 && sel->param != data->sel.param) { + continue; + } + if (sel->set != -1 && sel->set != data->sel.set) { + continue; + } + if (sel->block != -1 && sel->block != data->sel.block) { + continue; + } + if (ctx->set[data->sel.param].access == filter) { + continue; + } + + p = &ctx->set[data->sel.param]; + + action.set = data->sel.set; + action.block = data->sel.block; + + if (action_type == CFGP_SAVE) { + fprintf(file, "%s %s ", ctx->cmdname, p->name); + if (p->is_set) { + fprintf(file, "%d ", data->sel.set); + } + if (p->has_blocks) { + fprintf(file, "%d ", data->sel.block); + } + } + + ret = ctx->handler(ctx->priv, p, &action, data->data); + + if (action_type == CFGP_SAVE) { + fputc('\n', file); + } + + if (ret != 0) { + return -1; + } + } + + return 0; +} + +int +ipmi_cfgp_set(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel) +{ + return cfgp_do_action(ctx, CFGP_SET, sel, NULL, CFGP_RDONLY); +} + +int +ipmi_cfgp_save(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, FILE *file) +{ + if (file == NULL) { + return -1; + } + + return cfgp_do_action(ctx, CFGP_SAVE, sel, file, CFGP_RDONLY); +} + +int +ipmi_cfgp_print(struct ipmi_cfgp_ctx *ctx, + const struct ipmi_cfgp_sel *sel, FILE *file) +{ + if (file == NULL) { + return -1; + } + + return cfgp_do_action(ctx, CFGP_PRINT, sel, file, CFGP_RESERVED); +} diff --git a/lib/ipmi_lanp6.c b/lib/ipmi_lanp6.c new file mode 100644 index 0000000..bbffb89 --- /dev/null +++ b/lib/ipmi_lanp6.c @@ -0,0 +1,1240 @@ +/* + * Copyright (c) 2016 Pentair Technical Products. 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 Pentair Technical Products 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <ipmitool/helper.h> +#include <ipmitool/ipmi_cc.h> +#include <ipmitool/ipmi_cfgp.h> +#include <ipmitool/ipmi_lanp.h> +#include <ipmitool/ipmi_lanp6.h> +#include <ipmitool/log.h> + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <arpa/inet.h> + +/* + * LAN6 command values. + */ +enum { + LANP_CMD_SAVE, + LANP_CMD_SET, + LANP_CMD_PRINT, + LANP_CMD_LOCK, + LANP_CMD_COMMIT, + LANP_CMD_DISCARD, + LANP_CMD_HELP, + LANP_CMD_ANY = 0xFF +}; + +/* + * Generic LAN configuration parameters. + */ +const struct ipmi_lanp generic_lanp6[] = { + { 0, "Set In Progress", 1 }, + { 50, "IPv6/IPv4 Support", 1 }, + { 51, "IPv6/IPv4 Addressing Enables", 1 }, + { 52, "IPv6 Header Traffic Class", 1 }, + { 53, "IPv6 Header Static Hop Limit", 1 }, + { 54, "IPv6 Header Flow Label", 3 }, + { 55, "IPv6 Status", 3 }, + { 56, "IPv6 Static Address", 20 }, + { 57, "IPv6 DHCPv6 Static DUID Storage Length", 1 }, + { 58, "IPv6 DHCPv6 Static DUID", 18 }, + { 59, "IPv6 Dynamic Address", 20 }, + { 60, "IPv6 DHCPv6 Dynamic DUID Storage Length", 1 }, + { 61, "IPv6 DHCPv6 Dynamic DUID", 18 }, + { 62, "IPv6 DHCPv6 Timing Configuration Support", 1 }, + { 63, "IPv6 DHCPv6 Timing Configuration", 18 }, + { 64, "IPv6 Router Address Configuration Control", 1 }, + { 65, "IPv6 Static Router 1 IP Address", 16 }, + { 66, "IPv6 Static Router 1 MAC Address", 6 }, + { 67, "IPv6 Static Router 1 Prefix Length", 1 }, + { 68, "IPv6 Static Router 1 Prefix Value", 16 }, + { 69, "IPv6 Static Router 2 IP Address", 16 }, + { 70, "IPv6 Static Router 2 MAC Address", 6 }, + { 71, "IPv6 Static Router 2 Prefix Length", 1 }, + { 72, "IPv6 Static Router 2 Prefix Value", 16 }, + { 73, "IPv6 Number of Dynamic Router Info Sets", 1 }, + { 74, "IPv6 Dynamic Router Info IP Address", 17 }, + { 75, "IPv6 Dynamic Router Info MAC Address", 7 }, + { 76, "IPv6 Dynamic Router Info Prefix Length", 2 }, + { 77, "IPv6 Dynamic Router Info Prefix Value", 17 }, + { 78, "IPv6 Dynamic Router Received Hop Limit", 1 }, + { 79, "IPv6 ND/SLAAC Timing Configuration Support", 1 }, + { 80, "IPv6 ND/SLAAC Timing Configuration", 18 }, + { 0, NULL, 0 } +}; + +/* + * Set/Get LAN Configuration Parameters + * command-specific completion codes. + */ +const struct valstr lanp_cc_vals[] = { + { 0x80, "Parameter not supported" }, + { 0x81, "Set already in progress" }, + { 0x82, "Parameter is read-only" }, + { 0x83, "Write-only parameter" }, + { 0x00, NULL } +}; + +/* + * IPv6/IPv4 Addressing Enables. + */ +const struct valstr ip6_enable_vals[] = { + { 0, "ipv4" }, + { 1, "ipv6" }, + { 2, "both" }, + { 0xFF, NULL } +}; + +/* + * Enable/Disable a static address. + */ +const struct valstr ip6_addr_enable_vals[] = { + { 0x00, "disable" }, + { 0x80, "enable" }, + { 0xFF, NULL } +}; + +/* + * IPv6 address source values. + */ +const struct valstr ip6_addr_sources[] = { + { 0, "static" }, + { 1, "SLAAC" }, + { 2, "DHCPv6" }, + { 0, NULL } +}; + +/* + * IPv6 address status values. + */ +const struct valstr ip6_addr_statuses[] = { + { 0, "active" }, + { 1, "disabled" }, + { 2, "pending" }, + { 3, "failed" }, + { 4, "deprecated" }, + { 5, "invalid" }, + { 0xFF, NULL } +}; + +/* + * DHCPv6 DUID type values. + */ +const struct valstr ip6_duid_types[] = { + { 0, "unknown" }, + { 1, "DUID-LLT" }, + { 2, "DUID-EN" }, + { 3, "DUID-LL" }, + { 0xFF, NULL } +}; + +/* + * Timing Configuration support values. + */ +const struct valstr ip6_cfg_sup_vals[] = { + { 0, "not supported" }, + { 1, "global" }, + { 2, "per interface" }, + { 0xFF, NULL } +}; + +/* + * Router Address Configuration Control values. + */ +const struct valstr ip6_rtr_configs[] = { + { 1, "static" }, + { 2, "dynamic" }, + { 3, "both" }, + { 0xFF, NULL } +}; + + +const struct valstr ip6_command_vals[] = { + { LANP_CMD_SET, "set" }, + { LANP_CMD_SAVE, "save" }, + { LANP_CMD_PRINT, "print" }, + { LANP_CMD_LOCK, "lock" }, + { LANP_CMD_COMMIT, "commit" }, + { LANP_CMD_DISCARD, "discard" }, + { LANP_CMD_HELP, "help" }, + { LANP_CMD_ANY, NULL } +}; + +static const struct ipmi_cfgp lan_cfgp[] = { + { .name = "support", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_SUPPORT + }, + { .name = "enables", .format = "{ipv4|ipv6|both}", .size = 1, + .access = CFGP_RDWR, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_ENABLES + }, + { .name = "traffic_class", .format = "<value>", .size = 1, + .access = CFGP_RDWR, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_TRAFFIC_CLASS + }, + { .name = "static_hops", .format = "<value>", .size = 1, + .access = CFGP_RDWR, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_STATIC_HOPS + }, + { .name = "flow_label", .format = "<value>", .size = 3, + .access = CFGP_RDWR, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_FLOW_LABEL + }, + { .name = "status", .format = NULL, .size = 3, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_STATUS + }, + { .name = "static_addr", + .format = "{enable|disable} <addr> <pfx_len>", .size = 20, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_STATIC_ADDR + }, + { .name = "static_duid_stg", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_STATIC_DUID_STG + }, + { .name = "static_duid", .format = "<data>", .size = 18, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 0, .has_blocks = 1, .first_block = 0, + .specific = IPMI_LANP_IP6_STATIC_DUID + }, + { .name = "dynamic_addr", .format = NULL, .size = 20, + .access = CFGP_RDONLY, + .is_set = 1, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DYNAMIC_ADDR + }, + { .name = "dynamic_duid_stg", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DYNAMIC_DUID_STG + }, + { .name = "dynamic_duid", .format = "<data>", .size = 18, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 0, .has_blocks = 1, .first_block = 0, + .specific = IPMI_LANP_IP6_DYNAMIC_DUID + }, + { .name = "dhcp6_cfg_sup", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DHCP6_CFG_SUP + }, + { .name = "dhcp6_cfg", .format = "<data> <data>", .size = 36, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DHCP6_CFG + }, + { .name = "rtr_cfg", .format = "{static|dynamic|both}", .size = 1, + .access = CFGP_RDWR, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_ROUTER_CFG + }, + { .name = "static_rtr", + .format = "<addr> <macaddr> <prefix> <prefix_len>", .size = 43, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 1, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_STATIC_RTR1_ADDR + }, + { .name = "num_dynamic_rtrs", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_NUM_DYNAMIC_RTRS + }, + { .name = "dynamic_rtr", .format = NULL, .size = 43, + .access = CFGP_RDONLY, + .is_set = 1, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DYNAMIC_RTR_ADDR + }, + { .name = "dynamic_hops", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_DYNAMIC_HOPS + }, + { .name = "ndslaac_cfg_sup", .format = NULL, .size = 1, + .access = CFGP_RDONLY, + .is_set = 0, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_NDSLAAC_CFG_SUP + }, + { .name = "ndslaac_cfg", .format = "<data>", .size = 18, + .access = CFGP_RDWR, + .is_set = 1, .first_set = 0, .has_blocks = 0, .first_block = 0, + .specific = IPMI_LANP_IP6_NDSLAAC_CFG + } +}; + +/* + * Lookup LAN parameter descriptor by parameter selector. + */ +const struct ipmi_lanp * +lookup_lanp(int param) +{ + const struct ipmi_lanp *p = generic_lanp6; + + while (p->name) { + if (p->selector == param) { + return p; + } + + p++; + } + + return NULL; +} + +/* + * Print request error. + */ +static int +ipmi_lanp_err(const struct ipmi_rs *rsp, const struct ipmi_lanp *p, + const char *action, int quiet) +{ + const char *reason; + char cc_msg[10]; + int log_level = LOG_ERR; + int err; + + if (rsp == NULL) { + reason = "No response"; + err = -1; + } else { + err = rsp->ccode; + if (quiet == 1 + && (rsp->ccode == 0x80 + || rsp->ccode == IPMI_CC_PARAM_OUT_OF_RANGE + || rsp->ccode == IPMI_CC_INV_DATA_FIELD_IN_REQ)) { + /* be quiet */ + return err; + } + + if (rsp->ccode >= 0xC0) { + /* browse for generic completion codes */ + reason = val2str(rsp->ccode, completion_code_vals); + } else { + /* browse for command-specific completion codes first */ + reason = val2str(rsp->ccode, lanp_cc_vals); + } + + if (reason == NULL) { + /* print completion code value */ + snprintf(cc_msg, sizeof(cc_msg), "CC=%02x", rsp->ccode); + reason = cc_msg; + } + + if (rsp->ccode == IPMI_CC_OK) { + log_level = LOG_DEBUG; + } + } + + lprintf(log_level, "Failed to %s %s: %s", action, p->name, reason); + return err; +} + +/* + * Get dynamic OEM LAN configuration parameter from BMC. + * Dynamic in this context is when the base for OEM LAN parameters + * is not known apriori. + */ +int +ipmi_get_dynamic_oem_lanp(void *priv, const struct ipmi_lanp *param, + int oem_base, int set_selector, int block_selector, + void *data, int quiet) +{ + struct ipmi_lanp_priv *lp = priv; + struct ipmi_rs *rsp; + struct ipmi_rq req; + uint8_t req_data[4]; + int length; + + if (!priv || !param || !data) { + return -1; + } + req_data[0] = lp->channel; + req_data[1] = param->selector + oem_base; + req_data[2] = set_selector; + req_data[3] = block_selector; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_TRANSPORT; + req.msg.cmd = 2; + req.msg.data = req_data; + req.msg.data_len = 4; + + lprintf(LOG_INFO, "Getting parameter '%s' set %d block %d", + param->name, set_selector, block_selector); + + rsp = lp->intf->sendrecv(lp->intf, &req); + if (rsp == NULL || rsp->ccode) { + return ipmi_lanp_err(rsp, param, "get", quiet); + } + + memset(data, 0, param->size); + + if (rsp->data_len - 1 < param->size) { + length = rsp->data_len - 1; + } else { + length = param->size; + } + + if (length) { + memcpy(data, rsp->data + 1, length); + } + + return 0; +} + +/* + * Get generic LAN configuration parameter. + */ +int +ipmi_get_lanp(void *priv, int param_selector, int set_selector, + int block_selector, void *data, int quiet) +{ + return ipmi_get_dynamic_oem_lanp(priv, lookup_lanp(param_selector), 0, + set_selector, block_selector, data, quiet); +} + +/* + * Set dynamic OEM LAN configuration parameter to BMC. + * Dynamic in this context is when the base for OEM LAN parameters + * is not known apriori. + */ +int +ipmi_set_dynamic_oem_lanp(void *priv, const struct ipmi_lanp *param, + int base, const void *data) +{ + struct ipmi_lanp_priv *lp = priv; + struct ipmi_rs *rsp; + struct ipmi_rq req; + uint8_t req_data[32]; + + if (!priv || !param || !data) { + return -1; + } + /* fill the first two bytes */ + req_data[0] = lp->channel; + req_data[1] = param->selector + base; + + /* fill the rest data */ + memcpy(&req_data[2], data, param->size); + + /* fill request */ + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_TRANSPORT; + req.msg.cmd = 1; + req.msg.data = req_data; + req.msg.data_len = param->size + 2; + + lprintf(LOG_INFO, "Setting parameter '%s'", param->name); + + rsp = lp->intf->sendrecv(lp->intf, &req); + if (rsp == NULL || rsp->ccode) { + return ipmi_lanp_err(rsp, param, "set", 0); + } + + return 0; +} + +/* + * Set generic LAN configuration parameter. + */ +int +ipmi_set_lanp(void *priv, int param_selector, const void *data) +{ + return ipmi_set_dynamic_oem_lanp(priv, lookup_lanp(param_selector), + 0, data); +} + +static int +lanp_parse_cfgp(const struct ipmi_cfgp *p, int set, int block, + int argc, const char *argv[], unsigned char *data) +{ + unsigned int v; + + if (argc == 0) { + return -1; + } + + switch(p->specific) { + case IPMI_LANP_IP6_ENABLES: + data[0] = str2val(argv[0], ip6_enable_vals); + if (data[0] == 0xFF) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + case IPMI_LANP_IP6_FLOW_LABEL: + if (str2uint(argv[0], &v)) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + + data[0] = (v >> 16) & 0x0F; + data[1] = (v >> 8) & 0xFF; + data[2] = v & 0xFF; + break; + + case IPMI_LANP_IP6_STATUS: + if (argc < 3) { + return -1; + } + + if (str2uchar(argv[0], &data[0]) + || str2uchar(argv[1], &data[1]) + || str2uchar(argv[2], &data[2])) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + case IPMI_LANP_IP6_STATIC_ADDR: + case IPMI_LANP_IP6_DYNAMIC_ADDR: + if (argc < 3) { + return -1; + } + + data[0] = set; + if (p->specific == IPMI_LANP_IP6_STATIC_ADDR) { + data[1] = str2val(argv[0], ip6_addr_enable_vals); + } else { + data[1] = str2val(argv[0], ip6_addr_sources); + } + if (data[1] == 0xFF) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + + if (inet_pton(AF_INET6, argv[1], &data[2]) != 1) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + + if (str2uchar(argv[2], &data[18])) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + + if (argc >= 4) { + data[19] = str2val(argv[3], ip6_addr_statuses); + } + break; + + case IPMI_LANP_IP6_STATIC_DUID: + case IPMI_LANP_IP6_DYNAMIC_DUID: + case IPMI_LANP_IP6_NDSLAAC_CFG: + data[0] = set; + data[1] = block; + if (ipmi_parse_hex(argv[0], &data[2], 16) < 0) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + case IPMI_LANP_IP6_DHCP6_CFG: + data[0] = set; + data[1] = 0; + data[18] = set; + data[19] = 1; + + if (ipmi_parse_hex(argv[0], &data[2], 16) < 0 + || (argc > 1 && + ipmi_parse_hex(argv[1], &data[20], 6) < 0)) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + case IPMI_LANP_IP6_ROUTER_CFG: + data[0] = str2val(argv[0], ip6_rtr_configs); + if (data[0] == 0xFF) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + case IPMI_LANP_IP6_STATIC_RTR1_ADDR: + if (set > 2) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + + case IPMI_LANP_IP6_DYNAMIC_RTR_ADDR: + if (argc < 4) { + return -1; + } + + /* + * Data is stored in the following way: + * 0: <set> <addr1>...<addr16> + * 17: <set> <mac1>...<mac6> + * 24: <set> <pfxlen> + * 26: <set> <pfx1>...<pfx16> + */ + data[0] = data[17] = data[24] = data[26] = set; + + if (inet_pton(AF_INET6, argv[0], &data[1]) != 1 + || str2mac(argv[1], &data[18]) + || inet_pton(AF_INET6, argv[2], &data[27]) != 1 + || str2uchar(argv[3], &data[25])) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + break; + + default: + if (str2uchar(argv[0], &data[0])) { + lprintf(LOG_ERR, "invalid value"); + return -1; + } + } + + return 0; +} + +static int +lanp_set_cfgp(void *priv, const struct ipmi_cfgp *p, const unsigned char *data) +{ + int ret; + int param = p->specific; + int off = 0; + + switch(param) { + case IPMI_LANP_IP6_DHCP6_CFG: + ret = ipmi_set_lanp(priv, param, &data[0]); + if (ret == 0) { + ret = ipmi_set_lanp(priv, param, &data[18]); + } + break; + + case IPMI_LANP_IP6_STATIC_RTR1_ADDR: + if (data[0] == 2) { + param = IPMI_LANP_IP6_STATIC_RTR2_ADDR; + } + off = 1; + + case IPMI_LANP_IP6_DYNAMIC_RTR_ADDR: + ret = ipmi_set_lanp(priv, param, &data[0 + off]); + if (ret == 0) { + ret = ipmi_set_lanp(priv, param + 1, &data[17 + off]); + } + if (ret == 0) { + ret = ipmi_set_lanp(priv, param + 2, &data[24 + off]); + } + if (ret == 0) { + ret = ipmi_set_lanp(priv, param + 3, &data[26 + off]); + } + break; + + + default: + ret = ipmi_set_lanp(priv, param, data); + } + + return ret; +} + +static int +lanp_get_cfgp(void *priv, const struct ipmi_cfgp *p, + int set, int block, unsigned char *data, int quiet) +{ + int ret; + int param = p->specific; + int off = 0; + + switch(param) { + case IPMI_LANP_IP6_DHCP6_CFG: + ret = ipmi_get_lanp(priv, param, set, 0, &data[0], quiet); + if (ret == 0) { + ret = ipmi_get_lanp(priv, param, set, + 1, &data[18], quiet); + } + break; + + case IPMI_LANP_IP6_STATIC_RTR1_ADDR: + if (set > 2) { + return -1; + } + + if (set == 2) { + param = IPMI_LANP_IP6_STATIC_RTR2_ADDR; + } + set = 0; + off = 1; + data[0] = data[17] = data[24] = data[26] = set; + + case IPMI_LANP_IP6_DYNAMIC_RTR_ADDR: + ret = ipmi_get_lanp(priv, param, set, block, + &data[0 + off], quiet); + if (ret == 0) { + ret = ipmi_get_lanp(priv, param + 1, set, block, + &data[17 + off], 0); + } + if (ret == 0) { + ret = ipmi_get_lanp(priv, param + 2, set, block, + &data[24 + off], 0); + } + if (ret == 0) { + ret = ipmi_get_lanp(priv, param + 3, set, block, + &data[26 + off], 0); + } + break; + + default: + ret = ipmi_get_lanp(priv, param, set, block, data, quiet); + } + + return ret; +} + +static int +lanp_save_cfgp(const struct ipmi_cfgp *p, const unsigned char *data, FILE *file) +{ + char addr[INET6_ADDRSTRLEN]; + char pfx[INET6_ADDRSTRLEN]; + const char *src; + + switch(p->specific) { + case IPMI_LANP_IP6_ENABLES: + fputs(val2str(data[0], ip6_enable_vals), file); + break; + + case IPMI_LANP_IP6_FLOW_LABEL: + fprintf(file, "0x%xd", (data[0] << 16 ) | (data[1] << 8) | data[2]); + break; + + case IPMI_LANP_IP6_STATUS: + fprintf(file, "%d %d %d", data[0], data[1], data[2]); + break; + + case IPMI_LANP_IP6_STATIC_ADDR: + case IPMI_LANP_IP6_DYNAMIC_ADDR: + if (p->specific == IPMI_LANP_IP6_STATIC_ADDR) { + src = val2str(data[1], ip6_addr_enable_vals); + } else { + src = val2str(data[1], ip6_addr_sources); + } + + fprintf(file, "%s %s %d %s", src, + inet_ntop(AF_INET6, &data[2], addr, sizeof(addr)), + data[18], val2str(data[19], ip6_addr_statuses)); + break; + + case IPMI_LANP_IP6_STATIC_DUID: + case IPMI_LANP_IP6_DYNAMIC_DUID: + case IPMI_LANP_IP6_NDSLAAC_CFG: + fprintf(file, "%s", buf2str(&data[2], 16)); + break; + + case IPMI_LANP_IP6_DHCP6_CFG: + fprintf(file, "%s", buf2str(&data[2], 16)); + fprintf(file, " %s", buf2str(&data[20], 6)); + break; + + case IPMI_LANP_IP6_ROUTER_CFG: + fputs(val2str(data[0], ip6_rtr_configs), file); + break; + + case IPMI_LANP_IP6_STATIC_RTR1_ADDR: + case IPMI_LANP_IP6_DYNAMIC_RTR_ADDR: + fprintf(file, "%s %s %s %d", + inet_ntop(AF_INET6, &data[1], addr, sizeof(addr)), + mac2str(&data[18]), + inet_ntop(AF_INET6, &data[27], pfx, sizeof(pfx)), data[25]); + break; + + default: + fprintf(file, "%d", data[0]); + } + + return 0; +} + + +static int +lanp_print_cfgp(const struct ipmi_cfgp *p, + int set, int block, const unsigned char *data, FILE *file) +{ + char addr[INET6_ADDRSTRLEN]; + char pfx[INET6_ADDRSTRLEN]; + const char *pname; + const struct ipmi_lanp *lanp = lookup_lanp(p->specific); + + if (!lanp || !p || !file || !data || !lanp->name) { + return -1; + } + pname = lanp->name; + + switch(p->specific) { + case IPMI_LANP_IP6_SUPPORT: + fprintf(file, "%s:\n" + " IPv6 only: %s\n" + " IPv4 and IPv6: %s\n" + " IPv6 Destination Addresses for LAN alerting: %s\n", + pname, + data[0] & 1 ? "yes" : "no", + data[0] & 2 ? "yes" : "no", + data[0] & 4 ? "yes" : "no"); + break; + + case IPMI_LANP_IP6_ENABLES: + fprintf(file, "%s: %s\n", + pname, val2str(data[0], ip6_enable_vals)); + break; + + case IPMI_LANP_IP6_FLOW_LABEL: + fprintf(file, "%s: %d\n", + pname, (data[0] << 16 ) | (data[1] << 8) | data[2]); + break; + + case IPMI_LANP_IP6_STATUS: + fprintf(file, "%s:\n" + " Static address max: %d\n" + " Dynamic address max: %d\n" + " DHCPv6 support: %s\n" + " SLAAC support: %s\n", + pname, + data[0], data[1], + (data[2] & 1) ? "yes" : "no", + (data[2] & 2) ? "yes" : "no"); + break; + + case IPMI_LANP_IP6_STATIC_ADDR: + fprintf(file, "%s %d:\n" + " Enabled: %s\n" + " Address: %s/%d\n" + " Status: %s\n", + pname, set, + (data[1] & 0x80) ? "yes" : "no", + inet_ntop(AF_INET6, &data[2], addr, sizeof(addr)), + data[18], val2str(data[19] & 0xF, ip6_addr_statuses)); + break; + + case IPMI_LANP_IP6_DYNAMIC_ADDR: + fprintf(file, "%s %d:\n" + " Source/Type: %s\n" + " Address: %s/%d\n" + " Status: %s\n", + pname, set, + val2str(data[1] & 0xF, ip6_addr_sources), + inet_ntop(AF_INET6, &data[2], addr, sizeof(addr)), + data[18], val2str(data[19] & 0xF, ip6_addr_statuses)); + break; + + case IPMI_LANP_IP6_STATIC_DUID: + case IPMI_LANP_IP6_DYNAMIC_DUID: + if (block == 0) { + fprintf(file, "%s %d:\n" + " Length: %d\n" + " Type: %s\n", + pname, set, data[2], + val2str((data[3] << 8) + data[4], ip6_duid_types)); + } + fprintf(file, " %s\n", buf2str(&data[2], 16)); + break; + + case IPMI_LANP_IP6_DHCP6_CFG_SUP: + case IPMI_LANP_IP6_NDSLAAC_CFG_SUP: + fprintf(file, "%s: %s\n", + pname, val2str(data[0], ip6_cfg_sup_vals)); + break; + + case IPMI_LANP_IP6_DHCP6_CFG: + fprintf(file, "%s %d:\n", pname, set); + + fprintf(file, + " SOL_MAX_DELAY: %d\n" + " SOL_TIMEOUT: %d\n" + " SOL_MAX_RT: %d\n" + " REQ_TIMEOUT: %d\n" + " REQ_MAX_RT: %d\n" + " REQ_MAX_RC: %d\n" + " CNF_MAX_DELAY: %d\n" + " CNF_TIMEOUT: %d\n" + " CNF_MAX_RT: %d\n" + " CNF_MAX_RD: %d\n" + " REN_TIMEOUT: %d\n" + " REN_MAX_RT: %d\n" + " REB_TIMEOUT: %d\n" + " REB_MAX_RT: %d\n" + " INF_MAX_DELAY: %d\n" + " INF_TIMEOUT: %d\n" + " INF_MAX_RT: %d\n" + " REL_TIMEOUT: %d\n" + " REL_MAX_RC: %d\n" + " DEC_TIMEOUT: %d\n" + " DEC_MAX_RC: %d\n" + " HOP_COUNT_LIMIT: %d\n", + data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], + data[14], data[15], data[16], data[17], + data[20], data[21], data[22], data[23], + data[24], data[25]); + break; + + case IPMI_LANP_IP6_ROUTER_CFG: + fprintf(file, "%s:\n" + " Enable static router address: %s\n" + " Enable dynamic router address: %s\n", + pname, + (data[0] & 1) ? "yes" : "no", + (data[0] & 2) ? "yes" : "no"); + break; + + case IPMI_LANP_IP6_STATIC_RTR1_ADDR: + case IPMI_LANP_IP6_DYNAMIC_RTR_ADDR: + if (p->specific == IPMI_LANP_IP6_STATIC_RTR1_ADDR) { + pname = "IPv6 Static Router"; + } else { + pname = "IPv6 Dynamic Router"; + } + + fprintf(file, "%s %d:\n" + " Address: %s\n" + " MAC: %s\n" + " Prefix: %s/%d\n", + pname, set, + inet_ntop(AF_INET6, &data[1], addr, sizeof(addr)), + mac2str(&data[18]), + inet_ntop(AF_INET6, &data[27], pfx, sizeof(pfx)), data[25]); + break; + + case IPMI_LANP_IP6_NDSLAAC_CFG: + fprintf(file, "%s %d:\n" + " MAX_RTR_SOLICITATION_DELAY: %d\n" + " RTR_SOLICITATION_INTERVAL: %d\n" + " MAX_RTR_SOLICITATIONS: %d\n" + " DupAddrDetectTransmits: %d\n" + " MAX_MULTICAST_SOLICIT: %d\n" + " MAX_UNICAST_SOLICIT: %d\n" + " MAX_ANYCAST_DELAY_TIME: %d\n" + " MAX_NEIGHBOR_ADVERTISEMENT: %d\n" + " REACHABLE_TIME: %d\n" + " RETRANS_TIMER: %d\n" + " DELAY_FIRST_PROBE_TIME: %d\n" + " MAX_RANDOM_FACTOR: %d\n" + " MIN_RANDOM_FACTOR: %d\n", + pname, set, + data[2], data[3], data[4], data[5], + data[6], data[7], data[8], data[9], + data[10], data[11], data[12], data[13], + data[14]); + break; + + default: + fprintf(file, "%s: %d\n", pname, data[0]); + } + + return 0; +} + +static int +lanp_ip6_cfgp(void *priv, const struct ipmi_cfgp *p, + const struct ipmi_cfgp_action *action, unsigned char *data) +{ + switch (action->type) { + case CFGP_PARSE: + return lanp_parse_cfgp(p, action->set, action->block, + action->argc, action->argv, data); + + case CFGP_GET: + return lanp_get_cfgp(priv, p, action->set, action->block, + data, action->quiet); + + case CFGP_SET: + return lanp_set_cfgp(priv, p, data); + + case CFGP_SAVE: + return lanp_save_cfgp(p, data, action->file); + + case CFGP_PRINT: + return lanp_print_cfgp(p, action->set, action->block, + data, action->file); + + default: + return -1; + } + + return 0; +} + +static void lanp_print_usage(int cmd) +{ + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_HELP) { + printf(" help [command]\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_SAVE) { + printf(" save <channel> [<parameter> [<set_sel> [<block_sel>]]]\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_SET) { + printf(" set <channel> [nolock] <parameter> [<set_sel> [<block_sel>]] <values...>\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_PRINT) { + printf(" print <channel> [<parameter> [<set_sel> [<block_sel>]]]\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_LOCK) { + printf(" lock <channel>\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_COMMIT) { + printf(" commit <channel>\n"); + } + if (cmd == LANP_CMD_ANY || cmd == LANP_CMD_DISCARD) { + printf(" discard <channel>\n"); + } + if (cmd == LANP_CMD_SAVE + || cmd == LANP_CMD_PRINT + || cmd == LANP_CMD_SET) { + printf("\n available parameters:\n"); + /* 'save' shall use 'write' filter, since it outputs a block + * of 'set's */ + ipmi_cfgp_usage(lan_cfgp, + sizeof(lan_cfgp)/sizeof(lan_cfgp[0]), + cmd != LANP_CMD_PRINT); + } +} + +static int +lanp_lock(struct ipmi_lanp_priv *lp) +{ + unsigned char byte = 1; + + return ipmi_set_lanp(lp, 0, &byte); +} + +static int +lanp_discard(struct ipmi_lanp_priv *lp) +{ + unsigned char byte = 0; + + return ipmi_set_lanp(lp, 0, &byte); +} + +static int ... [truncated message content] |
From: Zdenek S. <st...@us...> - 2016-07-31 18:20:14
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 95eb252ecd7c502463b1884ccd11974c1c58f49a (commit) from 2c99bf69ec4398f4281d7e670837f8a2395de57f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 95eb252ecd7c502463b1884ccd11974c1c58f49a Author: Zdenek Styblik <st...@tu...> Date: Sun Jul 31 20:19:30 2016 +0200 ID:261 - Fix err. output consistency for % ipmitool chassis INV_PARAM; diff --git a/lib/ipmi_chassis.c b/lib/ipmi_chassis.c index fb7c27d..7b5c2a8 100644 --- a/lib/ipmi_chassis.c +++ b/lib/ipmi_chassis.c @@ -1381,7 +1381,7 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) } } else { - lprintf(LOG_ERR, "Invalid Chassis command: %s", argv[0]); + lprintf(LOG_ERR, "Invalid chassis command: %s", argv[0]); return -1; } ----------------------------------------------------------------------- Summary of changes: lib/ipmi_chassis.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-07-31 07:03:56
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via 2c99bf69ec4398f4281d7e670837f8a2395de57f (commit) via 34711329c2fa7a5f97a7e8770497027dae5701c4 (commit) via 2f76ab3d3aaf3aa3b9e567d6e4328b8927110d92 (commit) via 7f8d37493facde42c4f953061c6dee7227d6ddde (commit) via f9211f8ed977f20c4601f00d0cc56724ebdff04a (commit) via ea46724878894fbe06130b1cd3824e3582d1020a (commit) via 9a6ba646511b6290214158f96ce93340db90f7a1 (commit) via f8a711b9e8a06bd73c8565634be69bc37066683d (commit) via fcf7445bcebdda167a561a54f598b1480b1bfabd (commit) from a3bec1d3658c67f366e1f584abcb5d7a4b5fdce6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2c99bf69ec4398f4281d7e670837f8a2395de57f Author: Zdenek Styblik <st...@tu...> Date: Sun Jul 31 08:56:38 2016 +0200 Fix missing `goto out_free;` when ipmi_parse_hex() returns (-1) diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index 2ea3c26..811c80b 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -499,10 +499,11 @@ ipmi_main(int argc, char ** argv, break; case 'y': memset(kgkey, 0, sizeof(kgkey)); - rc = ipmi_parse_hex(optarg, kgkey, sizeof(kgkey) - 1); + rc = ipmi_parse_hex(optarg, kgkey, sizeof(kgkey) - 1); if (rc == -1) { lprintf(LOG_ERR, "Number of Kg key characters is not even"); + goto out_free; } else if (rc == -3) { lprintf(LOG_ERR, "Kg key is not hexadecimal number"); goto out_free; commit 34711329c2fa7a5f97a7e8770497027dae5701c4 Author: Dmitry Rakhchev <rd...@pi...> Date: Mon Jul 4 18:28:21 2016 +0300 Add mac2str() and str2mac() to print/parse MAC address diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h index 81b8825..bfaf284 100644 --- a/include/ipmitool/helper.h +++ b/include/ipmitool/helper.h @@ -100,6 +100,8 @@ uint32_t buf2long(uint8_t * buf); #define BUF2STR_MAXIMUM_OUTPUT_SIZE (3*1024 + 1) const char * buf2str_extended(const uint8_t *buf, int len, const char *sep); const char * buf2str(const uint8_t *buf, int len); +int str2mac(const char *arg, uint8_t *buf); +const char * mac2str(const uint8_t *buf); int ipmi_parse_hex(const char *str, uint8_t *out, int size); void printbuf(const uint8_t * buf, int len, const char * desc); uint8_t ipmi_csum(uint8_t * d, int s); diff --git a/lib/helper.c b/lib/helper.c index ad5a898..de91438 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -234,6 +234,53 @@ void printbuf(const uint8_t * buf, int len, const char * desc) fprintf(stderr, "\n"); } +/* str2mac - parse-out MAC address from given string and store it + * into buffer. + * + * @arg: string to be parsed. + * @buf: buffer of 6 to hold parsed MAC address. + * + * returns zero on success, (-1) on error and error message is printed-out. + */ +int +str2mac(const char *arg, uint8_t *buf) +{ + unsigned int m1 = 0; + unsigned int m2 = 0; + unsigned int m3 = 0; + unsigned int m4 = 0; + unsigned int m5 = 0; + unsigned int m6 = 0; + if (sscanf(arg, "%02x:%02x:%02x:%02x:%02x:%02x", + &m1, &m2, &m3, &m4, &m5, &m6) != 6) { + lprintf(LOG_ERR, "Invalid MAC address: %s", arg); + return -1; + } + if (m1 > UINT8_MAX || m2 > UINT8_MAX + || m3 > UINT8_MAX || m4 > UINT8_MAX + || m5 > UINT8_MAX || m6 > UINT8_MAX) { + lprintf(LOG_ERR, "Invalid MAC address: %s", arg); + return -1; + } + buf[0] = (uint8_t)m1; + buf[1] = (uint8_t)m2; + buf[2] = (uint8_t)m3; + buf[3] = (uint8_t)m4; + buf[4] = (uint8_t)m5; + buf[5] = (uint8_t)m6; + return 0; +} + +/* mac2str -- return MAC address as a string + * + * @buf: buffer of 6 to hold parsed MAC address. + */ +const char * +mac2str(const uint8_t *buf) +{ + return buf2str_extended(buf, 6, ":"); +} + const char * val2str(uint16_t val, const struct valstr *vs) { static char un_str[32]; diff --git a/lib/ipmi_delloem.c b/lib/ipmi_delloem.c index b253e3e..bc78c1d 100644 --- a/lib/ipmi_delloem.c +++ b/lib/ipmi_delloem.c @@ -1652,11 +1652,7 @@ ipmi_macinfo_drac_idrac_virtual_mac(struct ipmi_intf* intf,uint8_t NicNum) printf("\niDRAC6 MAC Address "); } - for (j = 0; j < 5; j++) { - printf("%02x:", VirtualMacAddress[j]); - } - printf("%02x", VirtualMacAddress[j]); - printf("\n"); + printf("%s\n", mac2str(VirtualMacAddress)); return 0; } /* @@ -1724,11 +1720,7 @@ ipmi_macinfo_drac_idrac_mac(struct ipmi_intf* intf,uint8_t NicNum) printf("\niDRAC6 MAC Address "); } - for (j = 0; j < 5; j++) { - printf("%02x:", iDRAC6MacAddressByte[j]); - } - printf("%02x", iDRAC6MacAddressByte[j]); - printf("\n"); + printf("%s\n", mac2str(iDRAC6MacAddressByte)); return 0; } /* @@ -1786,13 +1778,8 @@ ipmi_macinfo_10g(struct ipmi_intf* intf, uint8_t NicNum) for (i = 0; i < Total_No_NICs; i++) { if ((0xff == NicNum) || (i == NicNum)) { printf("\n%d",i); - printf("\t\t"); - for (j = 0 ; j < 5; j++) { - printf("%02x:", - EmbeddedNICMacAddress_10G.MacAddress[i].MacAddressByte[j]); - } - printf("%02x", - EmbeddedNICMacAddress_10G.MacAddress[i].MacAddressByte[j]); + printf("\t\t%s", + mac2str(EmbeddedNICMacAddress_10G.MacAddress[i].MacAddressByte)); } } printf("\n"); @@ -1889,13 +1876,7 @@ ipmi_macinfo_11g(struct ipmi_intf* intf, uint8_t NicNum) if ((0xff==NicNum) || (NicNum == EmbeddedNICMacAddress.LOMMacAddress[i].NICNumber)) { printf("\n%d",EmbeddedNICMacAddress.LOMMacAddress[i].NICNumber); - printf("\t\t"); - for (j = 0; j < 5; j++) { - printf("%02x:", - EmbeddedNICMacAddress.LOMMacAddress[i].MacAddressByte[j]); - } - printf("%02x", - EmbeddedNICMacAddress.LOMMacAddress[i].MacAddressByte[j]); + printf("\t\t%s", mac2str(EmbeddedNICMacAddress.LOMMacAddress[i].MacAddressByte)); if (LOM_ETHERNET_ENABLED == EmbeddedNICMacAddress.LOMMacAddress[i].EthernetStatus) { diff --git a/lib/ipmi_lanp.c b/lib/ipmi_lanp.c index ce6af4a..16a3a3e 100644 --- a/lib/ipmi_lanp.c +++ b/lib/ipmi_lanp.c @@ -704,8 +704,7 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) if (p == NULL) return -1; if (p->data != NULL) - printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc, - p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]); + printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_SNMP_STRING); if (p == NULL) @@ -744,8 +743,7 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) if (p == NULL) return -1; if (p->data != NULL) - printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc, - p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]); + printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP); if (p == NULL) @@ -758,8 +756,7 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) if (p == NULL) return -1; if (p->data != NULL) - printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", p->desc, - p->data[0], p->data[1], p->data[2], p->data[3], p->data[4], p->data[5]); + printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_VLAN_ID); if (p != NULL && p->data != NULL) { @@ -1103,42 +1100,6 @@ ipmi_set_user_access(struct ipmi_intf *intf, uint8_t channel, uint8_t user_id) } } -/* get_cmdline_macaddr - parse-out MAC address from given string and store it - * into buffer. - * - * @arg: string to be parsed. - * @buf: buffer of 6 to hold parsed MAC address. - * - * returns zero on success, (-1) on error and error message is printed-out. - */ -static int -get_cmdline_macaddr(char *arg, uint8_t *buf) -{ - uint32_t m1 = 0; - uint32_t m2 = 0; - uint32_t m3 = 0; - uint32_t m4 = 0; - uint32_t m5 = 0; - uint32_t m6 = 0; - if (sscanf(arg, "%02x:%02x:%02x:%02x:%02x:%02x", - &m1, &m2, &m3, &m4, &m5, &m6) != 6) { - lprintf(LOG_ERR, "Invalid MAC address: %s", arg); - return -1; - } - if (m1 > UINT8_MAX || m2 > UINT8_MAX - || m3 > UINT8_MAX || m4 > UINT8_MAX - || m5 > UINT8_MAX || m6 > UINT8_MAX) { - lprintf(LOG_ERR, "Invalid MAC address: %s", arg); - return -1; - } - buf[0] = (uint8_t)m1; - buf[1] = (uint8_t)m2; - buf[2] = (uint8_t)m3; - buf[3] = (uint8_t)m4; - buf[4] = (uint8_t)m5; - buf[5] = (uint8_t)m6; - return 0; -} static int @@ -1540,11 +1501,11 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) print_lan_set_usage(); return -1; } - rc = get_cmdline_macaddr(argv[2], data); + rc = str2mac(argv[2], data); if (rc == 0) { - printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n", - ipmi_lan_params[IPMI_LANP_MAC_ADDR].desc, - data[0], data[1], data[2], data[3], data[4], data[5]); + printf("Setting LAN %s to %s\n", + ipmi_lan_params[IPMI_LANP_MAC_ADDR].desc, + mac2str(data)); rc = set_lan_param(intf, chan, IPMI_LANP_MAC_ADDR, data, 6); } } @@ -1566,10 +1527,10 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) rc = set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP, data, 4); } else if ((strncmp(argv[2], "macaddr", 7) == 0) && - (get_cmdline_macaddr(argv[3], data) == 0)) { - printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n", - ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_MAC].desc, - data[0], data[1], data[2], data[3], data[4], data[5]); + (str2mac(argv[3], data) == 0)) { + printf("Setting LAN %s to %s\n", + ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_MAC].desc, + mac2str(data)); rc = set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC, data, 6); } else { @@ -1595,10 +1556,10 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) rc = set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP, data, 4); } else if ((strncmp(argv[2], "macaddr", 7) == 0) && - (get_cmdline_macaddr(argv[3], data) == 0)) { - printf("Setting LAN %s to %02x:%02x:%02x:%02x:%02x:%02x\n", - ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_MAC].desc, - data[0], data[1], data[2], data[3], data[4], data[5]); + (str2mac(argv[3], data) == 0)) { + printf("Setting LAN %s to %s\n", + ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_MAC].desc, + mac2str(data)); rc = set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC, data, 6); } else { @@ -1776,9 +1737,8 @@ ipmi_lan_alert_print(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) printf("%-24s: %d.%d.%d.%d\n", "Alert IP Address", paddr[3], paddr[4], paddr[5], paddr[6]); - printf("%-24s: %02x:%02x:%02x:%02x:%02x:%02x\n", "Alert MAC Address", - paddr[7], paddr[8], paddr[9], - paddr[10], paddr[11], paddr[12]); + printf("%-24s: %s\n", "Alert MAC Address", + mac2str(&paddr[7])); printf("\n"); return 0; @@ -1843,7 +1803,7 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, } /* alert destination mac address */ else if (strncasecmp(argv[0], "macaddr", 7) == 0 && - (get_cmdline_macaddr(argv[1], temp) == 0)) { + (str2mac(argv[1], temp) == 0)) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert); if (p == NULL) { @@ -1853,8 +1813,7 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, /* set new macaddr */ memcpy(data+7, temp, 6); printf("Setting LAN Alert %d MAC Address to " - "%02x:%02x:%02x:%02x:%02x:%02x\n", alert, - data[7], data[8], data[9], data[10], data[11], data[12]); + "%s\n", alert, mac2str(&data[7])); rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len); } /* alert destination gateway selector */ diff --git a/lib/ipmi_pef.c b/lib/ipmi_pef.c index 2f7e483..bbf25f2 100644 --- a/lib/ipmi_pef.c +++ b/lib/ipmi_pef.c @@ -720,10 +720,7 @@ ipmi_pef_print_lan_dest(struct ipmi_intf * intf, uint8_t ch, uint8_t dest) pinfo->ip[0], pinfo->ip[1], pinfo->ip[2], pinfo->ip[3]); ipmi_pef_print_str("IP address", buf); - sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x", - pinfo->mac[0], pinfo->mac[1], pinfo->mac[2], - pinfo->mac[3], pinfo->mac[4], pinfo->mac[5]); - ipmi_pef_print_str("MAC address", buf); + ipmi_pef_print_str("MAC address", mac2str(pinfo->mac)); } } diff --git a/lib/ipmi_session.c b/lib/ipmi_session.c index 4855bc4..141f0f4 100644 --- a/lib/ipmi_session.c +++ b/lib/ipmi_session.c @@ -99,13 +99,8 @@ print_session_info_csv(const struct get_session_info_rsp * session_info, buffer, 16)); - printf(",%02x:%02x:%02x:%02x:%02x:%02x", - session_info->channel_data.lan_data.console_mac[0], - session_info->channel_data.lan_data.console_mac[1], - session_info->channel_data.lan_data.console_mac[2], - session_info->channel_data.lan_data.console_mac[3], - session_info->channel_data.lan_data.console_mac[4], - session_info->channel_data.lan_data.console_mac[5]); + printf(",%s", mac2str( + session_info->channel_data.lan_data.console_mac)); console_port_tmp = session_info->channel_data.lan_data.console_port; #if WORDS_BIGENDIAN @@ -187,13 +182,8 @@ print_session_info_verbose(const struct get_session_info_rsp * session_info, buffer, 16)); - printf("console mac : %02x:%02x:%02x:%02x:%02x:%02x\n", - session_info->channel_data.lan_data.console_mac[0], - session_info->channel_data.lan_data.console_mac[1], - session_info->channel_data.lan_data.console_mac[2], - session_info->channel_data.lan_data.console_mac[3], - session_info->channel_data.lan_data.console_mac[4], - session_info->channel_data.lan_data.console_mac[5]); + printf("console mac : %s\n", mac2str( + session_info->channel_data.lan_data.console_mac)); console_port_tmp = session_info->channel_data.lan_data.console_port; #if WORDS_BIGENDIAN commit 2f76ab3d3aaf3aa3b9e567d6e4328b8927110d92 Author: Dmitry Rakhchev <rd...@pi...> Date: Fri Jul 1 12:20:22 2016 +0300 Export find_lan_channel() as global diff --git a/include/ipmitool/ipmi_lanp.h b/include/ipmitool/ipmi_lanp.h index 7f7d653..0972544 100644 --- a/include/ipmitool/ipmi_lanp.h +++ b/include/ipmitool/ipmi_lanp.h @@ -132,4 +132,6 @@ static struct lan_param { int ipmi_lanp_main(struct ipmi_intf *, int, char **); +uint8_t find_lan_channel(struct ipmi_intf *intf, uint8_t start); + #endif /*IPMI_LANP_H*/ diff --git a/lib/ipmi_lanp.c b/lib/ipmi_lanp.c index ecd313a..ce6af4a 100644 --- a/lib/ipmi_lanp.c +++ b/lib/ipmi_lanp.c @@ -104,7 +104,7 @@ is_lan_channel(struct ipmi_intf * intf, uint8_t chan) * @intf: ipmi interface handle * @start: channel number to start searching from */ -static uint8_t +uint8_t find_lan_channel(struct ipmi_intf * intf, uint8_t start) { uint8_t chan = 0; commit 7f8d37493facde42c4f953061c6dee7227d6ddde Author: Dmitry Rakhchev <rd...@pi...> Date: Fri Jul 1 11:19:30 2016 +0300 Rewrite code with the notion that Kg is binary data, not string - use uint8_t as the storage type - allocate kgkey on stack - do not treat incoming kgkey as 0-trminated string in ipmi_intf_session_set_kgkey() diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h index 9285baa..982f645 100644 --- a/include/ipmitool/ipmi_intf.h +++ b/include/ipmitool/ipmi_intf.h @@ -220,7 +220,7 @@ void ipmi_intf_session_set_privlvl(struct ipmi_intf * intf, uint8_t privlvl); void ipmi_intf_session_set_lookupbit(struct ipmi_intf * intf, uint8_t lookupbit); void ipmi_intf_session_set_cipher_suite_id(struct ipmi_intf * intf, uint8_t cipher_suite_id); void ipmi_intf_session_set_sol_escape_char(struct ipmi_intf * intf, char sol_escape_char); -void ipmi_intf_session_set_kgkey(struct ipmi_intf * intf, char * kgkey); +void ipmi_intf_session_set_kgkey(struct ipmi_intf *intf, const uint8_t *kgkey); void ipmi_intf_session_set_port(struct ipmi_intf * intf, int port); void ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype); void ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout); diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index d029d0a..2ea3c26 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -291,42 +291,6 @@ void ipmi_catch_sigint() exit(-1); } -/* ipmi_parse_hex_KG - get hexadecimal key value - * Input string must be composed of two-characer - * hexadecimal numbers. - * There is no separator between the numbers. Each number - * results in one byte of the converted string. - * - * Example: ipmi_parse_hex("50415353574F5244") - * returns 'PASSWORD' - * - * @param str: input string. It must contain only even number - * of '0'-'9','a'-'f' and 'A-F' characters. - * @returns obtained key or NULL on error - */ -static uint8_t * -ipmi_parse_hex_KG(const char *str) -{ - int rc; - uint8_t *out; - - out = calloc(IPMI_KG_BUFFER_SIZE, sizeof(uint8_t)); - rc = ipmi_parse_hex(str, out, IPMI_KG_BUFFER_SIZE - 1); - - if (rc == -1) { - lprintf(LOG_ERR, "Number of hex_kg characters is not even"); - } else if (rc == -2) { - lprintf(LOG_ERR, "malloc failure"); - } else if (rc == -3) { - lprintf(LOG_ERR, "Kg_hex is not hexadecimal number"); - } else if (rc > (IPMI_KG_BUFFER_SIZE-1)) { - lprintf(LOG_ERR, "Kg key is too long"); - free(out); - out = NULL; - } - return (unsigned char *)out; -} - static uint8_t ipmi_acquire_ipmb_address(struct ipmi_intf * intf) { @@ -379,7 +343,7 @@ ipmi_main(int argc, char ** argv, char * progname = NULL; char * oemtype = NULL; char * sdrcache = NULL; - unsigned char * kgkey = NULL; + uint8_t kgkey[IPMI_KG_BUFFER_SIZE]; char * seloem = NULL; int port = 0; int devnum = 0; @@ -394,6 +358,7 @@ ipmi_main(int argc, char ** argv, progname = strrchr(argv[0], '/'); progname = ((progname == NULL) ? argv[0] : progname+1); signal(SIGINT, ipmi_catch_sigint); + memset(kgkey, 0, sizeof(kgkey)); while ((argflag = getopt(argc, (char **)argv, OPTION_STRING)) != -1) { @@ -520,38 +485,29 @@ ipmi_main(int argc, char ** argv, } break; case 'k': - if (kgkey) { - free(kgkey); - kgkey = NULL; - } - kgkey = strdup(optarg); - if (kgkey == NULL) { - lprintf(LOG_ERR, "%s: malloc failure", progname); - goto out_free; - } + memset(kgkey, 0, sizeof(kgkey)); + strncpy((char *)kgkey, optarg, sizeof(kgkey) - 1); break; case 'K': if ((tmp_env = getenv("IPMI_KGKEY"))) { - if (kgkey) { - free(kgkey); - kgkey = NULL; - } - kgkey = strdup(tmp_env); - if (kgkey == NULL) { - lprintf(LOG_ERR, "%s: malloc failure", progname); - goto out_free; - } + memset(kgkey, 0, sizeof(kgkey)); + strncpy((char *)kgkey, tmp_env, + sizeof(kgkey) - 1); } else { lprintf(LOG_WARN, "Unable to read kgkey from environment"); } break; case 'y': - if (kgkey) { - free(kgkey); - kgkey = NULL; - } - kgkey = ipmi_parse_hex_KG(optarg); - if (kgkey == NULL) { + memset(kgkey, 0, sizeof(kgkey)); + rc = ipmi_parse_hex(optarg, kgkey, sizeof(kgkey) - 1); + + if (rc == -1) { + lprintf(LOG_ERR, "Number of Kg key characters is not even"); + } else if (rc == -3) { + lprintf(LOG_ERR, "Kg key is not hexadecimal number"); + goto out_free; + } else if (rc > (IPMI_KG_BUFFER_SIZE-1)) { + lprintf(LOG_ERR, "Kg key is too long"); goto out_free; } break; @@ -562,16 +518,10 @@ ipmi_main(int argc, char ** argv, tmp_pass = getpass("Key: "); #endif if (tmp_pass != NULL) { - if (kgkey) { - free(kgkey); - kgkey = NULL; - } - kgkey = strdup(tmp_pass); + memset(kgkey, 0, sizeof(kgkey)); + strncpy((char *)kgkey, tmp_pass, + sizeof(kgkey) - 1); tmp_pass = NULL; - if (kgkey == NULL) { - lprintf(LOG_ERR, "%s: malloc failure", progname); - goto out_free; - } } break; case 'U': @@ -901,8 +851,7 @@ ipmi_main(int argc, char ** argv, ipmi_intf_session_set_username(ipmi_main_intf, username); if (password != NULL) ipmi_intf_session_set_password(ipmi_main_intf, password); - if (kgkey != NULL) - ipmi_intf_session_set_kgkey(ipmi_main_intf, kgkey); + ipmi_intf_session_set_kgkey(ipmi_main_intf, kgkey); if (port > 0) ipmi_intf_session_set_port(ipmi_main_intf, port); if (authtype >= 0) @@ -1096,10 +1045,6 @@ ipmi_main(int argc, char ** argv, free(seloem); seloem = NULL; } - if (kgkey != NULL) { - free(kgkey); - kgkey = NULL; - } if (sdrcache != NULL) { free(sdrcache); sdrcache = NULL; diff --git a/src/plugins/ipmi_intf.c b/src/plugins/ipmi_intf.c index 6cf0553..9225a34 100644 --- a/src/plugins/ipmi_intf.c +++ b/src/plugins/ipmi_intf.c @@ -264,15 +264,9 @@ ipmi_intf_session_set_sol_escape_char(struct ipmi_intf * intf, char sol_escape_c } void -ipmi_intf_session_set_kgkey(struct ipmi_intf * intf, char * kgkey) +ipmi_intf_session_set_kgkey(struct ipmi_intf *intf, const uint8_t *kgkey) { - memset(intf->ssn_params.kg, 0, IPMI_KG_BUFFER_SIZE); - - if (kgkey == NULL) - return; - - memcpy(intf->ssn_params.kg, kgkey, - __min(strlen(kgkey), IPMI_KG_BUFFER_SIZE)); + memcpy(intf->ssn_params.kg, kgkey, IPMI_KG_BUFFER_SIZE); } void commit f9211f8ed977f20c4601f00d0cc56724ebdff04a Author: Dmitry Rakhchev <rd...@pi...> Date: Thu Jun 30 21:25:25 2016 +0300 Moved ipmi_parse_hex() to helper.c diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h index 41a3fa5..81b8825 100644 --- a/include/ipmitool/helper.h +++ b/include/ipmitool/helper.h @@ -100,6 +100,7 @@ uint32_t buf2long(uint8_t * buf); #define BUF2STR_MAXIMUM_OUTPUT_SIZE (3*1024 + 1) const char * buf2str_extended(const uint8_t *buf, int len, const char *sep); const char * buf2str(const uint8_t *buf, int len); +int ipmi_parse_hex(const char *str, uint8_t *out, int size); void printbuf(const uint8_t * buf, int len, const char * desc); uint8_t ipmi_csum(uint8_t * d, int s); FILE * ipmi_open_file(const char * file, int rw); diff --git a/lib/helper.c b/lib/helper.c index 04a5e0d..ad5a898 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -51,6 +51,7 @@ #include <fcntl.h> #include <errno.h> #include <assert.h> +#include <ctype.h> #if HAVE_CONFIG_H # include <config.h> @@ -140,6 +141,80 @@ buf2str(const uint8_t *buf, int len) return buf2str_extended(buf, len, NULL); } +/* ipmi_parse_hex - convert hexadecimal numbers to ascii string + * Input string must be composed of two-characer + * hexadecimal numbers. + * There is no separator between the numbers. Each number + * results in one byte of the converted string. + * + * Example: ipmi_parse_hex("50415353574F5244") + * returns 'PASSWORD' + * + * @param str: input string. It must contain only even number + * of '0'-'9','a'-'f' and 'A-F' characters. + * @param out: pointer to output data + * @param size: size of the output buffer + * @returns 0 for empty input string + * -1 for string with odd length + * -2 if out is NULL + * -3 if there is non-hexadecimal char in string + * >0 length of resulting binary data even if it is > size + */ +int +ipmi_parse_hex(const char *str, uint8_t *out, int size) +{ + const char *p; + uint8_t *q; + uint8_t d = 0; + uint8_t b = 0; + int shift = 4; + int len; + + len = strlen(str); + if (len == 0) { + return 0; + } + + if (len % 2 != 0) { + return -1; + } + + len /= 2; /* out bytes */ + if (out == NULL) { + return -2; + } + + for (p = str, q = out; *p; p++) { + if (!isxdigit(*p)) { + return -3; + } + + if (*p < 'A') { + /* it must be 0-9 */ + d = *p - '0'; + } else { + /* it's A-F or a-f */ + /* convert to lowercase and to 10-15 */ + d = (*p | 0x20) - 'a' + 10; + } + + if (q < (out + size)) { + /* there is space, store */ + b += d << shift; + if (shift) { + shift = 0; + } else { + shift = 4; + *q = b; + b = 0; + q++; + } + } + } + + return len; +} + void printbuf(const uint8_t * buf, int len, const char * desc) { int i; diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index e6f96f6..d029d0a 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -291,67 +291,40 @@ void ipmi_catch_sigint() exit(-1); } -/* ipmi_parse_hex - convert hexadecimal numbers to ascii string - * Input string must be composed of two-characer hexadecimal numbers. - * There is no separator between the numbers. Each number results in one character - * of the converted string. +/* ipmi_parse_hex_KG - get hexadecimal key value + * Input string must be composed of two-characer + * hexadecimal numbers. + * There is no separator between the numbers. Each number + * results in one byte of the converted string. * - * Example: ipmi_parse_hex("50415353574F5244") returns 'PASSWORD' + * Example: ipmi_parse_hex("50415353574F5244") + * returns 'PASSWORD' * - * @param str: input string. It must contain only even number of '0'-'9','a'-'f' and 'A-F' characters. - * @returns converted ascii string - * @returns NULL on error + * @param str: input string. It must contain only even number + * of '0'-'9','a'-'f' and 'A-F' characters. + * @returns obtained key or NULL on error */ -static unsigned char * -ipmi_parse_hex(const char *str) +static uint8_t * +ipmi_parse_hex_KG(const char *str) { - const char * p; - unsigned char * out, *q; - unsigned char b = 0; - int shift = 4; + int rc; + uint8_t *out; - if (strlen(str) == 0) - return NULL; + out = calloc(IPMI_KG_BUFFER_SIZE, sizeof(uint8_t)); + rc = ipmi_parse_hex(str, out, IPMI_KG_BUFFER_SIZE - 1); - if (strlen(str) % 2 != 0) { + if (rc == -1) { lprintf(LOG_ERR, "Number of hex_kg characters is not even"); - return NULL; - } - - if (strlen(str) > (IPMI_KG_BUFFER_SIZE-1)*2) { - lprintf(LOG_ERR, "Kg key is too long"); - return NULL; - } - - out = calloc(IPMI_KG_BUFFER_SIZE, sizeof(unsigned char)); - if (out == NULL) { + } else if (rc == -2) { lprintf(LOG_ERR, "malloc failure"); - return NULL; - } - - for (p = str, q = out; *p; p++) { - if (!isxdigit(*p)) { - lprintf(LOG_ERR, "Kg_hex is not hexadecimal number"); - free(out); - out = NULL; - return NULL; - } - - if (*p < 'A') /* it must be 0-9 */ - b = *p - '0'; - else /* it's A-F or a-f */ - b = (*p | 0x20) - 'a' + 10; /* convert to lowercase and to 10-15 */ - - *q = *q + (b << shift); - if (shift) - shift = 0; - else { - shift = 4; - q++; - } + } else if (rc == -3) { + lprintf(LOG_ERR, "Kg_hex is not hexadecimal number"); + } else if (rc > (IPMI_KG_BUFFER_SIZE-1)) { + lprintf(LOG_ERR, "Kg key is too long"); + free(out); + out = NULL; } - - return out; + return (unsigned char *)out; } static uint8_t @@ -577,7 +550,7 @@ ipmi_main(int argc, char ** argv, free(kgkey); kgkey = NULL; } - kgkey = ipmi_parse_hex(optarg); + kgkey = ipmi_parse_hex_KG(optarg); if (kgkey == NULL) { goto out_free; } commit ea46724878894fbe06130b1cd3824e3582d1020a Author: Dmitry Rakhchev <rd...@pi...> Date: Fri Jul 1 11:48:29 2016 +0300 Fix warning for buf2str argument diff --git a/src/plugins/serial/serial_basic.c b/src/plugins/serial/serial_basic.c index a53bbd9..21a239a 100644 --- a/src/plugins/serial/serial_basic.c +++ b/src/plugins/serial/serial_basic.c @@ -130,7 +130,7 @@ struct serial_bm_parse_ctx{ * Receiving context */ struct serial_bm_recv_ctx { - char buffer[SERIAL_BM_MAX_BUFFER_SIZE]; + uint8_t buffer[SERIAL_BM_MAX_BUFFER_SIZE]; size_t buffer_size; size_t max_buffer_size; }; commit 9a6ba646511b6290214158f96ce93340db90f7a1 Author: Dmitry Rakhchev <rd...@pi...> Date: Thu Jul 21 16:52:55 2016 +0300 Extend buf2str to allow separator diff --git a/include/ipmitool/helper.h b/include/ipmitool/helper.h index b7ad628..41a3fa5 100644 --- a/include/ipmitool/helper.h +++ b/include/ipmitool/helper.h @@ -97,7 +97,9 @@ void print_valstr_2col(const struct valstr * vs, const char * title, int logleve uint16_t buf2short(uint8_t * buf); uint32_t buf2long(uint8_t * buf); -const char * buf2str(uint8_t * buf, int len); +#define BUF2STR_MAXIMUM_OUTPUT_SIZE (3*1024 + 1) +const char * buf2str_extended(const uint8_t *buf, int len, const char *sep); +const char * buf2str(const uint8_t *buf, int len); void printbuf(const uint8_t * buf, int len, const char * desc); uint8_t ipmi_csum(uint8_t * d, int s); FILE * ipmi_open_file(const char * file, int rw); diff --git a/lib/helper.c b/lib/helper.c index 022a9c9..04a5e0d 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -79,24 +79,67 @@ uint16_t buf2short(uint8_t * buf) return (uint16_t)(buf[1] << 8 | buf[0]); } -const char * buf2str(uint8_t * buf, int len) +/* buf2str_extended - convert sequence of bytes to hexadecimal string with + * optional separator + * + * @param buf - data to convert + * @param len - size of data + * @param sep - optional separator (can be NULL) + * + * @returns buf representation in hex, possibly truncated to fit + * allocated static memory + */ +const char * +buf2str_extended(const uint8_t *buf, int len, const char *sep) { - static char str[2049]; + static char str[BUF2STR_MAXIMUM_OUTPUT_SIZE]; + char *cur; int i; - - if (len <= 0 || len > 1024) - return NULL; - - memset(str, 0, 2049); - - for (i=0; i<len; i++) - sprintf(str+i+i, "%2.2x", buf[i]); - - str[len*2] = '\0'; + int sz; + int left; + int sep_len; + + if (buf == NULL) { + snprintf(str, sizeof(str), "<NULL>"); + return (const char *)str; + } + cur = str; + left = sizeof(str); + if (sep) { + sep_len = strlen(sep); + } else { + sep_len = 0; + } + for (i = 0; i < len; i++) { + /* may return more than 2, depending on locale */ + sz = snprintf(cur, left, "%2.2x", buf[i]); + if (sz >= left) { + /* buffer overflow, truncate */ + break; + } + cur += sz; + left -= sz; + /* do not write separator after last byte */ + if (sep && i != (len - 1)) { + if (sep_len >= left) { + break; + } + strncpy(cur, sep, left - sz); + cur += sep_len; + left -= sep_len; + } + } + *cur = '\0'; return (const char *)str; } +const char * +buf2str(const uint8_t *buf, int len) +{ + return buf2str_extended(buf, len, NULL); +} + void printbuf(const uint8_t * buf, int len, const char * desc) { int i; commit f8a711b9e8a06bd73c8565634be69bc37066683d Author: Bjoern Spruck <bs...@un...> Date: Wed Jul 27 09:51:19 2016 +0200 ID:452 - Add PICMG extension 5.x for PICMG extension check PICMG extension 5(UTCA, MicroTCA) is not detected as valid extension. The following patch fixes that at one place. In the second place the board type is detected in a similar way, but it isn't clear if a patch is needed there, too. diff --git a/lib/ipmi_picmg.c b/lib/ipmi_picmg.c index e5b79e7..c7d9c8e 100644 --- a/lib/ipmi_picmg.c +++ b/lib/ipmi_picmg.c @@ -2336,6 +2336,7 @@ picmg_discover(struct ipmi_intf *intf) { * PICMG Extension Version 2.0 (PICMG 3.0 Revision 1.0 ATCA) to * PICMG Extension Version 2.3 (PICMG 3.0 Revision 3.0 ATCA) * PICMG Extension Version 4.1 (PICMG 3.0 Revision 3.0 AMC) + * PICMG Extension Version 5.0 (MTCA.0 R1.0) */ /* First, check if PICMG extension is available and supported */ @@ -2366,8 +2367,9 @@ picmg_discover(struct ipmi_intf *intf) { } 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) { + } else if ((rsp->data[1] & 0x0F) != PICMG_EXTENSION_ATCA_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_AMC0_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_UTCA_MAJOR_VERSION) { lprintf(LOG_INFO,"Unknown PICMG Extension Version %d.%d", (rsp->data[1] & 0x0F), (rsp->data[1] >> 4)); } else { commit fcf7445bcebdda167a561a54f598b1480b1bfabd Author: KC Li <kc...@su...> Date: Mon Jul 25 11:36:08 2016 +0800 ID:451 - Modify the memory ecc error display of SEL for new supermicro motherboards. diff --git a/include/ipmitool/ipmi_sel_supermicro.h b/include/ipmitool/ipmi_sel_supermicro.h index a058a8c..1679bd8 100644 --- a/include/ipmitool/ipmi_sel_supermicro.h +++ b/include/ipmitool/ipmi_sel_supermicro.h @@ -34,6 +34,18 @@ #ifndef IPMI_SEL_SUPERMICRO_H # define IPMI_SEL_SUPERMICRO_H +static uint16_t supermicro_x10OBi[] = { + 0x0923, 0xFFFF +}; + +static uint16_t supermicro_x10QRH_X10QBL[] = { + 0x0872, 0x0853, 0xFFFF +}; + +static uint16_t supermicro_brickland[] = { + 0x0726, 0x083A, 0xFFFF +}; + static uint16_t supermicro_x9dal[] = { 0x0635, 0xFFFF }; diff --git a/lib/ipmi_sel.c b/lib/ipmi_sel.c index 953e746..0c07cf4 100644 --- a/lib/ipmi_sel.c +++ b/lib/ipmi_sel.c @@ -620,6 +620,24 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) break; } } + for (i = 0; supermicro_brickland[i] != 0xFFFF; i++) { + if (oem_id == supermicro_brickland[i]) { + chipset_type = 3; + break; + } + } + for (i = 0; supermicro_x10QRH_X10QBL[i] != 0xFFFF; i++) { + if (oem_id == supermicro_x10QRH_X10QBL[i]) { + chipset_type = 4; + break; + } + } + for (i = 0; supermicro_x10OBi[i] != 0xFFFF; i++) { + if (oem_id == supermicro_x10OBi[i]) { + chipset_type = 5; + break; + } + } if (chipset_type == 0) { snprintf(desc, SIZE_OF_DESC, "@DIMM%2X(CPU%x)", data2, @@ -632,6 +650,21 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) snprintf(desc, SIZE_OF_DESC, "@DIMM%c%c(CPU%x)", (data2 >> 4) + 0x40 + (data3 & 0x3) * 3, (data2 & 0xf) + 0x27, (data3 & 0x03) + 1); + } else if (chipset_type == 3) { + snprintf(desc, SIZE_OF_DESC, "@DIMM%c%d(P%dM%d)", + ((data2 & 0xf) >> 4) > 4 + ? '@' - 4 + ((data2 & 0xff) >> 4) + : '@' + ((data2 & 0xff) >> 4), + (data2 & 0xf) - 0x09, (data3 & 0x0f) + 1, + (data2 & 0xff) >> 4 > 4 ? 2 : 1); + } else if (chipset_type == 4) { + snprintf(desc, SIZE_OF_DESC, "@DIMM%c%c(CPU%x)", + (data2 >> 4) + 0x40, + (data2 & 0xf) + 0x27, (data3 & 0x03) + 1); + } else if (chipset_type == 5) { + snprintf(desc, SIZE_OF_DESC, "@DIMM%c%c(CPU%x)", + (data2 >> 4) + 0x40, + (data2 & 0xf) + 0x27, (data3 & 0x07) + 1); } else { /* No description. */ desc[0] = '\0'; ----------------------------------------------------------------------- Summary of changes: include/ipmitool/helper.h | 7 +- include/ipmitool/ipmi_intf.h | 2 +- include/ipmitool/ipmi_lanp.h | 2 + include/ipmitool/ipmi_sel_supermicro.h | 12 ++ lib/helper.c | 183 ++++++++++++++++++++++++++++++-- lib/ipmi_delloem.c | 29 +---- lib/ipmi_lanp.c | 81 ++++----------- lib/ipmi_main.c | 125 ++++------------------ lib/ipmi_pef.c | 5 +- lib/ipmi_picmg.c | 6 +- lib/ipmi_sel.c | 33 ++++++ lib/ipmi_session.c | 18 +--- src/plugins/ipmi_intf.c | 10 +-- src/plugins/serial/serial_basic.c | 2 +- 14 files changed, 287 insertions(+), 228 deletions(-) hooks/post-receive -- ipmitool |
From: Zdenek S. <st...@us...> - 2016-06-30 04:32:12
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "ipmitool". The branch, master has been updated via a3bec1d3658c67f366e1f584abcb5d7a4b5fdce6 (commit) from 8bd96591013d5f3b5f109a22581daceda70a4a09 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a3bec1d3658c67f366e1f584abcb5d7a4b5fdce6 Author: Mamatha Inamdar <mam...@li...> Date: Wed Jun 29 16:52:13 2016 +0530 ID:449 - ipmitool close console session for sol deactivate command In the new version of ipmitool 1.8.15 and above, sol deactivate command was not closing the session, This patch is to fix close console session When we issue sol deactivate command. diff --git a/lib/ipmi_sol.c b/lib/ipmi_sol.c index 333ce90..3acd5bb 100644 --- a/lib/ipmi_sol.c +++ b/lib/ipmi_sol.c @@ -1648,15 +1648,11 @@ ipmi_sol_red_pill(struct ipmi_intf * intf, int instance) else if (FD_ISSET(intf->fd, &read_fds)) { struct ipmi_rs * rs =intf->recv_sol(intf); - if ( rs) - { + if (rs) { output(rs); + } else { + bShouldExit = bBmcClosedSession = 1; } - /* - * Should recv_sol come back null, the incoming packet was not ours. - * Just fall through, the keepalive logic will determine if - * the BMC has dropped the session. - */ } ----------------------------------------------------------------------- Summary of changes: lib/ipmi_sol.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-) hooks/post-receive -- ipmitool |