mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-07-01 02:03:50 +00:00
Compare commits
370 Commits
IPMITOOL_1
...
IPMITOOL_1
Author | SHA1 | Date | |
---|---|---|---|
be7917f9f5 | |||
a7d3bda08d | |||
d531785a23 | |||
eeeb973e39 | |||
166ae1da23 | |||
4f0967779e | |||
9d88837ef3 | |||
824c0ed4a0 | |||
7ea04d8f77 | |||
8d5e8fcf7a | |||
2c7526be6b | |||
a88db0d181 | |||
42aba7eb4f | |||
23e9340b49 | |||
707d77ffbc | |||
7584b96c1d | |||
cc85ce1333 | |||
2c7a5f91ef | |||
9e3dba7e97 | |||
176774cf9f | |||
cab450a052 | |||
250eb15f92 | |||
02e4a0361c | |||
ca5cc560f6 | |||
b4a9d2f9a2 | |||
8d44c55feb | |||
c18ec02f33 | |||
b0aad15d67 | |||
adbf585bd4 | |||
9393bf0133 | |||
2c2844ac03 | |||
c186e2a681 | |||
e02ed2ca2c | |||
a06f8a26d4 | |||
a324db391c | |||
b086e876d7 | |||
555a08ece0 | |||
696ccb0787 | |||
86cb5ee175 | |||
99fff91f9d | |||
df3e3c7969 | |||
135977a497 | |||
4e220bebb0 | |||
4698e667f5 | |||
ff1dbe3d5b | |||
d42890ef17 | |||
2d7fe32687 | |||
3a852a8849 | |||
c9e047c334 | |||
6cf6b4b845 | |||
36c11f6033 | |||
5dc9585e77 | |||
0b97d32c25 | |||
5949b19d44 | |||
0cd8f46c42 | |||
2ff745286b | |||
f6cabfb089 | |||
d3ca7cb090 | |||
6871fe1c8e | |||
b9a0c5a091 | |||
1cc4ba699d | |||
b779439ad0 | |||
63ef18e6e0 | |||
935b215514 | |||
cd524c2d25 | |||
e24c7f75f2 | |||
da4b779adf | |||
aca8d6ad7b | |||
5416af78a5 | |||
770e61663f | |||
22f294fc27 | |||
a675601da4 | |||
645120f545 | |||
2df9ca914f | |||
a5d55b5d51 | |||
f2ba7fcd60 | |||
24923222f6 | |||
5bf68a4769 | |||
4e2ac7d097 | |||
d5d86d4dcb | |||
0a4a5cafbc | |||
043c42160e | |||
49879b387c | |||
38121041c1 | |||
d8f27165d1 | |||
5a1e81a948 | |||
f12b976ebc | |||
0dddcfe450 | |||
700658e91e | |||
3df72b68bc | |||
068bcb02e4 | |||
52634a708f | |||
2b08fd405e | |||
fb3c6f292e | |||
d02492f1c7 | |||
9517cb332b | |||
ae96dd3229 | |||
968f5d6552 | |||
f4730e1f67 | |||
b782311e10 | |||
45d0a4255a | |||
ac9513025c | |||
60a3e63429 | |||
f19ed0a90b | |||
7a0b451fd7 | |||
a8119d13a8 | |||
f56cea1253 | |||
7b5683d85d | |||
80c03570ac | |||
6de0796079 | |||
18aadc30d0 | |||
08f50ad301 | |||
b803224398 | |||
5d3c64f028 | |||
942dcb71d8 | |||
29af592773 | |||
ada4b48baf | |||
47831b3c15 | |||
efdeb12724 | |||
c7412e5815 | |||
041d8e4bf8 | |||
6a02cccb70 | |||
3d9c5ae746 | |||
49350157fe | |||
c6f6550f27 | |||
ad86adac54 | |||
f04ccaf79e | |||
fa74f3bf3a | |||
8e95964938 | |||
558bf55c41 | |||
393ae97425 | |||
ee6c9be382 | |||
5177966867 | |||
f6dbaf231b | |||
8cd3acb188 | |||
2c6ca03f8a | |||
aebc7d3616 | |||
157132be8c | |||
8525fdd2a3 | |||
f8cecaa71a | |||
a771107c47 | |||
afd015709b | |||
bfba2f83f5 | |||
8e94374cf1 | |||
ced5794e48 | |||
a298d2e704 | |||
2d71d428f3 | |||
2e5fbc878b | |||
8b7969a46f | |||
04ba23bc5d | |||
977c587fde | |||
dd377108ee | |||
4aea72e46f | |||
39bcb37d14 | |||
7770739372 | |||
2ac947f6e1 | |||
c94c7a5c86 | |||
4fdbe5bbd0 | |||
c49bc06c39 | |||
55524327ce | |||
85ff7dc46a | |||
8c5013b0ba | |||
ea8ce15131 | |||
6d89531096 | |||
e56e914866 | |||
cee8fc659a | |||
25fa0f80ae | |||
22e38bc46f | |||
3bd53a2f78 | |||
30e4efe8a4 | |||
bf8acad458 | |||
2db7f5f6b9 | |||
71dea69efc | |||
9f51d8f188 | |||
8a40297308 | |||
fb5d8559e6 | |||
2a260d32e9 | |||
94c0bd0a6c | |||
3cb937f15e | |||
edc700ed9a | |||
287b313e26 | |||
47d53000ce | |||
66399810f0 | |||
0ab78dbf02 | |||
c048c9f311 | |||
c32228d7c1 | |||
a855c37619 | |||
6a66405177 | |||
4a4331ef6d | |||
41288eb5e4 | |||
dbd2db71f2 | |||
a472c382f4 | |||
e8125c2405 | |||
c0f41fa647 | |||
5c74d2935e | |||
cd6b7039f0 | |||
b4cb02a4d9 | |||
91fdb17260 | |||
2302e83db5 | |||
b0294b96fd | |||
f1f2cbb18b | |||
eb65a625a2 | |||
516fe51505 | |||
5d5251f7da | |||
5819b314af | |||
630934cb89 | |||
d44be6e5f5 | |||
078ff3a04e | |||
865c435b4c | |||
1d9dd4e2de | |||
e95a4cf998 | |||
38f89a449d | |||
64e0b9ab64 | |||
e30f3726a6 | |||
63ba1cc610 | |||
384618d1bc | |||
b0020e0bae | |||
7a861ffba6 | |||
811da1307a | |||
8489426a63 | |||
dbe514a558 | |||
d5ab51f2cd | |||
0cea01e42f | |||
38d71179e9 | |||
cc48c433fd | |||
51dd9cf1f0 | |||
44247a8743 | |||
d82a29d813 | |||
c5324e879c | |||
a8f6341728 | |||
7472986e1c | |||
72dd3edde4 | |||
cf6740b3f6 | |||
14e26ac8a0 | |||
cee211da31 | |||
3818c0d296 | |||
ae05861b62 | |||
c29cf4bcd3 | |||
723e3da037 | |||
c72afa37ee | |||
fa5bdb2f3d | |||
49784a9ec8 | |||
d1d404fef4 | |||
de1dee44bd | |||
e1728327f6 | |||
3b77db9a86 | |||
2abad0e504 | |||
0411186443 | |||
1e96d20277 | |||
de4de4fc96 | |||
4299cfa385 | |||
184994586e | |||
692861f292 | |||
39408ea589 | |||
1602e0a7a2 | |||
f074f76620 | |||
87e6c7279d | |||
1f1dc806fe | |||
8afb3c315b | |||
4aae41904d | |||
41a44b037f | |||
49a7ceee70 | |||
3687a6cbb8 | |||
627cadaa39 | |||
eb63058bc3 | |||
15f1255237 | |||
2dfa02ba24 | |||
9d6a201911 | |||
ad01921281 | |||
d27d2f7ae3 | |||
26c17eeb91 | |||
fdbef84866 | |||
3a383608dd | |||
66fcf484a4 | |||
52c07d61f9 | |||
fd752420ec | |||
7a74ab32a8 | |||
3ea41bda4b | |||
992b42ceee | |||
002c8becf4 | |||
6f1bd51f1e | |||
4719d371b7 | |||
ba9a313911 | |||
4a9af33734 | |||
e320e266b1 | |||
95df7b2499 | |||
665f2f7ee9 | |||
e99e525a53 | |||
39ad0d62cc | |||
db56cc3f86 | |||
108dc8aa0b | |||
b6c97d8318 | |||
fd2ab0b7bb | |||
8c91abfa19 | |||
4c009309eb | |||
ed1865da0a | |||
c726a09482 | |||
a70de993cf | |||
c53a3cbb8e | |||
69e43dc87f | |||
5fa202f7d3 | |||
c070fc00d6 | |||
bd4f34b035 | |||
6e87e423eb | |||
37861d60e4 | |||
bd5ffa4756 | |||
c958de2870 | |||
86805c2146 | |||
c97d9d5b85 | |||
76ed820e03 | |||
091ba2ea58 | |||
3f53760062 | |||
83794843b5 | |||
4a12bdebd6 | |||
8a4139e1b8 | |||
15d683d86d | |||
6eda3b5482 | |||
6a82e95988 | |||
28f93df807 | |||
3f9b728e57 | |||
9a8a8b7dad | |||
75d6c72c5d | |||
8882955891 | |||
22b283b210 | |||
2bb3100395 | |||
5dbb6b69de | |||
791268a61c | |||
970c5ff8b6 | |||
4728863d5b | |||
a3d872c73d | |||
9b3000e329 | |||
bd851bab8f | |||
b4754b5edb | |||
99e4ac0399 | |||
6733b66a9c | |||
daf4c4831f | |||
d2d2f4789d | |||
cce3f84896 | |||
3018b229b1 | |||
fc62075b76 | |||
a5384fa12e | |||
7973f44304 | |||
8d9b434b5a | |||
5b90f68407 | |||
2edc474cef | |||
472d8ab1b3 | |||
4af83567b0 | |||
66bdb86f04 | |||
9ef6162f3c | |||
629a96d9c3 | |||
122e11a2e8 | |||
a974ab2c69 | |||
f8f6d51fd2 | |||
8d828f6c72 | |||
d54e20c545 | |||
44310bd898 | |||
a9f7a7b92e | |||
d65cccc32a | |||
131846fb40 | |||
c62359bd79 | |||
1e83f7c88a | |||
4a4b2e3b59 | |||
c88b139452 | |||
6011359cb3 | |||
23a5477d6e | |||
700ee7d27d | |||
2d725c2cd6 | |||
5c9addb8c4 | |||
c0290ef09a | |||
6c1e3e2ecc |
@ -2,3 +2,4 @@ Duncan Laurie <duncan@iceblink.org>
|
||||
Fredrik Öhrn <ohrn@chl.chalmers.se>
|
||||
Jon Cassorla <jon.cassorla@newisys.com>
|
||||
Jeremy Ellington <jeremy@jeremye.net>
|
||||
Petter Reinholdtsen <pere@hungry.com>
|
@ -1,3 +1,176 @@
|
||||
version 1.8.14 2014-05-05
|
||||
* ID: 299 - openipmi plugin writes zero to wrong byte
|
||||
* ID: 301 - Add OS/Hypervisor installation status events
|
||||
* ID: 298 - fix LANplus retry
|
||||
* ID: 295 - inform user if SOL session disconnected
|
||||
* ID: 297 - don't print-out SEL entry if ID not present
|
||||
* ID: 296 - Fix PSD size decoding
|
||||
* ID: 293 - Use of uninitialized variable in ipmi_main()
|
||||
* ID: 278 - Error in sol looptest
|
||||
* ID: 290 - ipmi_sol.c needs a clean-up
|
||||
* ID: 85 - Supermicro memory ECC error display
|
||||
* ID: 290 - ipmi_sol.c needs a clean-up
|
||||
* ID: 286 - Open session retries hit assert in ipmi_lanplus_send_payload
|
||||
* ID: 285 - Fix SEGV in ipmi_lanplus_open_session
|
||||
* ID: 284 - Fix SEGV in ipmi_main
|
||||
* ID: 283 - ipmi_intf_socket_connect fails with IPv4 hosts
|
||||
* ID: 46 - ipmi_fwum needs some re-work
|
||||
* ID: 50 - ipmi_hpmfwupg needs a clean up
|
||||
* ID: 279 - ipmitool sdr list broken
|
||||
* ID: 44 - dummy interface support - fake-ipmistack project
|
||||
* ID: 48 - Remove hard-coded FRU inventory access length restriction
|
||||
* ID: 276 - HPM.1 upgrade combined patch
|
||||
* ID: 90 - Add options to chassis bootparam set bootflag
|
||||
* ID: 292 -Properly handle plugin non-zero target adddress with -t
|
||||
* Numerous Fixes based on running Coverity
|
||||
* Use TIOCFLUSH if TCFLSH is missing to get the serial plugin building on
|
||||
Hurd.
|
||||
* Disable imb and open plugins by default on Hurd. The platform lack
|
||||
the required kernel support.
|
||||
* Change serial plugin to only try to disable the IUCLC serial line flag on
|
||||
platforms supporting it. Fixes build problem on Hurd and FreeBSD.
|
||||
* PA: 83 - Revised IPv6 patch
|
||||
* FR: 24 - Exchange OS Name Hostname BMC URL during startup
|
||||
* ID: 304 - Incorect byteswap in SOL maximum payload
|
||||
* ID: 303 - Fix build error in HPM.2 code
|
||||
* ID: 300 - new sunoem functionality
|
||||
* ID: 144 - Fix 'dcmi power set_limit action <value>'
|
||||
* ID: 302 - HPM.2 long message support
|
||||
* ID: 309 - Add new SEL entries for ipmi 2.0 rev 1.1
|
||||
* ID: 280 - man page cleanup
|
||||
* ID: 311 - man page update for new sunoem commands
|
||||
|
||||
version 1.8.13 2013-09-09
|
||||
* ID: 3611905 - Direct Serial Basic/Terminal Mode Interface drivers
|
||||
* ID: 3577766 - configure's knobs and switches don't work
|
||||
* ID: 3611253 - do not override OS-default values for interfaces
|
||||
* ID: 65 - Fixes for configure.in for cross compilation
|
||||
* ID: 3571153 - OpenIPMI/ipmievd fails to compile on Solaris
|
||||
* numerous ipmitool man page updates
|
||||
* ID: 3611226 - Bridging support for PICMG Platforms
|
||||
* Add support for getsysinfo/setsysinfo commands to ipmi mc
|
||||
* Cleanup Dell OEM code to use new sysinfo interface
|
||||
* ID: 93 - str-to-int conversion is weak
|
||||
* ID: 3582307 - ipmi_fru - ipmi_fru_main() return codes
|
||||
* ID: 3582310 - ipmi_fru - ipmi_fru_main() - misuse of printf()
|
||||
* ID: 3576213 - ipmi_fru - unused variable
|
||||
* ID: 3578276 - ipmi_fru - free() on freed memory possible
|
||||
* ID: 3578275 - ipmi_fru - memory leaks
|
||||
* ID: 3528271 - ipmi_fru - possible *flow via FRUID
|
||||
* ID: 3578277 - ipmi_fru - possible NULL pointer
|
||||
* ID: 3612372 - Recognize Broadcom IANA number and BCM5725 product
|
||||
* ID: 3608758 - add IPMI_NETFN_OEM
|
||||
* ID: 143 - Reversed 'channel authcap' capabilities
|
||||
Fixes reversed IPMIv1.5/2.0 'channel authcap' capabilities
|
||||
* ID: 3587318 - "dcmi discover" is not DCMI 1.5 compatible
|
||||
* ID: 3608757 - ipmi_fru - various fixes
|
||||
* ID: 3598203 - 'mc getsysinfo|setsysinfo' needs a bit of re-work
|
||||
* ID: 3597782 - ipmi_mc - sysinfo_param() has two consecutive returns
|
||||
* ID: 3597781 - 'mc getsysinfo|setsysinfo' help has typos
|
||||
* ID: 3608763 - ipmi_sdr - code cleanup & output display cleanup
|
||||
* ID: 3610286 - ipmi_sdr - ipmi_sdr_print_type - incorrect eval
|
||||
* ID: 3600930 - ipmi_sdr - code cleanup
|
||||
* ID: 3602439 - ipmi_sdr - memory leaks
|
||||
* ID: 3595199 - ipmi_sdr - Add support for 'ipmitool sdr <list|elist> help'
|
||||
* ID: 3592773 - 'ipmitool sdr info'; prints incorrect info
|
||||
* ID: 3592770 - 'ipmitool sdr list|elist INV_INPUT' return code
|
||||
* ID: 3577159 - ipmi_sdr - uint32_t cast to uint8_t and back
|
||||
* ID: 3528368 - ipmi_sdr - possible int *flow
|
||||
* ID: 226 - ipmi_sdradd - typo
|
||||
* ID: 258 - ipmi_sdradd - error printed on STDOUT
|
||||
* Fixed ipmievd start under systemd.
|
||||
* ID: 3608760 - Add bswap.h to ipmi_chassis.c and ipmi_pef.c
|
||||
* ID: 3564701 - ipmitool 1.8.12 doesn't build on big endian architectures
|
||||
* ID: 3600907 - defined value for "Chassis may not support Force Identify"
|
||||
* ID: 256 - ipmitool could crash when IPv6 address is returned
|
||||
* ID: 211 - 'lib/ipmi_dcmi.c' - typo & error printed on STDOUT
|
||||
* ID: 3612237 - If DCMI command fails, incorrect completion code is printed
|
||||
* ID: 3608149 - ipmitool - set pointer to NULL after free()
|
||||
* ID: 3603419 - DCMI - waste of resources
|
||||
* ID: 3600908 - DMCI - crash in ipmi_print_sensor_info(), NULL ref
|
||||
* ID: 3609985 - delloem : Wrong MAC returned when flex addressing is enabled
|
||||
* ID: 113 - delloem exec file won't handle more than one command
|
||||
* ID: 28 - delloem - clean up the code
|
||||
* ID: 3608261 - delloem - code formatting
|
||||
* ID: 3528247 - delloem - fix possible *int flows
|
||||
* ID: 3600910 - delloem - code cleanup
|
||||
* ID: 3576211 - delloem - unused variable
|
||||
* ID: 3578022 - delloem - fix typos
|
||||
* ID: 263 - ipmi_ek* - cleanup
|
||||
* ID: 3308765 - ipmi_ek* - cleanup
|
||||
* ID: 3586228 - ipmi_ek* - ipmi_ekanalyzer_usage() rework
|
||||
* ID: 3528388 - ipmi_ek* - a typo in error message
|
||||
* ID: 3576212 - ipmi_event - better rsp handling
|
||||
* ID: 3607393 - ipmi_event - redundant '\n' in error message
|
||||
* ID: 153 - ipmi_firewall - printf() used instead of lprintf()
|
||||
* ID: 3608003 - ipmi_fru - atol() should be replaced with str2*()
|
||||
* ID: 3600911 - ipmi_fru - fix multiple increments in args to printf
|
||||
* ID: 3600914 - no more crash on no response. allow more send/recv loops of waiting.
|
||||
* ID: 70 - Fixes and updates for ipmitool hpm
|
||||
* ID: 3528308 - ipmi_hpmfwupg - possible int *flow
|
||||
* ID: 3608762 - ipmi_hpmfwup - Fixed help messages for hpm command
|
||||
* ID: 3607981 - ipmi_lanp - replace atoi() calls
|
||||
* ID: 3607320 - ipmi_lanp - possible NULL reference
|
||||
* ID: 3600926 - ipmi_lanp - code cleanup
|
||||
* ID: 3613575 - memory leak - ipmi_password_file_read()
|
||||
* ID: 3522740 - reading password from file is limited to 16byte passwords
|
||||
* ID: 3613605 - ipmi_main - call free() on pointer to static data
|
||||
* ID: 3608761 - ipmi_main - PICMG Get Device Locator was never run
|
||||
* ID: 3577155 - ipmi_main' - memory leaks
|
||||
* ID: 239 - typo in 'mc selftest', add details
|
||||
* ID: 3597471 - ipmi_mc - needs a bit of re-work - rc, inv. options
|
||||
* ID: 3597468 - ipmi_mc - print_mc_usage() prints to STDOUT
|
||||
* ID: 3597469 - 'mc watchdog off' prints on STDERR, should be STDOUT
|
||||
* ID: 3597470 - 'mc watchdog reset' prints on STDERR, should be STDOUT
|
||||
* ID: 3611254 - OEM handle for Intel 82751 in SPT mode
|
||||
* ID: 3600927 - change eval order of input param in ipmi_oem_setup()
|
||||
* ID: 3600928 - ipmi_pef - code cleanup
|
||||
* ID: 3592732 - ipmi_picmg.c - printf() misuse
|
||||
* ID: 3528310 - ipmi_picmg.c - NULL reference
|
||||
* ID: 3528347 - ipmi_raw.c - possible int *flow
|
||||
* ID: 3587913 - Command % ipmitool raw help; returns 1
|
||||
* Added code to support sensors on other luns (On behalf of Kontron Germany)
|
||||
* ID: 3611912 - Add missing newlines when cvs output is specified
|
||||
* ID: 244 - ipmi_sel - "0.0" displayed for unspecified threshold values
|
||||
* ID: 3612371 - Typo in impi_sel debug output
|
||||
* ID: 3016359 - ipmi_sel - Get SEL Alloc Information is incorrect
|
||||
* ID: 3568976 - 'sel set time' behaviour is inconsistent
|
||||
* ID: 3528371 - ipmi_sensor - possible int *flow
|
||||
* ID: 3601265 - 'ipmitool sensor get' leaks memory
|
||||
* ID: 3601106 - 'ipmitool sensor get NACname' output incorrect/inconsistent
|
||||
* ID: 3608007 - ipmi_session - typo in error message
|
||||
* ID: 101 - ipmi_sol - possible int *flow
|
||||
* ID: 3600933 - ipmi_sol - use of deprecated bzero()
|
||||
* ID: 3609472 - ipmi_sol - Add the instance to the SOL commands
|
||||
* ID: 3588726 - 'ipmitool sol payload status ...;'segfaults on no rsp
|
||||
* ID: 3522731 - ipmi_sol - ipmi_get_sol_info() returns always 0
|
||||
* ID: 3613042 - add missing Entity IDs
|
||||
* ID: 3611306 - ipmi_tsol - fix always fail in case of error
|
||||
* ID: 259 - ipmi_user - memory leak
|
||||
* ID: 260 - ipmi_user - replace atoi() call
|
||||
* ID: 2871903 - ipmitool user priv incorrectly sets Link Auth
|
||||
* ID: 3600960 - check the copy of password exists
|
||||
* ID: 3609473 - Add assertion/deassertion to threshold events
|
||||
* ID: 104 - ipmishell - possible int *flow
|
||||
* ID: 262 - 'set' segfaults when no IPMI inf present
|
||||
* ID: 257 ipmitool exec segfaults if invalid input given
|
||||
* ID: 254 - Fix retry of authentication capabilities retrieval
|
||||
* ID: 3611303 - lan - error check is missing braces
|
||||
* ID: 253 - Fix lanplus retransmission
|
||||
* ID: 212 - 'lib/ipmi_dcmi.c' - possible int *flow
|
||||
* ID: 264 - incorrect array index in get_lan_param_select()
|
||||
* ID: 269 - Fixes for configure.in for cross compilation
|
||||
* ID: 267 - Corruption in "lan alert print" output
|
||||
* ID: 41 - ipmi_sel_interpret() - clean up formatting, indentation
|
||||
* ID: 242 - Incorrect DCMI Power Reading "IPMI timestamp" interpretation
|
||||
* ID: 229 - 'lib/ipmi_ekanalyzer.c' - a typo ``Too few argument!''
|
||||
* ID: 266 - file descriptor leak in ipmi_fwum and ipmi_ekanalyzer
|
||||
* ID: 99 - 'lib/ipmi_sel.c' - possible int *flow
|
||||
* ID: 222 - 'lib/ipmi_sdr.c' - a typo 'Not Reading' -> 'No Reading'
|
||||
* ID: 35 - Script to setup redirection of SNMP to/from BMC
|
||||
* ID: 273 - Reduce SOL Input buffer size by SOL header size
|
||||
|
||||
|
||||
version 1.8.12 released 2012-08-09
|
||||
* Added IPMB dual bridge support (no need for driver support)
|
||||
* Enable compiler warnings and resolve all compiler warning so that
|
@ -410,3 +410,5 @@ http://www.intel.com/design/servers/ipmi/spec.htm
|
||||
OpenIPMI project: Linux IPMI kernel driver and userland library
|
||||
http://openipmi.sourceforge.net
|
||||
|
||||
IPMItool commit archive
|
||||
https://lists.sourceforge.net/lists/listinfo/ipmitool-cvs
|
@ -3,7 +3,7 @@ dnl autoconf for ipmitool
|
||||
dnl
|
||||
AC_INIT([src/ipmitool.c])
|
||||
AC_CANONICAL_SYSTEM
|
||||
AM_INIT_AUTOMAKE([ipmitool], [1.8.12])
|
||||
AM_INIT_AUTOMAKE([ipmitool], [1.8.14-cvs])
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_SRCDIR([src/ipmitool.c])
|
||||
AC_PREREQ(2.50)
|
||||
@ -29,29 +29,42 @@ AC_C_BIGENDIAN
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_SELECT_ARGTYPES
|
||||
AC_FUNC_STRTOD
|
||||
AC_CHECK_FUNCS([alarm gethostbyname socket select])
|
||||
AC_CHECK_FUNCS([alarm gethostbyname getaddrinfo getifaddrs socket select])
|
||||
AC_CHECK_FUNCS([memmove memset strchr strdup strerror])
|
||||
AC_CHECK_FUNCS([getpassphrase])
|
||||
|
||||
CFLAGS="$CFLAGS -fno-strict-aliasing -Wreturn-type -Wno-unused-result -Wno-packed-bitfield-compat"
|
||||
CFLAGS="$CFLAGS -fno-strict-aliasing -Wreturn-type"
|
||||
|
||||
AM_PROG_LIBTOOL
|
||||
LIBTOOL="$LIBTOOL --silent"
|
||||
|
||||
AC_SEARCH_LIBS([gethostbyname], [nsl])
|
||||
AC_SEARCH_LIBS([getaddrinfo], [nsl])
|
||||
AC_SEARCH_LIBS([getifaddrs], [nsl])
|
||||
AC_SEARCH_LIBS([socket], [socket], [],
|
||||
[AC_CHECK_LIB([nsl], [socket],
|
||||
[LIBS="$LIBS -lsocket -lnsl"], [], [-lsocket])])
|
||||
|
||||
if test "x$prefix" = "xNONE"; then
|
||||
prefix="$ac_default_prefix"
|
||||
prefix="$ac_default_prefix"
|
||||
fi
|
||||
|
||||
if test "x$exec_prefix" = "xNONE"; then
|
||||
exec_prefix="$prefix"
|
||||
exec_prefix="$prefix"
|
||||
fi
|
||||
|
||||
enable_all_options=yes
|
||||
dnl
|
||||
dnl set default option values
|
||||
dnl
|
||||
|
||||
xenable_intf_bmc=no
|
||||
xenable_intf_imb=yes
|
||||
xenable_intf_open=yes
|
||||
xenable_intf_lipmi=yes
|
||||
#xenable_intf_serial=yes
|
||||
xenable_intf_dummy=no
|
||||
xenable_all_options=yes
|
||||
xenable_ipmishell=yes
|
||||
|
||||
dnl set some things so we build with GNU tools on Solaris
|
||||
case "$host_os" in
|
||||
@ -61,46 +74,45 @@ solaris*)
|
||||
LD=gld
|
||||
AR=gar
|
||||
# openssl libs are in /usr/sfw/lib on solaris 10
|
||||
LIBS="$LIBS -R/usr/sfw/lib"
|
||||
LIBS="$LIBS -R/usr/sfw/lib"
|
||||
# disable the linux-specific interfaces
|
||||
# and bmc on SPARC (there is no bmc driver for SPARC)
|
||||
if [[ `mach -p` = sparc ]]; then
|
||||
enable_intf_bmc=no
|
||||
else
|
||||
enable_intf_bmc=yes
|
||||
fi
|
||||
enable_intf_imb=no
|
||||
enable_intf_open=no
|
||||
enable_intf_lipmi=no
|
||||
enable_ipmishell=no
|
||||
enable_all_options=no
|
||||
xenable_intf_bmc=yes
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_open=no
|
||||
xenable_intf_lipmi=no
|
||||
xenable_ipmishell=no
|
||||
xenable_all_options=no
|
||||
;;
|
||||
*cygwin*)
|
||||
# disable the linux and solaris-specific interfaces
|
||||
enable_intf_imb=no
|
||||
enable_intf_open=no
|
||||
enable_intf_lipmi=no
|
||||
enable_intf_bmc=no
|
||||
enable_ipmishell=no
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_open=no
|
||||
xenable_intf_lipmi=no
|
||||
xenable_intf_bmc=no
|
||||
;;
|
||||
*darwin*|aix*)
|
||||
# disable the linux and solaris-specific interfaces
|
||||
enable_intf_imb=no
|
||||
enable_intf_open=no
|
||||
enable_intf_lipmi=no
|
||||
enable_intf_bmc=no
|
||||
enable_ipmishell=no
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_open=no
|
||||
xenable_intf_lipmi=no
|
||||
xenable_intf_bmc=no
|
||||
xenable_ipmishell=no
|
||||
;;
|
||||
*freebsd*)
|
||||
enable_intf_imb=no
|
||||
enable_intf_lipmi=no
|
||||
enable_intf_bmc=no
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_lipmi=no
|
||||
xenable_intf_bmc=no
|
||||
;;
|
||||
*netbsd*)
|
||||
enable_intf_imb=no
|
||||
enable_intf_lipmi=no
|
||||
enable_intf_bmc=no
|
||||
enable_intf_open=no
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_lipmi=no
|
||||
xenable_intf_bmc=no
|
||||
xenable_intf_open=no
|
||||
;;
|
||||
gnu*)
|
||||
# disable the linux and solaris-specific interfaces on Hurd
|
||||
xenable_intf_imb=no
|
||||
xenable_intf_open=no
|
||||
;;
|
||||
esac
|
||||
|
||||
@ -113,78 +125,102 @@ dnl allow solaris builds to include all options
|
||||
AC_ARG_ENABLE([solaris-opt],
|
||||
[AC_HELP_STRING([--enable-solaris-opt],
|
||||
[enable all options for Solaris [default=no]])],
|
||||
[], [enable_solaris_opt=no])
|
||||
if test "x$enable_all_options" = "xyes" || test "x$enable_solaris_opt" = "xyes"; then
|
||||
AC_DEFINE(ENABLE_ALL_OPTIONS, [1], [Define to 1 to enable all command line options.])
|
||||
[xenable_solaris_opt=$enableval],
|
||||
[xenable_solaris_opt=no])
|
||||
if test "x$xenable_all_options" = "xyes" || test "x$xenable_solaris_opt" = "xyes"; then
|
||||
AC_DEFINE(ENABLE_ALL_OPTIONS, [1], [Define to 1 to enable all command line options.])
|
||||
fi
|
||||
|
||||
dnl check for OpenSSL functionality
|
||||
AC_ARG_ENABLE([internal-md5],
|
||||
[AC_HELP_STRING([--enable-internal-md5],
|
||||
[enable internal MD5 library [default=no]])],
|
||||
[], [enable_internal_md5=no])
|
||||
[xenable_internal_md5=$enableval],
|
||||
[xenable_internal_md5=no])
|
||||
|
||||
AC_CHECK_LIB([crypto], [EVP_aes_128_cbc],
|
||||
[if test "x$enable_internal_md5" != "xyes"; then
|
||||
[if test "x$xenable_internal_md5" != "xyes"; then
|
||||
have_crypto=yes; LIBS="$LIBS -lcrypto"
|
||||
fi], [have_crypto=no], [-lcrypto])
|
||||
fi],
|
||||
[have_crypto=no], [-lcrypto])
|
||||
|
||||
AC_CHECK_LIB([crypto], [MD5_Init],
|
||||
[if test "x$enable_internal_md5" != "xyes"; then
|
||||
[if test "x$xenable_internal_md5" != "xyes"; then
|
||||
if test "x$have_crypto" != "xyes"; then
|
||||
LIBS="$LIBS -lcrypto"
|
||||
have_md5=yes
|
||||
LIBS="$LIBS -lcrypto"
|
||||
have_md5=yes
|
||||
fi
|
||||
AC_DEFINE(HAVE_CRYPTO_MD5, [1], [Define to 1 if libcrypto supports MD5.])
|
||||
fi], [], [-lcrypto])
|
||||
fi],
|
||||
[], [-lcrypto])
|
||||
|
||||
AC_CHECK_LIB([crypto], [MD2_Init],
|
||||
[if test "x$enable_internal_md5" != "xyes"; then
|
||||
[if test "x$xenable_internal_md5" != "xyes"; then
|
||||
if test "x$have_crypto" != "xyes" && test "x$have_md5" != "xyes"; then
|
||||
LIBS="$LIBS -lcrypto"
|
||||
have_md2=yes
|
||||
fi
|
||||
AC_DEFINE(HAVE_CRYPTO_MD2, [1], [Define to 1 if libcrypto supports MD2.])
|
||||
fi], [], [-lcrypto])
|
||||
fi],
|
||||
[], [-lcrypto])
|
||||
|
||||
dnl enable IPMIv1.5 LAN interface
|
||||
AC_ARG_ENABLE([intf-lan],
|
||||
[AC_HELP_STRING([--enable-intf-lan],
|
||||
[enable IPMIv1.5 LAN interface [default=yes]])],
|
||||
[], [enable_intf_lan=yes])
|
||||
if test "x$enable_intf_lan" = "xstatic" || test "x$enable_intf_lan" = "xplugin"; then
|
||||
enable_intf_lan=yes
|
||||
[xenable_intf_lan=$enableval],
|
||||
[xenable_intf_lan=yes])
|
||||
if test "x$xenable_intf_lan" = "xstatic" || test "x$xenable_intf_lan" = "xplugin"; then
|
||||
xenable_intf_lan=yes
|
||||
fi
|
||||
if test "x$enable_intf_lan" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LAN, [1], [Define to 1 to enable LAN IPMIv1.5 interface.])
|
||||
AC_SUBST(INTF_LAN, [lan])
|
||||
AC_SUBST(INTF_LAN_LIB, [libintf_lan.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lan/libintf_lan.la"
|
||||
if test "x$xenable_intf_lan" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LAN, [1], [Define to 1 to enable LAN IPMIv1.5 interface.])
|
||||
AC_SUBST(INTF_LAN, [lan])
|
||||
AC_SUBST(INTF_LAN_LIB, [libintf_lan.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lan/libintf_lan.la"
|
||||
fi
|
||||
|
||||
dnl enable IPMIv2.0 RMCP+ LAN interface
|
||||
AC_ARG_ENABLE([intf-lanplus],
|
||||
[AC_HELP_STRING([--enable-intf-lanplus],
|
||||
[enable IPMIv2.0 RMCP+ LAN interface [default=auto]])],
|
||||
[if test "x$enable_intf_lanplus" != "xno" && test "x$have_crypto" != "xyes"; then
|
||||
echo "** The lanplus interface requires an SSL library with EVP_aes_128_cbc defined."
|
||||
enable_intf_lanplus=no
|
||||
fi],
|
||||
[enable_intf_lanplus=$have_crypto])
|
||||
if test "x$enable_intf_lanplus" = "xstatic" || test "x$enable_intf_lanplus" = "xplugin"; then
|
||||
enable_intf_lanplus=yes
|
||||
[xenable_intf_lanplus=$enableval],
|
||||
[xenable_intf_lanplus=$have_crypto])
|
||||
if test "x$xenable_intf_lanplus" = "xstatic" || test "x$xenable_intf_lanplus" = "xplugin"; then
|
||||
xenable_intf_lanplus=yes
|
||||
fi
|
||||
if test "x$enable_intf_lanplus" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LANPLUS, [1], [Define to 1 to enable LAN+ IPMIv2 interface.])
|
||||
AC_SUBST(INTF_LANPLUS, [lanplus])
|
||||
AC_SUBST(INTF_LANPLUS_LIB, [libintf_lanplus.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lanplus/libintf_lanplus.la"
|
||||
if test "x$xenable_intf_lanplus" != "xno" && test "x$have_crypto" != "xyes"; then
|
||||
echo "** The lanplus interface requires an SSL library with EVP_aes_128_cbc defined."
|
||||
xenable_intf_lanplus=no
|
||||
fi
|
||||
if test "x$xenable_intf_lanplus" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LANPLUS, [1], [Define to 1 to enable LAN+ IPMIv2 interface.])
|
||||
AC_SUBST(INTF_LANPLUS, [lanplus])
|
||||
AC_SUBST(INTF_LANPLUS_LIB, [libintf_lanplus.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lanplus/libintf_lanplus.la"
|
||||
else
|
||||
enable_intf_lanplus=no
|
||||
xenable_intf_lanplus=no
|
||||
fi
|
||||
|
||||
ORIG_CPPFLAGS=$CPPFLAGS
|
||||
|
||||
dnl enable serial interface
|
||||
AC_ARG_ENABLE([intf-serial],
|
||||
[AC_HELP_STRING([--enable-intf-serial],
|
||||
[enable direct Serial Basic/Terminal mode interface [default=yes]])],
|
||||
[xenable_intf_serial=$enableval], [xenable_intf_serial=yes])
|
||||
if test "x$enable_intf_serial" = "xstatic" || test "x$enable_intf_serial" = "xplugin"; then
|
||||
xenable_intf_serial=yes
|
||||
fi
|
||||
if test "x$xenable_intf_serial" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_SERIAL, [1], [Define to 1 to enable serial interface.])
|
||||
AC_SUBST(INTF_SERIAL, [serial])
|
||||
AC_SUBST(INTF_SERIAL_LIB, [libintf_serial.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB serial/libintf_serial.la"
|
||||
else
|
||||
xenable_intf_serial=no
|
||||
fi
|
||||
|
||||
dnl look for OpenIPMI header files
|
||||
AC_ARG_WITH([kerneldir],
|
||||
[AC_HELP_STRING([--with-kerneldir=DIR],
|
||||
@ -200,22 +236,33 @@ AC_ARG_WITH([kerneldir],
|
||||
kernelver=`grep UTS_RELEASE ${with_kerneldir}/include/linux/version.h | \
|
||||
sed 's/^\#define UTS_RELEASE \"\(2\.[0-9]\)\..*/\1/'`
|
||||
if test "x$kernelver" = "x2.6"; then
|
||||
CPPFLAGS="$CPPFLAGS -D__user="
|
||||
AC_SUBST(CPPFLAGS)
|
||||
CPPFLAGS="$CPPFLAGS -D__user="
|
||||
AC_SUBST(CPPFLAGS)
|
||||
fi
|
||||
fi])
|
||||
|
||||
AH_TEMPLATE([HAVE_LINUX_COMPILER_H], [])
|
||||
AC_MSG_CHECKING([for linux/compiler.h])
|
||||
AC_PREPROC_IFELSE([#include <linux/compiler.h>],
|
||||
[AC_DEFINE(HAVE_LINUX_COMPILER_H, [1],
|
||||
[Define to 1 if you have the <linux/compiler.h> header file.])
|
||||
AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])])
|
||||
|
||||
m4_version_prereq([2.68],
|
||||
[AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <linux/compiler.h>]])],
|
||||
[AC_DEFINE(HAVE_LINUX_COMPILER_H, [1],
|
||||
[Define to 1 if you have the <linux/compiler.h> header file.])
|
||||
AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])])],
|
||||
[AC_PREPROC_IFELSE([#include <linux/compiler.h>],
|
||||
[AC_DEFINE(HAVE_LINUX_COMPILER_H, [1],
|
||||
[Define to 1 if you have the <linux/compiler.h> header file.])
|
||||
AC_MSG_RESULT([yes])],
|
||||
[AC_MSG_RESULT([no])])])
|
||||
|
||||
CPPFLAGS=$ORIG_CPPFLAGS
|
||||
AC_SUBST(CPPFLAGS)
|
||||
|
||||
AC_CHECK_HEADER([sys/ioccom.h],
|
||||
[AC_DEFINE(HAVE_SYS_IOCCOM_H, [1],
|
||||
[Define to 1 if you have the <sys/ioccom.h> header file.])])
|
||||
|
||||
AC_CHECK_HEADER([linux/ipmi.h],
|
||||
[AC_DEFINE(HAVE_OPENIPMI_H, [1],
|
||||
[Define to 1 if you have the <linux/ipmi.h> header file.])],
|
||||
@ -227,20 +274,21 @@ AC_CHECK_HEADER([linux/ipmi.h],
|
||||
dnl look for FreeIPMI files
|
||||
AC_CHECK_LIB(freeipmi, ipmi_open_inband, [have_free=yes], [have_free=no])
|
||||
if test "x$have_free" != "xyes"; then
|
||||
AC_CHECK_LIB(freeipmi, ipmi_ctx_open_inband, [have_free=yes], [have_free=no])
|
||||
AC_CHECK_LIB(freeipmi, ipmi_ctx_open_inband, [have_free=yes], [have_free=no])
|
||||
fi
|
||||
AC_ARG_ENABLE([intf-free],
|
||||
[AC_HELP_STRING([--enable-intf-free],
|
||||
[enable FreeIPMI IPMI interface [default=auto]])],
|
||||
[if test "x$enable_intf_free" != "xno" && test "x$have_free" != "xyes"; then
|
||||
echo "** Unable to build FreeIPMI interface support!"
|
||||
enable_intf_free=no
|
||||
fi],
|
||||
[enable_intf_free=$have_free])
|
||||
if test "x$enable_intf_free" = "xstatic" || test "x$enable_intf_free" = "xplugin"; then
|
||||
enable_intf_free=yes
|
||||
[AC_HELP_STRING([--enable-intf-free],
|
||||
[enable FreeIPMI IPMI interface [default=auto]])],
|
||||
[xenable_intf_free=$enableval],
|
||||
[xenable_intf_free=$have_free])
|
||||
if test "x$xenable_intf_free" = "xstatic" || test "x$xenable_intf_free" = "xplugin"; then
|
||||
xenable_intf_free=yes
|
||||
fi
|
||||
if test "x$enable_intf_free" = "xyes"; then
|
||||
if test "x$xenable_intf_free" != "xno" && test "x$have_free" != "xyes"; then
|
||||
echo "** Unable to build FreeIPMI interface support!"
|
||||
xenable_intf_free=no
|
||||
fi
|
||||
if test "x$xenable_intf_free" = "xyes"; then
|
||||
dnl Determine if you got the right FreeIPMI version
|
||||
AC_MSG_CHECKING([for libfreeipmi version 0.3.0])
|
||||
AC_TRY_COMPILE([
|
||||
@ -338,12 +386,13 @@ dnl Determine if you got the right FreeIPMI version
|
||||
AC_DEFINE(IPMI_INTF_FREE_0_6_0, [1], [Define to 1 for FreeIPMI 0.6.0.])
|
||||
fi
|
||||
else
|
||||
enable_intf_free=no
|
||||
xenable_intf_free=no
|
||||
fi
|
||||
|
||||
AC_CHECK_LIB(freeipmi,
|
||||
ipmi_cmd_raw_ipmb,
|
||||
AC_DEFINE(IPMI_INTF_FREE_BRIDGING, [1], [Define to 1 to enable FreeIPMI Bridging Support.]))
|
||||
ipmi_cmd_raw_ipmb,
|
||||
AC_DEFINE(IPMI_INTF_FREE_BRIDGING, [1],
|
||||
[Define to 1 to enable FreeIPMI Bridging Support.]))
|
||||
fi
|
||||
|
||||
dnl look for termios header file
|
||||
@ -370,15 +419,16 @@ dnl enable Linux OpenIPMI interface
|
||||
AC_ARG_ENABLE([intf-open],
|
||||
[AC_HELP_STRING([--enable-intf-open],
|
||||
[enable Linux OpenIPMI interface [default=auto]])],
|
||||
[], [enable_intf_open=yes])
|
||||
if test "x$enable_intf_open" = "xstatic" || test "x$enable_intf_open" = "xplugin"; then
|
||||
enable_intf_open=yes
|
||||
[xenable_intf_open=$enableval],
|
||||
[])
|
||||
if test "x$xenable_intf_open" = "xstatic" || test "x$xenable_intf_open" = "xplugin"; then
|
||||
xenable_intf_open=yes
|
||||
fi
|
||||
if test "x$enable_intf_open" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_OPEN, [1], [Define to 1 to enable Linux OpenIPMI interface.])
|
||||
AC_SUBST(INTF_OPEN, [open])
|
||||
AC_SUBST(INTF_OPEN_LIB, [libintf_open.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB open/libintf_open.la"
|
||||
if test "x$xenable_intf_open" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_OPEN, [1], [Define to 1 to enable Linux OpenIPMI interface.])
|
||||
AC_SUBST(INTF_OPEN, [open])
|
||||
AC_SUBST(INTF_OPEN_LIB, [libintf_open.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB open/libintf_open.la"
|
||||
|
||||
dnl Check for dual bridge support in OpenIPMI
|
||||
AC_MSG_CHECKING([for OpenIPMI dual bridge support])
|
||||
@ -412,15 +462,16 @@ dnl enable Intel IMB interface
|
||||
AC_ARG_ENABLE([intf-imb],
|
||||
[AC_HELP_STRING([--enable-intf-imb],
|
||||
[enable Intel IMB driver interface [default=auto]])],
|
||||
[], [enable_intf_imb=yes])
|
||||
if test "x$enable_intf_imb" = "xstatic" || test "x$enable_intf_imb" = "xplugin"; then
|
||||
enable_intf_imb=yes
|
||||
[xenable_intf_imb=$enableval],
|
||||
[])
|
||||
if test "x$xenable_intf_imb" = "xstatic" || test "x$xenable_intf_imb" = "xplugin"; then
|
||||
xenable_intf_imb=yes
|
||||
fi
|
||||
if test "x$enable_intf_imb" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_IMB, [1], [Define to 1 to enable Intel IMB interface.])
|
||||
AC_SUBST(INTF_IMB, [imb])
|
||||
AC_SUBST(INTF_IMB_LIB, [libintf_imb.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB imb/libintf_imb.la"
|
||||
if test "x$xenable_intf_imb" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_IMB, [1], [Define to 1 to enable Intel IMB interface.])
|
||||
AC_SUBST(INTF_IMB, [imb])
|
||||
AC_SUBST(INTF_IMB_LIB, [libintf_imb.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB imb/libintf_imb.la"
|
||||
fi
|
||||
|
||||
dnl enable Solaris LIPMI interface
|
||||
@ -428,44 +479,68 @@ AC_CHECK_HEADER([sys/lipmi/lipmi_intf.h], [have_lipmi=yes], [have_lipmi=no])
|
||||
AC_ARG_ENABLE([intf-lipmi],
|
||||
[AC_HELP_STRING([--enable-intf-lipmi],
|
||||
[enable Solaris 9 x86 IPMI interface [default=no]])],
|
||||
[if test "x$enable_intf_lipmi" != "xno" && test "x$have_lipmi" != "xyes"; then
|
||||
echo "** Unable to build Solaris 9 x86 IPMI interface support!"
|
||||
enable_intf_lipmi=no
|
||||
fi],
|
||||
[enable_intf_lipmi=no])
|
||||
if test "x$enable_intf_lipmi" = "xstatic" || test "x$enable_intf_lipmi" = "xplugin"; then
|
||||
enable_intf_lipmi=yes
|
||||
[xenable_intf_lipmi=$enableval],
|
||||
[])
|
||||
if test "x$xenable_intf_lipmi" = "xstatic" || test "x$xenable_intf_lipmi" = "xplugin"; then
|
||||
xenable_intf_lipmi=yes
|
||||
fi
|
||||
if test "x$enable_intf_lipmi" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LIPMI, [1], [Define to 1 to enable Solaris 9 LIPMI interface.])
|
||||
AC_SUBST(INTF_LIPMI, [lipmi])
|
||||
AC_SUBST(INTF_LIPMI_LIB, [libintf_lipmi.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lipmi/libintf_lipmi.la"
|
||||
if test "x$xenable_intf_lipmi" != "xno" && test "x$have_lipmi" != "xyes"; then
|
||||
echo "** Unable to build Solaris 9 x86 IPMI interface support!"
|
||||
xenable_intf_lipmi=no
|
||||
fi
|
||||
if test "x$xenable_intf_lipmi" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_LIPMI, [1], [Define to 1 to enable Solaris 9 LIPMI interface.])
|
||||
AC_SUBST(INTF_LIPMI, [lipmi])
|
||||
AC_SUBST(INTF_LIPMI_LIB, [libintf_lipmi.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lipmi/libintf_lipmi.la"
|
||||
fi
|
||||
|
||||
dnl enable Solaris BMC interface
|
||||
AC_ARG_ENABLE([intf-bmc],
|
||||
[AC_HELP_STRING([--enable-intf-bmc],
|
||||
[enable Solaris 10 x86 IPMI interface [default=auto]])],,
|
||||
[enable_intf_bmc=no])
|
||||
if test "x$enable_intf_bmc" = "xstatic" || test "x$enable_intf_bmc" = "xplugin"; then
|
||||
enable_intf_bmc=yes
|
||||
[enable Solaris 10 x86 IPMI interface [default=auto]])],
|
||||
[xenable_intf_bmc=$enableval],
|
||||
[xenable_intf_bmc=no])
|
||||
if test "x$xenable_intf_bmc" = "xstatic" || test "x$xenable_intf_bmc" = "xplugin"; then
|
||||
xenable_intf_bmc=yes
|
||||
fi
|
||||
if test "x$enable_intf_bmc" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_BMC, [1], [Define to 1 to enable Solaris 10 BMC interface.])
|
||||
AC_SUBST(INTF_BMC, [bmc])
|
||||
AC_SUBST(INTF_BMC_LIB, [libintf_bmc.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB bmc/libintf_bmc.la"
|
||||
if test "x$xenable_intf_bmc" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_BMC, [1], [Define to 1 to enable Solaris 10 BMC interface.])
|
||||
AC_SUBST(INTF_BMC, [bmc])
|
||||
AC_SUBST(INTF_BMC_LIB, [libintf_bmc.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB bmc/libintf_bmc.la"
|
||||
fi
|
||||
|
||||
dnl enable Dummy interface for testing
|
||||
AC_ARG_ENABLE([intf-dummy],
|
||||
[AC_HELP_STRING([--enable-intf-dummy],
|
||||
[enable Dummy(test) interface [default=no]])],
|
||||
[xenable_intf_dummy=$enableval], [xenable_intf_dummy=no])
|
||||
if test "x$xenable_intf_dummy" = "xyes"; then
|
||||
AC_DEFINE(IPMI_INTF_DUMMY, [1], [Define to 1 to enable Dummy interface.])
|
||||
AC_SUBST(INTF_DUMMY, [dummy])
|
||||
AC_SUBST(INTF_DUMMY_LIB, [libintf_dummy.la])
|
||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB dummy/libintf_dummy.la"
|
||||
fi
|
||||
|
||||
AC_SUBST(IPMITOOL_INTF_LIB)
|
||||
|
||||
if test "x$xenable_ipmishell" = "xyes"; then
|
||||
AC_SEARCH_LIBS([tgetent], [tinfo ncurses curses readline termcap])
|
||||
AC_SEARCH_LIBS([initscr], [ncurses curses], [have_curses=yes])
|
||||
AC_SEARCH_LIBS([readline], [readline edit], [have_readline=yes])
|
||||
if test "x$have_curses" != "xyes" || test "x$have_readline" != "xyes"; then
|
||||
xenable_ipmishell=no
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl check for readline library to enable ipmi shell
|
||||
AC_ARG_ENABLE([ipmishell],
|
||||
[AC_HELP_STRING([--enable-ipmishell],
|
||||
[enable IPMI shell interface [default=yes]])],
|
||||
[], [enable_ipmishell=yes])
|
||||
if test "x$enable_ipmishell" = "xyes"; then
|
||||
[enable IPMI shell interface [default=auto]])],
|
||||
[xenable_ipmishell=$enableval],
|
||||
[])
|
||||
if test "x$xenable_ipmishell" = "xyes"; then
|
||||
AC_SEARCH_LIBS([tgetent], [tinfo ncurses curses readline termcap])
|
||||
AC_SEARCH_LIBS([initscr], [ncurses curses], [have_curses=yes])
|
||||
AC_SEARCH_LIBS([readline], [readline edit], [have_readline=yes])
|
||||
@ -482,22 +557,25 @@ dnl Enable -Wall -Werror
|
||||
AC_ARG_ENABLE([buildcheck],
|
||||
[AC_HELP_STRING([--enable-buildcheck],
|
||||
[enable -Wall -Werror for build testing [default=no]])],
|
||||
[if test "x$enable_buildcheck" != "xno"; then
|
||||
CFLAGS="$CFLAGS -Wall -Werror -Wpointer-arith -Wstrict-prototypes"
|
||||
fi], [])
|
||||
|
||||
[xenable_buildcheck=$enableval],
|
||||
[xenable_buildcheck=no])
|
||||
if test "x$xenable_buildcheck" != "xno"; then
|
||||
CFLAGS="$CFLAGS -Wall -Werror -Wpointer-arith -Wstrict-prototypes"
|
||||
fi
|
||||
AC_SUBST(CFLAGS)
|
||||
|
||||
dnl Enable extra file security paranoia
|
||||
AC_ARG_ENABLE([file-security],
|
||||
[AC_HELP_STRING([--enable-file-security],
|
||||
[enable extra security checks on files opened for read [default=no]])],
|
||||
[if test "x$enable_file_security" != "xno"; then
|
||||
AC_DEFINE(ENABLE_FILE_SECURITY, [1], [Define to 1 for extra file security.])
|
||||
fi], [])
|
||||
[xenable_file_security=$enableval],
|
||||
[xenable_file_security=no])
|
||||
if test "x$xenable_file_security" != "xno"; then
|
||||
AC_DEFINE(ENABLE_FILE_SECURITY, [1], [Define to 1 for extra file security.])
|
||||
fi
|
||||
|
||||
|
||||
AC_TRY_RUN([
|
||||
AC_TRY_COMPILE([],[
|
||||
#include <stdio.h>
|
||||
|
||||
struct packstruct {
|
||||
@ -516,7 +594,10 @@ AC_TRY_RUN([
|
||||
else
|
||||
return(0);
|
||||
}
|
||||
],[],[AC_DEFINE(HAVE_PRAGMA_PACK,[1],[Define to 1 if you need to use #pragma pack instead of __attribute__ ((packed))])]
|
||||
],
|
||||
[],
|
||||
[AC_DEFINE(HAVE_PRAGMA_PACK,[1],
|
||||
[Define to 1 if you need to use #pragma pack instead of __attribute__ ((packed))])]
|
||||
)
|
||||
|
||||
|
||||
@ -535,12 +616,14 @@ AC_CONFIG_FILES([Makefile
|
||||
src/Makefile
|
||||
src/plugins/Makefile
|
||||
src/plugins/lan/Makefile
|
||||
src/plugins/lanplus/Makefile
|
||||
src/plugins/lanplus/Makefile
|
||||
src/plugins/open/Makefile
|
||||
src/plugins/free/Makefile
|
||||
src/plugins/free/Makefile
|
||||
src/plugins/imb/Makefile
|
||||
src/plugins/bmc/Makefile
|
||||
src/plugins/lipmi/Makefile])
|
||||
src/plugins/lipmi/Makefile
|
||||
src/plugins/serial/Makefile
|
||||
src/plugins/dummy/Makefile])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
@ -548,16 +631,18 @@ AC_MSG_RESULT([])
|
||||
AC_MSG_RESULT([ipmitool $VERSION])
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_RESULT([Interfaces])
|
||||
AC_MSG_RESULT([ lan : $enable_intf_lan])
|
||||
AC_MSG_RESULT([ lanplus : $enable_intf_lanplus])
|
||||
AC_MSG_RESULT([ open : $enable_intf_open])
|
||||
AC_MSG_RESULT([ free : $enable_intf_free])
|
||||
AC_MSG_RESULT([ imb : $enable_intf_imb])
|
||||
AC_MSG_RESULT([ bmc : $enable_intf_bmc])
|
||||
AC_MSG_RESULT([ lipmi : $enable_intf_lipmi])
|
||||
AC_MSG_RESULT([ lan : $xenable_intf_lan])
|
||||
AC_MSG_RESULT([ lanplus : $xenable_intf_lanplus])
|
||||
AC_MSG_RESULT([ open : $xenable_intf_open])
|
||||
AC_MSG_RESULT([ free : $xenable_intf_free])
|
||||
AC_MSG_RESULT([ imb : $xenable_intf_imb])
|
||||
AC_MSG_RESULT([ bmc : $xenable_intf_bmc])
|
||||
AC_MSG_RESULT([ lipmi : $xenable_intf_lipmi])
|
||||
AC_MSG_RESULT([ serial : $xenable_intf_serial])
|
||||
AC_MSG_RESULT([ dummy : $xenable_intf_dummy])
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_RESULT([Extra tools])
|
||||
AC_MSG_RESULT([ ipmievd : yes])
|
||||
AC_MSG_RESULT([ ipmishell : $enable_ipmishell])
|
||||
AC_MSG_RESULT([ ipmishell : $xenable_ipmishell])
|
||||
AC_MSG_RESULT([])
|
||||
|
@ -34,6 +34,8 @@ dist_pkgdata_DATA = oem_ibm_sel_map
|
||||
|
||||
EXTRA_DIST = README \
|
||||
bmclanconf ipmi.init.basic ipmi.init.redhat \
|
||||
exchange-bmc-os-info.init.redhat exchange-bmc-os-info.service.redhat \
|
||||
exchange-bmc-os-info.sysconf \
|
||||
ipmievd.init.redhat ipmievd.init.suse ipmievd.init.debian \
|
||||
collect_data.sh create_rrds.sh create_webpage_compact.sh create_webpage.sh
|
||||
|
||||
collect_data.sh create_rrds.sh create_webpage_compact.sh create_webpage.sh \
|
||||
bmc-snmp-proxy bmc-snmp-proxy.service bmc-snmp-proxy.sysconf
|
381
contrib/bmc-snmp-proxy
Normal file
381
contrib/bmc-snmp-proxy
Normal file
@ -0,0 +1,381 @@
|
||||
#!/bin/sh
|
||||
#############################################################################
|
||||
#
|
||||
# bmc-snmp-proxy: Set SNMP proxy to BMC (Baseboard Management Controller)
|
||||
#
|
||||
# version: 0.6
|
||||
#
|
||||
# Authors: Charles Rose <charles_rose@dell.com>
|
||||
# Jordan Hargrave <jordan_hargrave@dell.com>
|
||||
#
|
||||
# Description: Script to set snmp proxy to the BMC for certain OID
|
||||
# See here for details:
|
||||
# https://fedoraproject.org/wiki/Features/AgentFreeManagement
|
||||
#
|
||||
# Assumptions: This script will work only when /etc/snmp/ is writable.
|
||||
#
|
||||
#############################################################################
|
||||
# GLOBALS
|
||||
#############################################################################
|
||||
SYSCONF_DIR="/etc/sysconfig"
|
||||
CONFIG="${SYSCONF_DIR}/bmc-snmp-proxy"
|
||||
|
||||
SNMPD_LOCAL_CONF_DIR="/etc/snmp/bmc"
|
||||
SNMPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmpd.local.conf"
|
||||
TRAPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmptrapd.local.conf"
|
||||
|
||||
TRAPD_CONF="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
LOCKFILE="/var/lock/subsys/bmc-snmp-proxy"
|
||||
BMC_INFO="/var/run/bmc-info"
|
||||
|
||||
IPMITOOL=`which ipmitool`
|
||||
|
||||
#Default config
|
||||
BMC_COMMUNITY="public"
|
||||
BMC_OID=".1.3.6.1.4.1.674.10892.2" # Dell iDRAC
|
||||
TRAP_FORWARD="no"
|
||||
RELOAD_SERVICES="yes"
|
||||
|
||||
#############################################################################
|
||||
|
||||
#TODO: Use inotify and daemonize when $BMC_INFO changes
|
||||
|
||||
# source config
|
||||
[ -r ${CONFIG} ] && . ${CONFIG}
|
||||
|
||||
. gettext.sh
|
||||
|
||||
SCRIPT_NAME=$(basename $0)
|
||||
RETVAL=0
|
||||
|
||||
# Check if bmc-info created by exchange-bmc-os-info
|
||||
bmc_info_exists()
|
||||
{
|
||||
if [ -r "${BMC_INFO}" ]; then
|
||||
. ${BMC_INFO}
|
||||
else
|
||||
RETVAL=2
|
||||
fi
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
check_snmp()
|
||||
{
|
||||
if [ ! -d /etc/snmp ] && [ ! -x /usr/sbin/snmpd ]; then
|
||||
RETVAL=12
|
||||
fi
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# configure SNMP proxy
|
||||
#############################################################################
|
||||
write_snmp_conf()
|
||||
{
|
||||
# SNMPv3 security: bmcview, bmc_ctx, bmc_sec, bmc_grp, bmc_cmty
|
||||
printf "###############################################\n"
|
||||
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
||||
printf "###############################################\n"
|
||||
printf "view bmcview included %s 80\n" "${BMC_OID}"
|
||||
printf "com2sec -Cn bmc_ctx bmc_sec default bmc_cmty\n"
|
||||
printf "group bmc_grp v1 bmc_sec\n"
|
||||
printf "access bmc_grp bmc_ctx any noauth exact bmcview none none\n"
|
||||
printf "proxy -Cn bmc_ctx -v 1 %s\n" "${PROXY_TOKEN}"
|
||||
printf "###############################################\n"
|
||||
}
|
||||
|
||||
valid_ip()
|
||||
{
|
||||
#Thanks to mkyong.com
|
||||
octet="([01]?[[:digit:]][[:digit:]]?|2[0-4][[:digit:]]|25[0-5])"
|
||||
|
||||
printf -- "%s" "${1}"| grep -Eq \
|
||||
"^${octet}\\.${octet}\\.${octet}\\.${octet}$"
|
||||
return $?
|
||||
}
|
||||
|
||||
check_vars()
|
||||
{
|
||||
[ -z ${BMC_COMMUNITY} ] && BMC_COMMUNITY="public"
|
||||
[ -z ${BMC_OID} ] && return 1
|
||||
|
||||
if [ -n "${BMC_IPv4}" ] && valid_ip ${BMC_IPv4}; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
set_snmp_proxy()
|
||||
{
|
||||
if check_vars; then
|
||||
PROXY_TOKEN="-c ${BMC_COMMUNITY} ${BMC_IPv4} ${BMC_OID}"
|
||||
|
||||
if [ ! -d ${SNMPD_LOCAL_CONF_DIR} ] && \
|
||||
mkdir ${SNMPD_LOCAL_CONF_DIR}; then
|
||||
write_snmp_conf > ${SNMPD_LOCAL_CONF}
|
||||
[ $? -ne 0 ] && RETVAL=4
|
||||
fi
|
||||
else
|
||||
RETVAL=3
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
set_snmpd_conf_path()
|
||||
{
|
||||
for SYSCONF in ${SYSCONF_DIR}/snmp*d;
|
||||
do
|
||||
if grep -q "${SNMPD_LOCAL_CONF_DIR}" "${SYSCONF}" > \
|
||||
/dev/null 2>&1; then
|
||||
continue
|
||||
else
|
||||
printf "SNMPCONFPATH=%s\n" "${SNMPD_LOCAL_CONF_DIR}" \
|
||||
>> ${SYSCONF} || RETVAL=7
|
||||
fi
|
||||
done
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
disable_snmp_proxy()
|
||||
{
|
||||
if [ -f ${SNMPD_LOCAL_CONF} ]; then
|
||||
rm -f ${SNMPD_LOCAL_CONF}
|
||||
[ $? -ne 0 ] && RETVAL=5
|
||||
fi
|
||||
}
|
||||
#############################################################################
|
||||
# Trap Forwarding
|
||||
#############################################################################
|
||||
|
||||
pick_alert_dest()
|
||||
{
|
||||
test_ip="$1"
|
||||
for ALERT_DEST in `seq 1 4`
|
||||
do
|
||||
temp_ip=$(${IPMITOOL} lan alert print ${CHANNEL} ${ALERT_DEST}\
|
||||
2>/dev/null| sed -n "s#^Alert IP Address.*: ##p")
|
||||
|
||||
[ "${temp_ip}" = "${test_ip}" ] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
set_alert_dest_ip()
|
||||
{
|
||||
${IPMITOOL} lan alert set ${CHANNEL} ${ALERT_DEST} ipaddr ${1} \
|
||||
retry 4 type pet >/dev/null 2>&1
|
||||
[ $? -ne 0 ] && RETVAL=8
|
||||
}
|
||||
|
||||
bmc_alert_dest()
|
||||
{
|
||||
# Pick the first active LAN channel
|
||||
for CHANNEL in `seq 1 14`
|
||||
do
|
||||
[ $(${IPMITOOL} -I open channel info ${CHANNEL} 2>/dev/null \
|
||||
| grep -q "802\.3") ] || break
|
||||
done
|
||||
|
||||
# If TRAPD_IP is already set as an alert dest,
|
||||
if pick_alert_dest "${TRAPD_IP}"; then
|
||||
# reset: reset it if we are called with reset
|
||||
[ "${1}" = "reset" ] && \
|
||||
set_alert_dest_ip "0.0.0.0"
|
||||
# else, find the next free alert dest,
|
||||
elif pick_alert_dest "0.0.0.0"; then
|
||||
[ "${1}" = "reset" ] && \
|
||||
return $RETVAL
|
||||
# set: the TRAPD_IP
|
||||
set_alert_dest_ip "${TRAPD_IP}"
|
||||
else
|
||||
# No free alert destinations
|
||||
RETVAL=9
|
||||
fi
|
||||
return $RETVAL
|
||||
}
|
||||
|
||||
set_ipmi_alert()
|
||||
{
|
||||
${IPMITOOL} lan set ${CHANNEL} alert "${1}" >/dev/null 2>&1
|
||||
[ $? -ne 0 ] && RETVAL=10
|
||||
}
|
||||
|
||||
get_host_ip()
|
||||
{
|
||||
# Get host's IP that the BMC can reach.
|
||||
IFACE=$(/usr/sbin/ip -o -f inet address |awk '!/: lo/ {print $2}')
|
||||
for dev in ${IFACE}
|
||||
do
|
||||
ping -c 1 -I ${dev} ${BMC_IPv4} > /dev/null 2>&1
|
||||
done
|
||||
}
|
||||
|
||||
config_bmc_alert()
|
||||
{
|
||||
# Get Host's IP that the BMC can send traps to
|
||||
TRAPD_IP=$(get_host_ip)
|
||||
|
||||
# Set Host's IP as the alert destination in the BMC
|
||||
valid_ip ${TRAPD_IP} && bmc_alert_dest "${ACTION}"
|
||||
|
||||
# Enable alerting on the LAN channel
|
||||
[ $RETVAL -eq 0 ] && set_ipmi_alert "${ACTION}"
|
||||
}
|
||||
|
||||
write_trapd_conf()
|
||||
{
|
||||
printf "###############################################\n"
|
||||
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
||||
printf "forward %s %s\n" "${BMC_OID}*" "${FORWARD_HOST}"
|
||||
printf "###############################################\n"
|
||||
}
|
||||
|
||||
config_trapd()
|
||||
{
|
||||
# Proceed only if snmptrapd is available on the system
|
||||
if [ -f ${TRAPD_CONF} ]; then
|
||||
write_trapd_conf > ${TRAPD_LOCAL_CONF}
|
||||
[ $? -ne 0 ] && RETVAL=11
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
trap_sink_exists()
|
||||
{
|
||||
# TODO: We only set the first match. We should be able to set
|
||||
# multiple
|
||||
FORWARD_HOST=$(awk '/^trap.*sink/{print $2}; /^informsink/{print $2}' \
|
||||
/etc/snmp/snmpd*conf | head -1)
|
||||
if [ -z "${FORWARD_HOST}" ]; then
|
||||
# there is no trapsink setup.
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Forward SNMP traps from the BMC to trapsink.
|
||||
trap_forward()
|
||||
{
|
||||
NO_TRAP=0
|
||||
ACTION=${1} # set or reset
|
||||
|
||||
if [ "${ACTION}" = "set" ]; then
|
||||
# Get trapd config,
|
||||
if trap_sink_exists; then
|
||||
config_trapd && config_bmc_alert
|
||||
else
|
||||
# exit silently if there is no sink
|
||||
NO_TRAP=1
|
||||
fi
|
||||
else
|
||||
if [ -f ${TRAPD_LOCAL_CONF} ]; then
|
||||
rm -f ${TRAPD_LOCAL_CONF} >/dev/null 2>&1
|
||||
else
|
||||
NO_TRAP=1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
service_reload()
|
||||
{
|
||||
#TODO: do this in systemd
|
||||
if [ ${RETVAL} -eq 0 ] && [ "${RELOAD_SERVICES}" = "yes" ]; then
|
||||
service $1 reload
|
||||
[ $? -ne 0 ] && RETVAL=6
|
||||
fi
|
||||
return
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
start()
|
||||
{
|
||||
if bmc_info_exists && check_snmp; then
|
||||
touch ${LOCKFILE}
|
||||
set_snmpd_conf_path && set_snmp_proxy
|
||||
[ $RETVAL -eq 0 ] && service_reload snmpd
|
||||
|
||||
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
||||
trap_forward "set"
|
||||
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
||||
service_reload snmptrapd
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
stop()
|
||||
{
|
||||
[ ! -f ${LOCKFILE} ] && return
|
||||
if bmc_info_exists && check_snmp; then
|
||||
disable_snmp_proxy
|
||||
[ $RETVAL -eq 0 ] && service_reload snmpd
|
||||
|
||||
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
||||
trap_forward "reset"
|
||||
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
||||
service_reload snmptrapd
|
||||
fi
|
||||
rm -f ${LOCKFILE}
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
status()
|
||||
{
|
||||
eval_gettext "${SCRIPT_NAME}: snmp proxy to BMC is "
|
||||
# Checking for lockfile is better.
|
||||
#if grep -q "^proxy" "${SNMPD_LOCAL_CONF}" > /dev/null 2>&1 ; then
|
||||
if [ -f ${LOCKFILE} ]; then
|
||||
eval_gettext "set"
|
||||
else
|
||||
eval_gettext "not set"
|
||||
fi
|
||||
echo
|
||||
RETVAL=0
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
usage()
|
||||
{
|
||||
eval_gettext "Usage: $0 {start|stop|status}"; echo 1>&2
|
||||
RETVAL=1
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# MAIN
|
||||
#############################################################################
|
||||
case "$1" in
|
||||
start) start ;;
|
||||
stop) stop ;;
|
||||
status) status ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
|
||||
case "$RETVAL" in
|
||||
0|1) ;;
|
||||
2) eval_gettext "${SCRIPT_NAME}: failed to read ${BMC_INFO} " 1>&2 ;;
|
||||
3) eval_gettext "${SCRIPT_NAME}: failed to get proxy config." 1>&2 ;;
|
||||
4) eval_gettext "${SCRIPT_NAME}: failed to set ${SNMPD_LOCAL_CONF}." 1>&2 ;;
|
||||
5) eval_gettext "${SCRIPT_NAME}: failed to disable snmp proxy." 1>&2 ;;
|
||||
6) eval_gettext "${SCRIPT_NAME}: failed to reload snmpd." 1>&2 ;;
|
||||
7) eval_gettext "${SCRIPT_NAME}: failed to update ${SYSCONF}." 1>&2 ;;
|
||||
8) eval_gettext "${SCRIPT_NAME}: failed to set IPMI alert dest." 1>&2 ;;
|
||||
9) eval_gettext "${SCRIPT_NAME}: no free IPMI alert dest." 1>&2 ;;
|
||||
10) eval_gettext "${SCRIPT_NAME}: failed to set IPMI PEF." 1>&2 ;;
|
||||
11) eval_gettext "${SCRIPT_NAME}: failed to write snmptrapd.conf." 1>&2 ;;
|
||||
12) eval_gettext "${SCRIPT_NAME}: snmpd not found." 1>&2 ;;
|
||||
*) eval_gettext "${SCRIPT_NAME}: unknown error." 1>&2 ;;
|
||||
esac
|
||||
|
||||
if [ ${RETVAL} -gt 1 ]; then
|
||||
eval_gettext " Return code: ${RETVAL}"; echo
|
||||
fi
|
||||
exit ${RETVAL}
|
||||
#############################################################################
|
||||
# end of file
|
||||
#############################################################################
|
18
contrib/bmc-snmp-proxy.service
Normal file
18
contrib/bmc-snmp-proxy.service
Normal file
@ -0,0 +1,18 @@
|
||||
[Unit]
|
||||
Description=Setup SNMP proxy to BMC
|
||||
|
||||
After=exchange-bmc-os-info.service
|
||||
Requires=exchange-bmc-os-info.service
|
||||
PartOf=exchange-bmc-os-info.service
|
||||
|
||||
ConditionPathExists=/var/run/bmc-info
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
|
||||
ExecStart=/usr/libexec/bmc-snmp-proxy start
|
||||
ExecStop=/usr/libexec/bmc-snmp-proxy stop
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
48
contrib/bmc-snmp-proxy.sysconf
Normal file
48
contrib/bmc-snmp-proxy.sysconf
Normal file
@ -0,0 +1,48 @@
|
||||
# bmc-snmp-proxy
|
||||
#
|
||||
# Config file to control SNMP redirection between
|
||||
# the OS and Service Processor/Baseboard Management Controller (BMC)
|
||||
#
|
||||
# bmc-snnmp-proxy helps redirect certain SNMP requests (to this host)
|
||||
# destined to the Service Processor. We will need the Service Processor's
|
||||
# SNMP community string and the OID of the Service Processor's SNMP agent.
|
||||
#
|
||||
# For redirecting Traps from the Service Processor to the trap sink
|
||||
# configured in the host (this system), we will have to set
|
||||
# TRAP_FORWARD below.
|
||||
#
|
||||
# See here for details
|
||||
# https://fedoraproject.org/wiki/Features/AgentFreeManagement
|
||||
|
||||
### Configure SNMP proxy to BMC/Service Processor ###
|
||||
|
||||
### Service Processor/BMC SNMP Community String.
|
||||
# Name: BMC_COMMUNITY
|
||||
# Description: Set community string of the Service Processor (BMC)'s
|
||||
# SNMP agent.
|
||||
# Default: public
|
||||
#
|
||||
BMC_COMMUNITY="public"
|
||||
|
||||
### OEM Specific OID of Service Processor
|
||||
# Name: BMC_OID
|
||||
# Description: SNMP OID that we would like to redirect to the Service
|
||||
# Processor (BMC). This can be unique to each OEM.
|
||||
# Default: ".1.3.6.1.4.1.674.10892.2"
|
||||
BMC_OID=".1.3.6.1.4.1.674.10892.2" # Dell iDRAC
|
||||
|
||||
### Forward Traps from the Service Processor to trap sink
|
||||
# Name: TRAP_FORWARD
|
||||
# Description: Enabling this will allow traps from the Service Processor
|
||||
# to be directed to this system and configure snmptrapd
|
||||
# Note: This option will have no effect if trap sink on the system is
|
||||
# not configured
|
||||
# Default: "no"
|
||||
TRAP_FORWARD="yes"
|
||||
|
||||
### Reload snmpd and snmptrapd
|
||||
# Name: RELOAD_SERVICES
|
||||
# Description: Reload snmpd and snmptrapd after making changes to their config
|
||||
# files.
|
||||
# Default: "yes"
|
||||
RELOAD_SERVICES="yes"
|
326
contrib/exchange-bmc-os-info.init.redhat
Normal file
326
contrib/exchange-bmc-os-info.init.redhat
Normal file
@ -0,0 +1,326 @@
|
||||
#!/bin/sh
|
||||
#############################################################################
|
||||
#
|
||||
# exchange-bmc-os-info: Set OS and BMC (Baseboard Management Controller)
|
||||
# parameters during system startup.
|
||||
#
|
||||
# version: 0.72
|
||||
#
|
||||
# Authors: Charles Rose <charles_rose@dell.com>
|
||||
# Jordan Hargrave <jordan_hargrave@dell.com>
|
||||
#
|
||||
# Description: Script to set OS information in the BMC; fetch BMC IP/URL
|
||||
# and set in the OS for use by other scripts/user.
|
||||
#
|
||||
# BMC IP and URL are made available in /var/run/bmc-info
|
||||
#
|
||||
# Example to launch BMC web-interface:
|
||||
# # . /var/run/bmc-info
|
||||
# # xdg-open $BMC_URL
|
||||
#
|
||||
# See here for details:
|
||||
# https://fedoraproject.org/wiki/Features/AgentFreeManagement
|
||||
#
|
||||
# OEM Specific: OEM specific ipmi commands go in:
|
||||
# 'oem_set_os_version' and 'oem_get_bmc_url'
|
||||
#############################################################################
|
||||
#
|
||||
# chkconfig: 345 99 00
|
||||
# description: Set OS name, hostname in BMC; make BMC IP/URL available in OS
|
||||
# processname: exchange-bmc-os-info
|
||||
# config: /etc/sysconfig/exchange-bmc-os-info
|
||||
#
|
||||
### BEGIN INIT INFO
|
||||
# Provides: exchange-bmc-os-info
|
||||
# Required-Start: ipmi
|
||||
# Default-Start: 3 4 5
|
||||
# Default-Stop: 0 1 2 6
|
||||
|
||||
|
||||
#############################################################################
|
||||
# GLOBALS
|
||||
#############################################################################
|
||||
CONFIGFILE=/etc/sysconfig/exchange-bmc-os-info
|
||||
IPMI_TOOL=/usr/bin/ipmitool
|
||||
BMC_INFO=/var/run/bmc-info
|
||||
|
||||
# BMC Manufacturer ID used in 'oem_set_os_version' and 'oem_get_bmc_url'
|
||||
DELL="674"
|
||||
#OTHER_OEM="123"
|
||||
|
||||
# Defaults for ${CONFIGFILE}
|
||||
SET_OS_INFO="yes"
|
||||
RESET_OS_INFO="no"
|
||||
SET_BMC_INFO="yes"
|
||||
|
||||
# getsysinfo and setsysinfo commands
|
||||
IPMI_SET_SYSINFO="${IPMI_TOOL} mc setsysinfo"
|
||||
IPMI_GET_SYSINFO="${IPMI_TOOL} mc getsysinfo"
|
||||
#############################################################################
|
||||
SCRIPT_NAME=$(basename $0)
|
||||
|
||||
# source config
|
||||
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
|
||||
|
||||
RETVAL=0
|
||||
|
||||
if [ -f /bin/gettext.sh ]; then
|
||||
GETTEXT=1
|
||||
. /bin/gettext.sh
|
||||
OUTPUT="eval_gettext"
|
||||
else
|
||||
GETTEXT=0
|
||||
OUTPUT="echo"
|
||||
fi
|
||||
|
||||
#############################################################################
|
||||
# Get Vendor ID of BMC for use in 'oem_set_os_version' and 'oem_get_bmc_url'
|
||||
#
|
||||
get_bmc_vendor_id()
|
||||
{
|
||||
BMC_VENDOR=$(${IPMI_TOOL} mc info 2>/dev/null | \
|
||||
sed -n "s#^Manufacturer ID.*: ##p")
|
||||
[ -z "${BMC_VENDOR}" ] && RETVAL=4
|
||||
}
|
||||
|
||||
check_ipmitool()
|
||||
{
|
||||
if [ -x ${IPMI_TOOL} ]; then
|
||||
# v1.8.12 plus patches are required for set/getsysinfo support
|
||||
# http://sourceforge.net/mailarchive/message.php?msg_id=29647222
|
||||
[ ! ${IPMI_GET_SYSINFO} >/dev/null 2>&1 ] && \
|
||||
RETVAL=3
|
||||
else
|
||||
RETVAL=2
|
||||
fi
|
||||
}
|
||||
|
||||
bmc_exists()
|
||||
{
|
||||
check_ipmitool
|
||||
[ $RETVAL -eq 0 ] && get_bmc_vendor_id
|
||||
return $RETVAL
|
||||
}
|
||||
#############################################################################
|
||||
|
||||
get_os_info()
|
||||
{
|
||||
OS_HOSTNAME=$(hostname)
|
||||
KERNEL_VERSION=$(uname -r -m)
|
||||
|
||||
if [ -e /etc/lsb-release ] ; then
|
||||
. /etc/lsb-release
|
||||
NAME=${DISTRIB_ID}
|
||||
VERSION="${DISTRIB_RELEASE} ${DISTRIB_CODENAME}"
|
||||
fi
|
||||
|
||||
# we prefer systemd's /etc/os-release over other sources
|
||||
[ -e /etc/os-release ] && . /etc/os-release
|
||||
|
||||
OS_NAME=${NAME}
|
||||
OS_VERSION="${VERSION} kernel ${KERNEL_VERSION}"
|
||||
}
|
||||
|
||||
oem_set_os_version()
|
||||
{
|
||||
# OS Version setting is not standard yet
|
||||
# we need per vendor oem commands
|
||||
case "${BMC_VENDOR}" in
|
||||
$DELL) ${IPMI_SET_SYSINFO} delloem_os_version \
|
||||
"${OS_VERSION}" > /dev/null 2>&1
|
||||
return $?
|
||||
;;
|
||||
# Add OEM specific commands.
|
||||
# Example:
|
||||
# $OTHER_OEM) ${IPMI_SET_SYSINFO} otheroem_os_version \
|
||||
# "${OS_VERSION}" > /dev/null 2>&1
|
||||
# return $?
|
||||
# ;;
|
||||
*) return 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_os_info()
|
||||
{
|
||||
# Set and reset OS info in the BMC
|
||||
if [ "$1" = "reset" ]; then
|
||||
OS_NAME=""
|
||||
OS_HOSTNAME=""
|
||||
OS_VERSION=""
|
||||
fi
|
||||
|
||||
${IPMI_SET_SYSINFO} os_name "${OS_NAME}" >/dev/null 2>&1 \
|
||||
|| RETVAL=6
|
||||
${IPMI_SET_SYSINFO} primary_os_name "${OS_NAME}" >/dev/null 2>&1 \
|
||||
|| RETVAL=6
|
||||
${IPMI_SET_SYSINFO} system_name "${OS_HOSTNAME}" >/dev/null 2>&1 \
|
||||
|| RETVAL=6
|
||||
oem_set_os_version || RETVAL=6
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
valid_url()
|
||||
{
|
||||
url="(https?|http)://[a-z0-9-]+(\.[a-z0-9-]+)+([/?].*)?"
|
||||
printf -- "%s" "${TMP_URL}"| grep -Eq "^${url}"
|
||||
return $?
|
||||
}
|
||||
|
||||
oem_get_bmc_url()
|
||||
{
|
||||
# BMC URL is not standard yet
|
||||
# we need per vendor oem commands
|
||||
case "$BMC_VENDOR" in
|
||||
$DELL) TMP_URL=$(${IPMI_GET_SYSINFO} delloem_url 2> /dev/null)
|
||||
;;
|
||||
# Add OEM specific commands
|
||||
# Example:
|
||||
# $OTHER_OEM)
|
||||
# TMP_URL=$(${IPMI_GET_SYSINFO} otheroem_url 2> /dev/null)
|
||||
# ;;
|
||||
*) TMP_URL="" ;;
|
||||
esac
|
||||
|
||||
valid_url && BMC_URL=${TMP_URL} || BMC_URL=""
|
||||
}
|
||||
|
||||
valid_ip()
|
||||
{
|
||||
#Thanks to mkyong.com
|
||||
octet="([01]?[[:digit:]][[:digit:]]?|2[0-4][[:digit:]]|25[0-5])"
|
||||
|
||||
printf -- "%s" "${TMP_IPv4}"| grep -Eq "^${octet}\\.${octet}\\.${octet}\\.${octet}$"
|
||||
return $?
|
||||
}
|
||||
|
||||
get_bmc_ip()
|
||||
{
|
||||
#Thanks to http://ingvar.blog.redpill-linpro.com
|
||||
for CHANNEL in `seq 1 14`
|
||||
do
|
||||
[ $(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
|
||||
| grep -q "^Set") ] || break
|
||||
done
|
||||
|
||||
# Get BMC_IPv4 and BMC_URL from BMC
|
||||
TMP_IPv4=$(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
|
||||
| sed -n "s#^IP Address .*: ##p")
|
||||
|
||||
valid_ip && BMC_IPv4=${TMP_IPv4} || BMC_IPv4=""
|
||||
}
|
||||
|
||||
get_bmc_info()
|
||||
{
|
||||
get_bmc_ip
|
||||
if [ -z "${BMC_IPv4}" ] || [ "${BMC_IPv4}" = "0.0.0.0" ]; then
|
||||
BMC_IPv4=""
|
||||
RETVAL=5
|
||||
else
|
||||
# URL makes sense only if there is an IP
|
||||
oem_get_bmc_url
|
||||
fi
|
||||
}
|
||||
|
||||
set_bmc_info()
|
||||
{
|
||||
if [ ! $(touch "${BMC_INFO}" && chmod 600 "${BMC_INFO}") ]; then
|
||||
printf "BMC_IPv4=%s\n" "${BMC_IPv4}" > "${BMC_INFO}"
|
||||
[ -n "${BMC_URL}" ] && \
|
||||
printf "BMC_URL=%s\n" "${BMC_URL}" >> "${BMC_INFO}"
|
||||
else
|
||||
RETVAL=5
|
||||
fi
|
||||
}
|
||||
|
||||
unset_bmc_info()
|
||||
{
|
||||
[ -f ${BMC_INFO} ] && rm -f ${BMC_INFO} > /dev/null 2>&1
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
start()
|
||||
{
|
||||
if bmc_exists; then
|
||||
[ "${SET_OS_INFO}" = "yes" ] && \
|
||||
get_os_info && set_os_info
|
||||
|
||||
if [ "${SET_BMC_INFO}" = "yes" ]; then
|
||||
get_bmc_info
|
||||
if [ ${RETVAL} -eq 0 ]; then
|
||||
set_bmc_info
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
stop()
|
||||
{
|
||||
if bmc_exists; then
|
||||
# reset OS info while system reboots
|
||||
# aids with debugging OS boot-up issues
|
||||
if [ "${RESET_OS_INFO}" = "yes" ]; then
|
||||
set_os_info reset
|
||||
fi
|
||||
unset_bmc_info
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
restart()
|
||||
{
|
||||
stop
|
||||
[ $RETVAL -eq 0 ] && start
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
status()
|
||||
{
|
||||
[ -r ${BMC_INFO} ] && \
|
||||
grep -q "BMC_IPv4" "${BMC_INFO}" >/dev/null 1>&2 && \
|
||||
BMC_STATUS="ok" || BMC_STATUS="inactive"
|
||||
${OUTPUT} "${SCRIPT_NAME}: ${BMC_STATUS}" 1>&2
|
||||
[ ${GETTEXT} -eq 1 ] && echo
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
usage()
|
||||
{
|
||||
${OUTPUT} "Usage: ${SCRIPT_NAME} {start|stop|restart|status}" 1>&2
|
||||
[ ${GETTEXT} -eq 1 ] && echo
|
||||
RETVAL=1
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# MAIN
|
||||
#############################################################################
|
||||
case "$1" in
|
||||
start) start ;;
|
||||
stop) stop ;;
|
||||
restart) restart ;;
|
||||
status) status ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
|
||||
case "$RETVAL" in
|
||||
0|1) ;;
|
||||
2) ${OUTPUT} "${SCRIPT_NAME}: ipmitool(1) not found." 1>&2 ;;
|
||||
3) ${OUTPUT} "${SCRIPT_NAME}: this version of ipmitool does not support getsysinfo." 1>&2 ;;
|
||||
4) ${OUTPUT} "${SCRIPT_NAME}: failed to communicate with BMC." 1>&2 ;;
|
||||
5) ${OUTPUT} "${SCRIPT_NAME}: failed to set OS information in BMC." 1>&2 ;;
|
||||
6) ${OUTPUT} "${SCRIPT_NAME}: failed to get BMC information." 1>&2 ;;
|
||||
*) ${OUTPUT} "${SCRIPT_NAME}: unexpected error." 1>&2 ;;
|
||||
esac
|
||||
|
||||
if [ ${RETVAL} -gt 1 ]; then
|
||||
${OUTPUT} " Return code: ${RETVAL}" 1>&2
|
||||
[ ${GETTEXT} -eq 1 ] && echo
|
||||
fi
|
||||
|
||||
|
||||
exit ${RETVAL}
|
||||
|
||||
#############################################################################
|
||||
# end of file
|
||||
#############################################################################
|
13
contrib/exchange-bmc-os-info.service.redhat
Normal file
13
contrib/exchange-bmc-os-info.service.redhat
Normal file
@ -0,0 +1,13 @@
|
||||
[Unit]
|
||||
Description=Exchange Information between BMC and OS
|
||||
After=ipmi.service network.target
|
||||
Requires=ipmi.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/libexec/exchange-bmc-os-info start
|
||||
ExecStop=/usr/libexec/exchange-bmc-os-info stop
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
26
contrib/exchange-bmc-os-info.sysconf
Normal file
26
contrib/exchange-bmc-os-info.sysconf
Normal file
@ -0,0 +1,26 @@
|
||||
# exchange-bmc-os-info
|
||||
#
|
||||
# Config file to control Exchange of information between
|
||||
# the OS and Service Processor/Baseboard Management Controller (BMC)
|
||||
#
|
||||
# See here for details
|
||||
# https://fedoraproject.org/wiki/Features/AgentFreeManagement
|
||||
|
||||
### Set OS Info in BMC/Service Processor ###
|
||||
# Name: SET_OS_INFO
|
||||
# Description: Set OS Name, Version and Hostname in the Service Processor (BMC)
|
||||
# Default: yes
|
||||
SET_OS_INFO="yes"
|
||||
|
||||
### Reset OS Info in BMC/Service Processor ###
|
||||
# Name: RESET_OS_INFO
|
||||
# Description: Reset OS Name, Version and Hostname in the Service Processor (BMC).
|
||||
# Useful when the OS Name/Hostname should be empty on reboot
|
||||
# Default: no
|
||||
RESET_OS_INFO="no"
|
||||
|
||||
### Set BMC/Service Processor Info in OS ###
|
||||
# Name; SET_BMC_INFO
|
||||
# Description: Set IP Address and URL of Service Processor/BMC in /run/bmc-info
|
||||
# Default: yes
|
||||
SET_BMC_INFO="yes"
|
@ -4,7 +4,7 @@ Version: @VERSION@
|
||||
Release: @RPM_RELEASE@%{?_distro:.%{_distro}}
|
||||
License: BSD
|
||||
Group: Utilities
|
||||
Packager: Duncan Laurie <duncan@iceblink.org>
|
||||
Packager: Jim Mankovich <jmank@hp.com>
|
||||
Source: %{name}-%{version}.tar.gz
|
||||
Buildroot: /var/tmp/ipmitool-root
|
||||
|
@ -8,5 +8,5 @@
|
||||
%_srcrpmdir %{_topdir}/SRPMS
|
||||
%_distro @DISTRO@
|
||||
%_rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
|
||||
%packager duncan@iceblink.org
|
||||
%packager jmank@hp.com
|
||||
%distribution Sourceforge Build
|
0
ipmitool/debian/dirs → debian/dirs
vendored
0
ipmitool/debian/dirs → debian/dirs
vendored
0
ipmitool/debian/docs → debian/docs
vendored
0
ipmitool/debian/docs → debian/docs
vendored
0
ipmitool/debian/rules → debian/rules
vendored
0
ipmitool/debian/rules → debian/rules
vendored
0
ipmitool/debian/watch → debian/watch
vendored
0
ipmitool/debian/watch → debian/watch
vendored
File diff suppressed because it is too large
Load Diff
@ -30,7 +30,7 @@
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
||||
noinst_HEADERS = log.h bswap.h helper.h ipmi.h ipmi_cc.h ipmi_intf.h \
|
||||
noinst_HEADERS = log.h bswap.h hpm2.h helper.h ipmi.h ipmi_cc.h ipmi_intf.h \
|
||||
ipmi_chassis.h ipmi_entity.h ipmi_fru.h ipmi_hpmfwupg.h ipmi_lanp.h \
|
||||
ipmi_sdr.h ipmi_sel.h ipmi_sol.h ipmi_mc.h ipmi_raw.h \
|
||||
ipmi_channel.h ipmi_sensor.h ipmi_event.h ipmi_session.h \
|
@ -50,6 +50,14 @@
|
||||
#define tboolean int
|
||||
#endif
|
||||
|
||||
/* IPMI spec. - UID 0 reserved, 63 maximum UID which can be used */
|
||||
#ifndef IPMI_UID_MIN
|
||||
# define IPMI_UID_MIN 1
|
||||
#endif
|
||||
#ifndef IPMI_UID_MAX
|
||||
# define IPMI_UID_MAX 63
|
||||
#endif
|
||||
|
||||
struct ipmi_intf;
|
||||
|
||||
struct valstr {
|
||||
@ -65,14 +73,20 @@ struct oemvalstr {
|
||||
const char * val2str(uint16_t val, const struct valstr * vs);
|
||||
const char * oemval2str(uint32_t oem,uint16_t val, const struct oemvalstr * vs);
|
||||
|
||||
int str2double(const char * str, double * double_ptr);
|
||||
int str2long(const char * str, int64_t * lng_ptr);
|
||||
int str2ulong(const char * str, uint64_t * ulng_ptr);
|
||||
int str2int(const char * str, int32_t * int_ptr);
|
||||
int str2uint(const char * str, uint32_t * uint_ptr);
|
||||
int str2short(const char * str, int16_t * shrt_ptr);
|
||||
int str2ushort(const char * str, uint16_t * ushrt_ptr);
|
||||
int str2char(const char * str, int8_t * chr_ptr);
|
||||
int str2uchar(const char * str, uint8_t * uchr_ptr);
|
||||
|
||||
int is_fru_id(const char *argv_ptr, uint8_t *fru_id_ptr);
|
||||
int is_ipmi_channel_num(const char *argv_ptr, uint8_t *channel_ptr);
|
||||
int is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr);
|
||||
|
||||
uint16_t str2val(const char * str, const struct valstr * vs);
|
||||
void print_valstr(const struct valstr * vs, const char * title, int loglevel);
|
||||
void print_valstr_2col(const struct valstr * vs, const char * title, int loglevel);
|
||||
@ -85,6 +99,7 @@ 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);
|
||||
void ipmi_start_daemon(struct ipmi_intf *intf);
|
||||
uint16_t ipmi_get_oem_id(struct ipmi_intf *intf);
|
||||
|
||||
#define ipmi_open_file_read(file) ipmi_open_file(file, 0)
|
||||
#define ipmi_open_file_write(file) ipmi_open_file(file, 1)
|
86
include/ipmitool/hpm2.h
Normal file
86
include/ipmitool/hpm2.h
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Pigeon Point Systems. All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistribution of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistribution in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* Neither the name of Pigeon Point Systems nor the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* PIGEON POINT SYSTEMS ("PPS") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* PPS OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <ipmitool/ipmi_intf.h>
|
||||
|
||||
/* Global HPM.2 defines */
|
||||
#define HPM2_REVISION 0x01
|
||||
#define HPM3_REVISION 0x01
|
||||
#define HPM2_LAN_PARAMS_REV 0x01
|
||||
#define HPM2_SOL_PARAMS_REV 0x01
|
||||
#define HPM3_LAN_PARAMS_REV 0x01
|
||||
|
||||
/* HPM.2 capabilities */
|
||||
#define HPM2_CAPS_SOL_EXTENSION 0x01
|
||||
#define HPM2_CAPS_PACKET_TRACE 0x02
|
||||
#define HPM2_CAPS_EXT_MANAGEMENT 0x04
|
||||
#define HPM2_CAPS_VERSION_SENSOR 0x08
|
||||
#define HPM2_CAPS_DYNAMIC_SESSIONS 0x10
|
||||
|
||||
#if HAVE_PRAGMA_PACK
|
||||
# pragma pack(push, 1)
|
||||
#endif
|
||||
|
||||
/* HPM.2 LAN attach capabilities */
|
||||
struct hpm2_lan_attach_capabilities {
|
||||
uint8_t hpm2_revision_id;
|
||||
uint16_t lan_channel_mask;
|
||||
uint8_t hpm2_caps;
|
||||
uint8_t hpm2_lan_params_start;
|
||||
uint8_t hpm2_lan_params_rev;
|
||||
uint8_t hpm2_sol_params_start;
|
||||
uint8_t hpm2_sol_params_rev;
|
||||
} ATTRIBUTE_PACKING;
|
||||
|
||||
/* HPM.2 LAN channel capabilities */
|
||||
struct hpm2_lan_channel_capabilities {
|
||||
uint8_t capabilities;
|
||||
uint8_t attach_type;
|
||||
uint8_t bandwidth_class;
|
||||
uint16_t max_inbound_pld_size;
|
||||
uint16_t max_outbound_pld_size;
|
||||
} ATTRIBUTE_PACKING;
|
||||
|
||||
#if HAVE_PRAGMA_PACK
|
||||
# pragma pack(pop)
|
||||
#endif
|
||||
|
||||
/* HPM.2 command assignments */
|
||||
#define HPM2_GET_LAN_ATTACH_CAPABILITIES 0x3E
|
||||
|
||||
extern int hpm2_get_capabilities(struct ipmi_intf * intf,
|
||||
struct hpm2_lan_attach_capabilities * caps);
|
||||
extern int hpm2_get_lan_channel_capabilities(struct ipmi_intf * intf,
|
||||
uint8_t hpm2_lan_params_start,
|
||||
struct hpm2_lan_channel_capabilities * caps);
|
||||
extern int hpm2_detect_max_payload_size(struct ipmi_intf * intf);
|
@ -242,6 +242,7 @@ struct ipmi_rs {
|
||||
#define IPMI_NETFN_TRANSPORT 0xc
|
||||
#define IPMI_NETFN_PICMG 0x2C
|
||||
#define IPMI_NETFN_DCGRP 0x2C
|
||||
#define IPMI_NETFN_OEM 0x2E
|
||||
#define IPMI_NETFN_ISOL 0x34
|
||||
#define IPMI_NETFN_TSOL 0x30
|
||||
|
||||
@ -265,6 +266,7 @@ typedef enum IPMI_OEM {
|
||||
IPMI_OEM_DELL = 674,
|
||||
IPMI_OEM_LMC = 2168,
|
||||
IPMI_OEM_RADISYS = 4337,
|
||||
IPMI_OEM_BROADCOM = 4413,
|
||||
IPMI_OEM_MAGNUM = 5593,
|
||||
IPMI_OEM_TYAN = 6653,
|
||||
IPMI_OEM_NEWISYS = 9237,
|
||||
@ -279,7 +281,8 @@ typedef enum IPMI_OEM {
|
||||
IPMI_OEM_KONTRON = 15000,
|
||||
IPMI_OEM_PPS = 16394,
|
||||
IPMI_OEM_AMI = 20974,
|
||||
IPMI_OEM_NOKIA_SIEMENS_NETWORKS = 28458
|
||||
IPMI_OEM_NOKIA_SIEMENS_NETWORKS = 28458,
|
||||
IPMI_OEM_SUPERMICRO_47488 = 47488
|
||||
} IPMI_OEM;
|
||||
|
||||
extern const struct valstr completion_code_vals[];
|
@ -87,11 +87,11 @@ struct get_channel_auth_cap_rsp {
|
||||
#endif
|
||||
#if WORDS_BIGENDIAN
|
||||
uint8_t __reserved3 : 6;
|
||||
uint8_t ipmiv15_support : 1; /* channel supports IPMI v1.5 connections */
|
||||
uint8_t ipmiv20_support : 1; /* channel supports IPMI v2.0 connections */
|
||||
uint8_t ipmiv15_support : 1; /* channel supports IPMI v1.5 connections */
|
||||
#else
|
||||
uint8_t ipmiv20_support : 1; /* channel supports IPMI v2.0 connections */
|
||||
uint8_t ipmiv15_support : 1; /* channel supports IPMI v1.5 connections */
|
||||
uint8_t ipmiv20_support : 1; /* channel supports IPMI v2.0 connections */
|
||||
uint8_t __reserved3 : 6;
|
||||
#endif
|
||||
uint8_t oem_id[3]; /* IANA enterprise number for auth type */
|
@ -44,6 +44,7 @@
|
||||
|
||||
#define IPMI_DCMI_CONFORM 0x0001
|
||||
#define IPMI_DCMI_1_1_CONFORM 0x0101
|
||||
#define IPMI_DCMI_1_5_CONFORM 0x0501
|
||||
|
||||
#define DCMI_MAX_BYTE_SIZE 0x10
|
||||
#define DCMI_MAX_BYTE_TEMP_READ_SIZE 0x08
|
@ -39,10 +39,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
|
||||
|
||||
/* IPMI 2.0 command for system information*/
|
||||
#define IPMI_SET_SYS_INFO 0x58
|
||||
#define IPMI_GET_SYS_INFO 0x59
|
||||
|
||||
/* Dell selector for LCD control - get and set unless specified */
|
||||
#define IPMI_DELL_LCD_STRING_SELECTOR 0xC1 /* RW get/set the user string */
|
||||
#define IPMI_DELL_LCD_CONFIG_SELECTOR 0xC2 /* RW set to user/default/none */
|
||||
@ -139,6 +135,7 @@ typedef struct _tag_ipmi_dell_lcd_stringex
|
||||
|
||||
typedef struct _lcd_status
|
||||
{
|
||||
char parametersel;
|
||||
char vKVM_status;
|
||||
char lock_status;
|
||||
char Resv1;
|
||||
@ -156,6 +153,7 @@ typedef struct _lcd_mode
|
||||
} __attribute__ ((packed)) LCD_MODE;
|
||||
|
||||
#define PARAM_REV_OFFSET (uint8_t)(0x1)
|
||||
#define VIRTUAL_MAC_OFFSET (uint8_t)(0x1)
|
||||
|
||||
#define LOM_MACTYPE_ETHERNET 0
|
||||
#define LOM_MACTYPE_ISCSI 1
|
@ -63,6 +63,8 @@ enum {
|
||||
struct fru_info {
|
||||
uint16_t size;
|
||||
uint8_t access:1;
|
||||
uint8_t max_read_size;
|
||||
uint8_t max_write_size;
|
||||
};
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
@ -70,13 +72,16 @@ struct fru_info {
|
||||
#endif
|
||||
struct fru_header {
|
||||
uint8_t version;
|
||||
struct {
|
||||
uint8_t internal;
|
||||
uint8_t chassis;
|
||||
uint8_t board;
|
||||
uint8_t product;
|
||||
uint8_t multi;
|
||||
} offset;
|
||||
union {
|
||||
struct {
|
||||
uint8_t internal;
|
||||
uint8_t chassis;
|
||||
uint8_t board;
|
||||
uint8_t product;
|
||||
uint8_t multi;
|
||||
} offset;
|
||||
uint8_t offsets[5];
|
||||
};
|
||||
uint8_t pad;
|
||||
uint8_t checksum;
|
||||
}ATTRIBUTE_PACKING;
|
||||
@ -397,20 +402,21 @@ struct fru_picmgext_amc_link_desc {
|
||||
#define OEM_SWFW_NBLOCK_OFFSET 0x05
|
||||
#define OEM_SWFW_FIELD_START_OFFSET 0x06
|
||||
|
||||
#define FRU_PICMGEXT_CHN_DESC_RECORD_SIZE 3
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
#pragma pack(1)
|
||||
#endif
|
||||
struct fru_picmgext_chn_desc {
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
unsigned char remote_slot:8;
|
||||
unsigned char remote_chn:5;
|
||||
unsigned char local_chn:5;
|
||||
unsigned char:6;
|
||||
unsigned int remote_slot:8;
|
||||
unsigned int remote_chn:5;
|
||||
unsigned int local_chn:5;
|
||||
unsigned int res:14;
|
||||
#else
|
||||
unsigned char:6;
|
||||
unsigned char local_chn:5;
|
||||
unsigned char remote_chn:5;
|
||||
unsigned char remote_slot:8;
|
||||
unsigned int res:14;
|
||||
unsigned int local_chn:5;
|
||||
unsigned int remote_chn:5;
|
||||
unsigned int remote_slot:8;
|
||||
#endif
|
||||
}ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
@ -507,28 +513,30 @@ struct fru_picmgext_amc_p2p_record {
|
||||
#pragma pack(0)
|
||||
#endif
|
||||
|
||||
#define FRU_PICMGEXT_AMC_CHANNEL_DESC_RECORD_SIZE 3
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
#pragma pack(1)
|
||||
#endif
|
||||
struct fru_picmgext_amc_channel_desc_record {
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
unsigned char lane0port :5;
|
||||
unsigned char lane1port :5;
|
||||
unsigned char lane2port :5;
|
||||
unsigned char lane3port :5;
|
||||
unsigned char /*reserved */ :4;
|
||||
#else
|
||||
unsigned char /*reserved */ :4;
|
||||
unsigned char lane3port :5;
|
||||
unsigned char lane2port :5;
|
||||
unsigned char lane1port :5;
|
||||
unsigned char lane0port :5;
|
||||
unsigned int lane0port :5;
|
||||
unsigned int lane1port :5;
|
||||
unsigned int lane2port :5;
|
||||
unsigned int lane3port :5;
|
||||
unsigned int /* reserved */ :12;
|
||||
#else
|
||||
unsigned int /* reserved */ :12;
|
||||
unsigned int lane3port :5;
|
||||
unsigned int lane2port :5;
|
||||
unsigned int lane1port :5;
|
||||
unsigned int lane0port :5;
|
||||
#endif
|
||||
}ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
#pragma pack(0)
|
||||
#endif
|
||||
|
||||
#define FRU_PICMGEXT_AMC_LINK_DESC_RECORD_SIZE 5
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
#pragma pack(1)
|
||||
#endif
|
||||
@ -552,27 +560,28 @@ struct fru_picmgext_amc_link_desc_record {
|
||||
#define AMC_LINK_TYPE_EXT_STORAGE_SATA 0x01
|
||||
#define AMC_LINK_TYPE_EXT_STORAGE_SAS 0x02
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
unsigned short channel_id :8;
|
||||
unsigned short port_flag_0 :1;
|
||||
unsigned short port_flag_1 :1;
|
||||
unsigned short port_flag_2 :1;
|
||||
unsigned short port_flag_3 :1;
|
||||
unsigned short type :8;
|
||||
unsigned short type_ext :4;
|
||||
unsigned short group_id :8;
|
||||
unsigned char asym_match :2;
|
||||
unsigned char /* reserved */ :6;
|
||||
unsigned int channel_id :8;
|
||||
unsigned int port_flag_0 :1;
|
||||
unsigned int port_flag_1 :1;
|
||||
unsigned int port_flag_2 :1;
|
||||
unsigned int port_flag_3 :1;
|
||||
unsigned int type :8;
|
||||
unsigned int type_ext :4;
|
||||
unsigned int group_id :8;
|
||||
unsigned int asym_match :2;
|
||||
unsigned int /* reserved */ :30;
|
||||
#else
|
||||
unsigned char /* reserved */ :6;
|
||||
unsigned char asym_match :2;
|
||||
unsigned short group_id :8;
|
||||
unsigned short type_ext :4;
|
||||
unsigned short type :8;
|
||||
unsigned short port_flag_3 :1;
|
||||
unsigned short port_flag_2 :1;
|
||||
unsigned short port_flag_1 :1;
|
||||
unsigned short port_flag_0 :1;
|
||||
unsigned short channel_id :8;
|
||||
unsigned int group_id :8;
|
||||
unsigned int type_ext :4;
|
||||
unsigned int type :8;
|
||||
unsigned int port_flag_3 :1;
|
||||
unsigned int port_flag_2 :1;
|
||||
unsigned int port_flag_1 :1;
|
||||
unsigned int port_flag_0 :1;
|
||||
unsigned int channel_id :8;
|
||||
|
||||
unsigned int /* reserved */ :30;
|
||||
unsigned int asym_match :2;
|
||||
#endif
|
||||
}ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
@ -594,6 +603,20 @@ static const char * chassis_type_desc[] __attribute__((unused)) = {
|
||||
"AdvancedTCA", "Blade", "Blade Enclosure"
|
||||
};
|
||||
|
||||
typedef struct ipmi_fru_bloc {
|
||||
struct ipmi_fru_bloc * next;
|
||||
uint16_t start;
|
||||
uint16_t size;
|
||||
uint8_t blocId[32];
|
||||
} t_ipmi_fru_bloc;
|
||||
|
||||
static const char *section_id[4] = {
|
||||
"Internal Use Section",
|
||||
"Chassis Section",
|
||||
"Board Section",
|
||||
"Product Section"
|
||||
};
|
||||
|
||||
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);
|
||||
|
243
include/ipmitool/ipmi_fwum.h
Normal file
243
include/ipmitool/ipmi_fwum.h
Normal file
@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef IPMI_KFWUM_H
|
||||
# define IPMI_KFWUM_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <ipmitool/ipmi.h>
|
||||
|
||||
/* KFWUM Version */
|
||||
# define VER_MAJOR 1
|
||||
# define VER_MINOR 3
|
||||
/* Minimum size (IPMB/IOL/old protocol) */
|
||||
# define KFWUM_SMALL_BUFFER 32
|
||||
/* Maximum size on KCS interface */
|
||||
# define KFWUM_BIG_BUFFER 32
|
||||
# define MAX_BUFFER_SIZE 1024*16
|
||||
|
||||
/* 3 address + 1 size + 1 checksum + 1 command */
|
||||
# define KFWUM_OLD_CMD_OVERHEAD 6
|
||||
/* 1 sequence + 1 size + 1 checksum + 1 command */
|
||||
# define KFWUM_NEW_CMD_OVERHEAD 4
|
||||
# define KFWUM_PAGE_SIZE 256
|
||||
|
||||
# define FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT 6
|
||||
# define FWUM_MAX_UPLOAD_RETRY 6
|
||||
|
||||
# define TRACE_LOG_CHUNK_COUNT 7
|
||||
# define TRACE_LOG_CHUNK_SIZE 7
|
||||
# define TRACE_LOG_ATT_COUNT 3
|
||||
|
||||
# define IN_FIRMWARE_INFO_OFFSET_LOCATION 0x5a0
|
||||
# define IN_FIRMWARE_INFO_SIZE 20
|
||||
# define IN_FIRMWARE_INFO_OFFSET_FILE_SIZE 0
|
||||
# define IN_FIRMWARE_INFO_OFFSET_CHECKSUM 4
|
||||
# define IN_FIRMWARE_INFO_OFFSET_BOARD_ID 6
|
||||
# define IN_FIRMWARE_INFO_OFFSET_DEVICE_ID 8
|
||||
# define IN_FIRMWARE_INFO_OFFSET_TABLE_VERSION 9
|
||||
# define IN_FIRMWARE_INFO_OFFSET_IMPLEMENT_REV 10
|
||||
# define IN_FIRMWARE_INFO_OFFSET_VER_MAJOROR 11
|
||||
# define IN_FIRMWARE_INFO_OFFSET_VER_MINORSUB 12
|
||||
# define IN_FIRMWARE_INFO_OFFSET_SDR_REV 13
|
||||
# define IN_FIRMWARE_INFO_OFFSET_IANA0 14
|
||||
# define IN_FIRMWARE_INFO_OFFSET_IANA1 15
|
||||
# define IN_FIRMWARE_INFO_OFFSET_IANA2 16
|
||||
|
||||
# define KWUM_GET_BYTE_AT_OFFSET(pBuffer,os) pBuffer[os]
|
||||
|
||||
int ipmi_fwum_main(struct ipmi_intf *, int, char **);
|
||||
|
||||
typedef enum eKFWUM_BoardList
|
||||
{
|
||||
KFWUM_BOARD_KONTRON_UNKNOWN = 0,
|
||||
KFWUM_BOARD_KONTRON_5002 = 5002,
|
||||
} tKFWUM_BoardList;
|
||||
|
||||
typedef struct sKFWUM_BoardInfo
|
||||
{
|
||||
tKFWUM_BoardList boardId;
|
||||
IPMI_OEM iana;
|
||||
} tKFWUM_BoardInfo;
|
||||
|
||||
typedef enum eKFWUM_DownloadType
|
||||
{
|
||||
KFWUM_DOWNLOAD_TYPE_ADDRESS = 0,
|
||||
KFWUM_DOWNLOAD_TYPE_SEQUENCE,
|
||||
} tKFWUM_DownloadType;
|
||||
|
||||
typedef enum eKFWUM_DownloadBuffferType
|
||||
{
|
||||
KFWUM_SMALL_BUFFER_TYPE = 0,
|
||||
KFUMW_BIG_BUFFER_TYPE
|
||||
} tKFWUM_DownloadBuffferType;
|
||||
|
||||
typedef struct sKFWUM_InFirmwareInfo
|
||||
{
|
||||
unsigned long fileSize;
|
||||
unsigned short checksum;
|
||||
unsigned short sumToRemoveFromChecksum;
|
||||
/* Since the checksum is added in the bin
|
||||
* after the checksum is calculated, we
|
||||
* need to remove the each byte value. This
|
||||
* byte will contain the addition of both bytes
|
||||
*/
|
||||
tKFWUM_BoardList boardId;
|
||||
unsigned char deviceId;
|
||||
unsigned char tableVers;
|
||||
unsigned char implRev;
|
||||
unsigned char versMajor;
|
||||
unsigned char versMinor;
|
||||
unsigned char versSubMinor;
|
||||
unsigned char sdrRev;
|
||||
IPMI_OEM iana;
|
||||
} tKFWUM_InFirmwareInfo;
|
||||
|
||||
typedef struct sKFWUM_SaveFirmwareInfo
|
||||
{
|
||||
tKFWUM_DownloadType downloadType;
|
||||
unsigned char bufferSize;
|
||||
unsigned char overheadSize;
|
||||
} tKFWUM_SaveFirmwareInfo;
|
||||
|
||||
/* COMMANDS */
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumGetInfoResp {
|
||||
unsigned char protocolRevision;
|
||||
unsigned char controllerDeviceId;
|
||||
struct {
|
||||
unsigned char mode:1;
|
||||
unsigned char seqAdd:1;
|
||||
unsigned char res : 6;
|
||||
} byte;
|
||||
unsigned char firmRev1;
|
||||
unsigned char firmRev2;
|
||||
unsigned char numBank;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumGetStatusResp {
|
||||
unsigned char bankState;
|
||||
unsigned char firmLengthLSB;
|
||||
unsigned char firmLengthMid;
|
||||
unsigned char firmLengthMSB;
|
||||
unsigned char firmRev1;
|
||||
unsigned char firmRev2;
|
||||
unsigned char firmRev3;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumManualRollbackReq {
|
||||
unsigned char type;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumStartFirmwareDownloadReq {
|
||||
unsigned char lengthLSB;
|
||||
unsigned char lengthMid;
|
||||
unsigned char lengthMSB;
|
||||
unsigned char paddingLSB;
|
||||
unsigned char paddingMSB;
|
||||
unsigned char useSequence;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumStartFirmwareDownloadResp {
|
||||
unsigned char bank;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumSaveFirmwareAddressReq
|
||||
{
|
||||
unsigned char addressLSB;
|
||||
unsigned char addressMid;
|
||||
unsigned char addressMSB;
|
||||
unsigned char numBytes;
|
||||
unsigned char txBuf[KFWUM_SMALL_BUFFER-KFWUM_OLD_CMD_OVERHEAD];
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumSaveFirmwareSequenceReq
|
||||
{
|
||||
unsigned char sequenceNumber;
|
||||
unsigned char txBuf[KFWUM_BIG_BUFFER];
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
# endif
|
||||
struct KfwumFinishFirmwareDownloadReq {
|
||||
unsigned char versionMaj;
|
||||
unsigned char versionMinSub;
|
||||
unsigned char versionSdr;
|
||||
unsigned char reserved;
|
||||
} ATTRIBUTE_PACKING;
|
||||
# ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
# endif
|
||||
|
||||
#endif /* IPMI_KFWUM_H */
|
808
include/ipmitool/ipmi_hpmfwupg.h
Normal file
808
include/ipmitool/ipmi_hpmfwupg.h
Normal file
@ -0,0 +1,808 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef IPMI_HPMFWUPG_H
|
||||
#define IPMI_HPMFWUPG_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <ipmitool/ipmi.h>
|
||||
|
||||
int ipmi_hpmfwupg_main(struct ipmi_intf *, int, char **);
|
||||
|
||||
/* Agent version */
|
||||
#define HPMFWUPG_VERSION_MAJOR 1
|
||||
#define HPMFWUPG_VERSION_MINOR 0
|
||||
#define HPMFWUPG_VERSION_SUBMINOR 9
|
||||
|
||||
/* HPM.1 FIRMWARE UPGRADE COMMANDS (part of PICMG) */
|
||||
#define HPMFWUPG_GET_TARGET_UPG_CAPABILITIES 0x2E
|
||||
#define HPMFWUPG_GET_COMPONENT_PROPERTIES 0x2F
|
||||
#define HPMFWUPG_ABORT_UPGRADE 0x30
|
||||
#define HPMFWUPG_INITIATE_UPGRADE_ACTION 0x31
|
||||
#define HPMFWUPG_UPLOAD_FIRMWARE_BLOCK 0x32
|
||||
#define HPMFWUPG_FINISH_FIRMWARE_UPLOAD 0x33
|
||||
#define HPMFWUPG_GET_UPGRADE_STATUS 0x34
|
||||
#define HPMFWUPG_ACTIVATE_FIRMWARE 0x35
|
||||
#define HPMFWUPG_QUERY_SELFTEST_RESULT 0x36
|
||||
#define HPMFWUPG_QUERY_ROLLBACK_STATUS 0x37
|
||||
#define HPMFWUPG_MANUAL_FIRMWARE_ROLLBACK 0x38
|
||||
|
||||
/* HPM.1 SPECIFIC COMPLETION CODES */
|
||||
#define HPMFWUPG_ROLLBACK_COMPLETED 0x00
|
||||
#define HPMFWUPG_COMMAND_IN_PROGRESS 0x80
|
||||
#define HPMFWUPG_NOT_SUPPORTED 0x81
|
||||
#define HPMFWUPG_SIZE_MISMATCH 0x81
|
||||
#define HPMFWUPG_ROLLBACK_FAILURE 0x81
|
||||
#define HPMFWUPG_INV_COMP_MASK 0x81
|
||||
#define HPMFWUPG__ABORT_FAILURE 0x81
|
||||
#define HPMFWUPG_INV_COMP_ID 0x82
|
||||
#define HPMFWUPG_INT_CHECKSUM_ERROR 0x82
|
||||
#define HPMFWUPG_INV_UPLOAD_MODE 0x82
|
||||
#define HPMFWUPG_ROLLBACK_OVERRIDE 0x82
|
||||
#define HPMFWUPG_INV_COMP_PROP 0x83
|
||||
#define HPMFWUPG_FW_MISMATCH 0x83
|
||||
#define HPMFWUPG_ROLLBACK_DENIED 0x83
|
||||
|
||||
/*
|
||||
* This error code is used as a temporary PATCH to
|
||||
* the latest Open ipmi driver. This PATCH
|
||||
* will be removed once a new Open IPMI driver is released.
|
||||
* (Buggy version = 39)
|
||||
*/
|
||||
#define ENABLE_OPENIPMI_V39_PATCH
|
||||
|
||||
#ifdef ENABLE_OPENIPMI_V39_PATCH
|
||||
# define RETRY_COUNT_MAX 3
|
||||
static int errorCount;
|
||||
# define HPMFWUPG_IS_RETRYABLE(error) \
|
||||
((((error==0x83)||(error==0x82)||(error==0x80)) && (errorCount++<RETRY_COUNT_MAX))?TRUE:FALSE)
|
||||
#else
|
||||
# define HPMFWUPG_IS_RETRYABLE(error) FALSE
|
||||
#endif
|
||||
|
||||
/* HPM FIRMWARE UPGRADE GENERAL DEFINITIONS */
|
||||
#define HPMFWUPG_PICMG_IDENTIFIER 0
|
||||
#define HPMFWUPG_VERSION_SIZE 6
|
||||
#define HPMFWUPG_DESC_STRING_LENGTH 12
|
||||
#define HPMFWUPG_DEFAULT_INACCESS_TIMEOUT 60 /* sec */
|
||||
#define HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT 60 /* sec */
|
||||
#define HPMFWUPG_MD5_SIGNATURE_LENGTH 16
|
||||
|
||||
/* Component IDs */
|
||||
typedef enum eHpmfwupgComponentId {
|
||||
HPMFWUPG_COMPONENT_ID_0 = 0,
|
||||
HPMFWUPG_COMPONENT_ID_1,
|
||||
HPMFWUPG_COMPONENT_ID_2,
|
||||
HPMFWUPG_COMPONENT_ID_3,
|
||||
HPMFWUPG_COMPONENT_ID_4,
|
||||
HPMFWUPG_COMPONENT_ID_5,
|
||||
HPMFWUPG_COMPONENT_ID_6,
|
||||
HPMFWUPG_COMPONENT_ID_7,
|
||||
HPMFWUPG_COMPONENT_ID_MAX
|
||||
} tHpmfwupgComponentId;
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgComponentBitMask {
|
||||
union {
|
||||
unsigned char byte;
|
||||
struct {
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
unsigned char component7 : 1;
|
||||
unsigned char component6 : 1;
|
||||
unsigned char component5 : 1;
|
||||
unsigned char component4 : 1;
|
||||
unsigned char component3 : 1;
|
||||
unsigned char component2 : 1;
|
||||
unsigned char component1 : 1;
|
||||
unsigned char component0 : 1;
|
||||
#else
|
||||
unsigned char component0 : 1;
|
||||
unsigned char component1 : 1;
|
||||
unsigned char component2 : 1;
|
||||
unsigned char component3 : 1;
|
||||
unsigned char component4 : 1;
|
||||
unsigned char component5 : 1;
|
||||
unsigned char component6 : 1;
|
||||
unsigned char component7 : 1;
|
||||
#endif
|
||||
} ATTRIBUTE_PACKING bitField;
|
||||
} ATTRIBUTE_PACKING ComponentBits;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
|
||||
static const int HPMFWUPG_SUCCESS = 0;
|
||||
static const int HPMFWUPG_ERROR = -1;
|
||||
/* Upload firmware specific error codes */
|
||||
static const int HPMFWUPG_UPLOAD_BLOCK_LENGTH = 1;
|
||||
static const int HPMFWUPG_UPLOAD_RETRY = 2;
|
||||
|
||||
|
||||
/* TARGET UPGRADE CAPABILITIES DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char hpmVersion;
|
||||
union {
|
||||
unsigned char byte;
|
||||
struct {
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char fwUpgUndesirable : 1;
|
||||
unsigned char autRollbackOverride : 1;
|
||||
unsigned char ipmcDegradedDurinUpg: 1;
|
||||
unsigned char deferActivation : 1;
|
||||
unsigned char servAffectDuringUpg : 1;
|
||||
unsigned char manualRollback : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char ipmcSelftestCap : 1;
|
||||
#else
|
||||
unsigned char ipmcSelftestCap : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char manualRollback : 1;
|
||||
unsigned char servAffectDuringUpg : 1;
|
||||
unsigned char deferActivation : 1;
|
||||
unsigned char ipmcDegradedDurinUpg: 1;
|
||||
unsigned char autRollbackOverride : 1;
|
||||
unsigned char fwUpgUndesirable : 1;
|
||||
#endif
|
||||
} ATTRIBUTE_PACKING bitField;
|
||||
} ATTRIBUTE_PACKING GlobalCapabilities;
|
||||
unsigned char upgradeTimeout;
|
||||
unsigned char selftestTimeout;
|
||||
unsigned char rollbackTimeout;
|
||||
unsigned char inaccessTimeout;
|
||||
struct HpmfwupgComponentBitMask componentsPresent;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx {
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesReq req;
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* COMPONENT PROPERTIES DEFINITIONS */
|
||||
typedef enum eHpmfwupgCompPropertiesSelect {
|
||||
HPMFWUPG_COMP_GEN_PROPERTIES = 0,
|
||||
HPMFWUPG_COMP_CURRENT_VERSION,
|
||||
HPMFWUPG_COMP_DESCRIPTION_STRING,
|
||||
HPMFWUPG_COMP_ROLLBACK_FIRMWARE_VERSION,
|
||||
HPMFWUPG_COMP_DEFERRED_FIRMWARE_VERSION,
|
||||
HPMFWUPG_COMP_RESERVED,
|
||||
HPMFWUPG_COMP_OEM_PROPERTIES = 192
|
||||
} tHpmfwupgCompPropertiesSelect;
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetComponentPropertiesReq {
|
||||
unsigned char picmgId;
|
||||
unsigned char componentId;
|
||||
unsigned char selector;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetGeneralPropResp {
|
||||
unsigned char picmgId;
|
||||
union {
|
||||
unsigned char byte;
|
||||
struct {
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char reserved : 2;
|
||||
unsigned char payloadColdReset : 1;
|
||||
unsigned char deferredActivation : 1;
|
||||
unsigned char comparisonSupport : 1;
|
||||
unsigned char preparationSupport : 1;
|
||||
unsigned char rollbackBackup : 2;
|
||||
#else
|
||||
unsigned char rollbackBackup : 2;
|
||||
unsigned char preparationSupport : 1;
|
||||
unsigned char comparisonSupport : 1;
|
||||
unsigned char deferredActivation : 1;
|
||||
unsigned char payloadColdReset : 1;
|
||||
unsigned char reserved : 2;
|
||||
#endif
|
||||
} ATTRIBUTE_PACKING bitfield;
|
||||
} ATTRIBUTE_PACKING GeneralCompProperties;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetCurrentVersionResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char currentVersion[HPMFWUPG_VERSION_SIZE];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetDescStringResp {
|
||||
unsigned char picmgId;
|
||||
char descString[HPMFWUPG_DESC_STRING_LENGTH];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetRollbackFwVersionResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char rollbackFwVersion[HPMFWUPG_VERSION_SIZE];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetDeferredFwVersionResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char deferredFwVersion[HPMFWUPG_VERSION_SIZE];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* GetComponentProperties - OEM properties (192) */
|
||||
#define HPMFWUPG_OEM_LENGTH 4
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetOemProperties {
|
||||
unsigned char picmgId;
|
||||
unsigned char oemRspData[HPMFWUPG_OEM_LENGTH];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetComponentPropertiesResp {
|
||||
union {
|
||||
struct HpmfwupgGetGeneralPropResp generalPropResp;
|
||||
struct HpmfwupgGetCurrentVersionResp currentVersionResp;
|
||||
struct HpmfwupgGetDescStringResp descStringResp;
|
||||
struct HpmfwupgGetRollbackFwVersionResp rollbackFwVersionResp;
|
||||
struct HpmfwupgGetDeferredFwVersionResp deferredFwVersionResp;
|
||||
struct HpmfwupgGetOemProperties oemProperties;
|
||||
} ATTRIBUTE_PACKING Response;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetComponentPropertiesCtx {
|
||||
struct HpmfwupgGetComponentPropertiesReq req;
|
||||
struct HpmfwupgGetComponentPropertiesResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* ABORT UPGRADE DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgAbortUpgradeReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgAbortUpgradeResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgAbortUpgradeCtx {
|
||||
struct HpmfwupgAbortUpgradeReq req;
|
||||
struct HpmfwupgAbortUpgradeResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* UPGRADE ACTIONS DEFINITIONS */
|
||||
typedef enum eHpmfwupgUpgradeAction {
|
||||
HPMFWUPG_UPGRADE_ACTION_BACKUP = 0,
|
||||
HPMFWUPG_UPGRADE_ACTION_PREPARE,
|
||||
HPMFWUPG_UPGRADE_ACTION_UPGRADE,
|
||||
HPMFWUPG_UPGRADE_ACTION_COMPARE,
|
||||
HPMFWUPG_UPGRADE_ACTION_INVALID = 0xff
|
||||
} tHpmfwupgUpgradeAction;
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgInitiateUpgradeActionReq {
|
||||
unsigned char picmgId;
|
||||
struct HpmfwupgComponentBitMask componentsMask;
|
||||
unsigned char upgradeAction;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgInitiateUpgradeActionResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgInitiateUpgradeActionCtx {
|
||||
struct HpmfwupgInitiateUpgradeActionReq req;
|
||||
struct HpmfwupgInitiateUpgradeActionResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* UPLOAD FIRMWARE BLOCK DEFINITIONS */
|
||||
#define HPMFWUPG_SEND_DATA_COUNT_KCS 30
|
||||
#define HPMFWUPG_SEND_DATA_COUNT_LAN 25
|
||||
#define HPMFWUPG_SEND_DATA_COUNT_IPMB 26
|
||||
#define HPMFWUPG_SEND_DATA_COUNT_IPMBL 26
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgUploadFirmwareBlockReq {
|
||||
unsigned char picmgId;
|
||||
unsigned char blockNumber;
|
||||
unsigned char data[0];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgUploadFirmwareBlockResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgUploadFirmwareBlockCtx {
|
||||
struct HpmfwupgUploadFirmwareBlockReq * req;
|
||||
struct HpmfwupgUploadFirmwareBlockResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* FINISH FIRMWARE UPLOAD DEFINITIONS */
|
||||
#define HPMFWUPG_IMAGE_SIZE_BYTE_COUNT 4
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgFinishFirmwareUploadReq {
|
||||
unsigned char picmgId;
|
||||
unsigned char componentId;
|
||||
unsigned char imageLength[HPMFWUPG_IMAGE_SIZE_BYTE_COUNT];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgFinishFirmwareUploadResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgFinishFirmwareUploadCtx {
|
||||
struct HpmfwupgFinishFirmwareUploadReq req;
|
||||
struct HpmfwupgFinishFirmwareUploadResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* ACTIVATE FW DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgActivateFirmwareReq {
|
||||
unsigned char picmgId;
|
||||
unsigned char rollback_override;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgActivateFirmwareResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgActivateFirmwareCtx {
|
||||
struct HpmfwupgActivateFirmwareReq req;
|
||||
struct HpmfwupgActivateFirmwareResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* GET UPGRADE STATUS DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetUpgradeStatusReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetUpgradeStatusResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char cmdInProcess;
|
||||
unsigned char lastCmdCompCode;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgGetUpgradeStatusCtx {
|
||||
struct HpmfwupgGetUpgradeStatusReq req;
|
||||
struct HpmfwupgGetUpgradeStatusResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* MANUAL FW ROLLBACK DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgManualFirmwareRollbackReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgManualFirmwareRollbackResp {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
struct HpmfwupgManualFirmwareRollbackCtx {
|
||||
struct HpmfwupgManualFirmwareRollbackReq req;
|
||||
struct HpmfwupgManualFirmwareRollbackResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* QUERY ROLLBACK STATUS DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQueryRollbackStatusReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQueryRollbackStatusResp {
|
||||
unsigned char picmgId;
|
||||
struct HpmfwupgComponentBitMask rollbackComp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQueryRollbackStatusCtx {
|
||||
struct HpmfwupgQueryRollbackStatusReq req;
|
||||
struct HpmfwupgQueryRollbackStatusResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* QUERY SELF TEST RESULT DEFINITIONS */
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQuerySelftestResultReq {
|
||||
unsigned char picmgId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQuerySelftestResultResp {
|
||||
unsigned char picmgId;
|
||||
unsigned char result1;
|
||||
unsigned char result2;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgQuerySelftestResultCtx {
|
||||
struct HpmfwupgQuerySelftestResultReq req;
|
||||
struct HpmfwupgQuerySelftestResultResp resp;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
/* HPM.1 IMAGE DEFINITIONS */
|
||||
#define HPMFWUPG_HEADER_SIGNATURE_LENGTH 8
|
||||
#define HPMFWUPG_MANUFATURER_ID_LENGTH 3
|
||||
#define HPMFWUPG_PRODUCT_ID_LENGTH 2
|
||||
#define HPMFWUPG_TIME_LENGTH 4
|
||||
#define HPMFWUPG_TIMEOUT_LENGTH 1
|
||||
#define HPMFWUPG_COMP_REVISION_LENGTH 2
|
||||
#define HPMFWUPG_FIRM_REVISION_LENGTH 6
|
||||
#define HPMFWUPG_IMAGE_HEADER_VERSION 0
|
||||
#define HPMFWUPG_IMAGE_SIGNATURE "PICMGFWU"
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
#pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgImageHeader {
|
||||
char signature[HPMFWUPG_HEADER_SIGNATURE_LENGTH];
|
||||
unsigned char formatVersion;
|
||||
unsigned char deviceId;
|
||||
unsigned char manId[HPMFWUPG_MANUFATURER_ID_LENGTH];
|
||||
unsigned char prodId[HPMFWUPG_PRODUCT_ID_LENGTH];
|
||||
unsigned char time[HPMFWUPG_TIME_LENGTH];
|
||||
union {
|
||||
struct {
|
||||
#if WORDS_BIGENDIAN
|
||||
unsigned char imageSelfTest : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char manRollback : 1;
|
||||
unsigned char servAffected : 1;
|
||||
unsigned char reserved : 4;
|
||||
#else
|
||||
unsigned char reserved : 4;
|
||||
unsigned char servAffected : 1;
|
||||
unsigned char manRollback : 1;
|
||||
unsigned char autRollback : 1;
|
||||
unsigned char imageSelfTest : 1;
|
||||
#endif
|
||||
} ATTRIBUTE_PACKING bitField;
|
||||
unsigned char byte;
|
||||
}ATTRIBUTE_PACKING imageCapabilities;
|
||||
struct HpmfwupgComponentBitMask components;
|
||||
unsigned char selfTestTimeout;
|
||||
unsigned char rollbackTimeout;
|
||||
unsigned char inaccessTimeout;
|
||||
unsigned char compRevision[HPMFWUPG_COMP_REVISION_LENGTH];
|
||||
unsigned char firmRevision[HPMFWUPG_FIRM_REVISION_LENGTH];
|
||||
unsigned short oemDataLength;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#define HPMFWUPG_DESCRIPTION_LENGTH 21
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgActionRecord {
|
||||
unsigned char actionType;
|
||||
struct HpmfwupgComponentBitMask components;
|
||||
unsigned char checksum;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#define HPMFWUPG_FIRMWARE_SIZE_LENGTH 4
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgFirmwareImage {
|
||||
unsigned char version[HPMFWUPG_FIRM_REVISION_LENGTH];
|
||||
char desc[HPMFWUPG_DESCRIPTION_LENGTH];
|
||||
unsigned char length[HPMFWUPG_FIRMWARE_SIZE_LENGTH];
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(1)
|
||||
#endif
|
||||
struct HpmfwupgUpgradeCtx {
|
||||
struct HpmfwupgComponentBitMask compUpdateMask;
|
||||
unsigned int imageSize;
|
||||
unsigned char* pImageData;
|
||||
unsigned char componentId;
|
||||
struct HpmfwupgGetTargetUpgCapabilitiesResp targetCap;
|
||||
struct HpmfwupgGetGeneralPropResp genCompProp[HPMFWUPG_COMPONENT_ID_MAX];
|
||||
struct ipm_devid_rsp devId;
|
||||
} ATTRIBUTE_PACKING;
|
||||
#ifdef HAVE_PRAGMA_PACK
|
||||
# pragma pack(0)
|
||||
#endif
|
||||
|
||||
typedef enum eHpmfwupgActionType {
|
||||
HPMFWUPG_ACTION_BACKUP_COMPONENTS = 0,
|
||||
HPMFWUPG_ACTION_PREPARE_COMPONENTS,
|
||||
HPMFWUPG_ACTION_UPLOAD_FIRMWARE,
|
||||
HPMFWUPG_ACTION_RESERVED = 0xFF
|
||||
} tHpmfwupgActionType;
|
||||
|
||||
/* FUNCTIONS PROTOTYPES */
|
||||
#define HPMFWUPG_MAJORMINOR_VERSION_SIZE 2
|
||||
|
||||
/* Options added for user to check the version and to view both the FILE and
|
||||
* TARGET Version
|
||||
*/
|
||||
#define VIEW_MODE 0x01
|
||||
#define DEBUG_MODE 0x02
|
||||
#define FORCE_MODE 0x04
|
||||
#define COMPARE_MODE 0x08
|
||||
|
||||
typedef struct _VERSIONINFO {
|
||||
unsigned char componentId;
|
||||
unsigned char targetMajor;
|
||||
unsigned char targetMinor;
|
||||
unsigned char targetAux[4];
|
||||
unsigned char rollbackMajor;
|
||||
unsigned char rollbackMinor;
|
||||
unsigned char rollbackAux[4];
|
||||
unsigned char deferredMajor;
|
||||
unsigned char deferredMinor;
|
||||
unsigned char deferredAux[4];
|
||||
unsigned char imageMajor;
|
||||
unsigned char imageMinor;
|
||||
unsigned char imageAux[4];
|
||||
unsigned char coldResetRequired;
|
||||
unsigned char rollbackSupported;
|
||||
char descString[HPMFWUPG_DESC_STRING_LENGTH + 1];
|
||||
}VERSIONINFO, *PVERSIONINFO;
|
||||
|
||||
VERSIONINFO gVersionInfo[HPMFWUPG_COMPONENT_ID_MAX];
|
||||
|
||||
#define TARGET_VER (0x01)
|
||||
#define ROLLBACK_VER (0x02)
|
||||
#define IMAGE_VER (0x04)
|
||||
|
||||
#endif /* IPMI_KFWUM_H */
|
@ -89,8 +89,9 @@ struct ipmi_session {
|
||||
uint32_t out_seq;
|
||||
uint32_t timeout;
|
||||
|
||||
struct sockaddr_in addr;
|
||||
struct sockaddr_storage addr;
|
||||
socklen_t addrlen;
|
||||
int ai_family; /* Protocol family for socket. */
|
||||
|
||||
/*
|
||||
* This struct holds state data specific to IPMI v2 / RMCP+ sessions
|
||||
@ -161,22 +162,26 @@ struct ipmi_intf_support {
|
||||
struct ipmi_intf {
|
||||
char name[16];
|
||||
char desc[128];
|
||||
char *devfile;
|
||||
int fd;
|
||||
int opened;
|
||||
int abort;
|
||||
int noanswer;
|
||||
int picmg_avail;
|
||||
IPMI_OEM manufacturer_id;
|
||||
|
||||
struct ipmi_session * session;
|
||||
struct ipmi_oem_handle * oem;
|
||||
struct ipmi_cmd * cmdlist;
|
||||
uint8_t target_ipmb_addr;
|
||||
uint32_t my_addr;
|
||||
uint32_t target_addr;
|
||||
uint8_t target_lun;
|
||||
uint8_t target_channel;
|
||||
uint32_t transit_addr;
|
||||
uint8_t transit_channel;
|
||||
uint8_t channel_buf_size;
|
||||
uint16_t max_request_data_size;
|
||||
uint16_t max_response_data_size;
|
||||
|
||||
uint8_t devnum;
|
||||
|
||||
@ -188,6 +193,9 @@ struct ipmi_intf {
|
||||
struct ipmi_rs *(*recv_sol)(struct ipmi_intf * intf);
|
||||
struct ipmi_rs *(*send_sol)(struct ipmi_intf * intf, struct ipmi_v2_payload * payload);
|
||||
int (*keepalive)(struct ipmi_intf * intf);
|
||||
int (*set_my_addr)(struct ipmi_intf * intf, uint8_t addr);
|
||||
void (*set_max_request_data_size)(struct ipmi_intf * intf, uint16_t size);
|
||||
void (*set_max_response_data_size)(struct ipmi_intf * intf, uint16_t size);
|
||||
};
|
||||
|
||||
struct ipmi_intf * ipmi_intf_load(char * name);
|
||||
@ -207,4 +215,7 @@ void ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout);
|
||||
void ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry);
|
||||
void ipmi_cleanup(struct ipmi_intf * intf);
|
||||
|
||||
#if defined(IPMI_INTF_LAN) || defined (IPMI_INTF_LANPLUS)
|
||||
int ipmi_intf_socket_connect(struct ipmi_intf * intf);
|
||||
#endif
|
||||
#endif /* IPMI_INTF_H */
|
@ -151,4 +151,20 @@ struct ipm_get_watchdog_rsp {
|
||||
#define IPM_WATCHDOG_CLEAR_BIOS_POST 0x04
|
||||
#define IPM_WATCHDOG_CLEAR_BIOS_FRB2 0x02
|
||||
|
||||
/* IPMI 2.0 command for system information*/
|
||||
#define IPMI_SET_SYS_INFO 0x58
|
||||
#define IPMI_GET_SYS_INFO 0x59
|
||||
#define IPMI_SYSINFO_SET0_SIZE 14
|
||||
#define IPMI_SYSINFO_SETN_SIZE 16
|
||||
|
||||
#define IPMI_SYSINFO_HOSTNAME 0x02
|
||||
#define IPMI_SYSINFO_PRIMARY_OS_NAME 0x03
|
||||
#define IPMI_SYSINFO_OS_NAME 0x04
|
||||
#define IPMI_SYSINFO_DELL_OS_VERSION 0xe4
|
||||
#define IPMI_SYSINFO_DELL_URL 0xde
|
||||
|
||||
int ipmi_mc_getsysinfo(struct ipmi_intf * intf, int param, int block, int set,
|
||||
int len, void *buffer);
|
||||
int ipmi_mc_setsysinfo(struct ipmi_intf * intf, int len, void *buffer);
|
||||
|
||||
#endif /*IPMI_MC_H */
|
@ -205,5 +205,7 @@ struct sAmcPortState {
|
||||
|
||||
|
||||
int ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv);
|
||||
uint8_t picmg_discover(struct ipmi_intf *intf);
|
||||
uint8_t ipmi_picmg_ipmb_address(struct ipmi_intf *intf);
|
||||
|
||||
#endif
|
@ -809,16 +809,16 @@ static const char *sensor_type_desc[] __attribute__ ((unused)) = {
|
||||
"Physical Security", "Platform Security", "Processor",
|
||||
"Power Supply", "Power Unit", "Cooling Device", "Other",
|
||||
"Memory", "Drive Slot / Bay", "POST Memory Resize",
|
||||
"System Firmwares", "Event Logging Disabled", "Watchdog",
|
||||
"System Firmwares", "Event Logging Disabled", "Watchdog1",
|
||||
"System Event", "Critical Interrupt", "Button",
|
||||
"Module / Board", "Microcontroller", "Add-in Card",
|
||||
"Chassis", "Chip Set", "Other FRU", "Cable / Interconnect",
|
||||
"Terminator", "System Boot Initiated", "Boot Error",
|
||||
"OS Boot", "OS Critical Stop", "Slot / Connector",
|
||||
"System ACPI Power State", "Watchdog", "Platform Alert",
|
||||
"System ACPI Power State", "Watchdog2", "Platform Alert",
|
||||
"Entity Presence", "Monitor ASIC", "LAN",
|
||||
"Management Subsystem Health", "Battery","Session Audit",
|
||||
"Version Change","FRU State" };
|
||||
"Management Subsys Health", "Battery", "Session Audit",
|
||||
"Version Change", "FRU State" };
|
||||
|
||||
struct sensor_reading {
|
||||
char s_id[17]; /* name of the sensor */
|
||||
@ -836,6 +836,30 @@ struct sensor_reading {
|
||||
const char *s_a_units; /* analog value units string */
|
||||
};
|
||||
|
||||
/*
|
||||
* Determine if bridging is necessary to address a sensor at the given
|
||||
* address (_addr) and (_chan) via the interface (_intf).
|
||||
*
|
||||
* If the sensor is being addressed on channel zero, it resides on
|
||||
* IPMB-0. If the interface target IPMB-0 address is exactly the same as
|
||||
* the sensor address then the sensor resides on the target IPMB-0
|
||||
* so we don't need extra levels of bridging to address the sensor.
|
||||
* Or
|
||||
* If the sensor target address and channel match the interface target address
|
||||
* and channel then there is no extra levels of bridging required.
|
||||
*
|
||||
* Note:
|
||||
* The target IPMB-0 address is the address of the SDR repository that was
|
||||
* accessed using the user specified bridging command line arguments.
|
||||
* Access to any sensor on the target IPMB-0 can be addressed using the
|
||||
* target address and transit address in the interface.
|
||||
*/
|
||||
#define BRIDGE_TO_SENSOR(_intf, _addr, _chan) \
|
||||
( !((_chan == 0 && _intf->target_ipmb_addr && \
|
||||
_intf->target_ipmb_addr == _addr) || \
|
||||
(_addr == _intf->target_addr && _chan == _intf->target_channel)) )
|
||||
|
||||
|
||||
struct ipmi_sdr_iterator *ipmi_sdr_start(struct ipmi_intf *intf,
|
||||
int use_builtin);
|
||||
struct sdr_get_rs *ipmi_sdr_get_next_header(struct ipmi_intf *intf,
|
@ -107,6 +107,7 @@ struct standard_spec_sel_rec{
|
||||
#define SENSOR_TYPE_OEM_NFATAL_ERROR 0xC2
|
||||
#define SENSOR_TYPE_OEM_FATAL_ERROR 0xC3
|
||||
#define SENSOR_TYPE_TXT_CMD_ERROR 0x20
|
||||
#define SENSOR_TYPE_SUPERMICRO_OEM 0xD0
|
||||
/* End of Macro for DELL Specific */
|
||||
#define SEL_OEM_TS_DATA_LEN 6
|
||||
#define SEL_OEM_NOTS_DATA_LEN 13
|
||||
@ -326,6 +327,8 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x07, 0x08, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Disabled" },
|
||||
{ 0x07, 0x09, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Terminator presence detected" },
|
||||
{ 0x07, 0x0a, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Throttled" },
|
||||
{ 0x07, 0x0b, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Uncorrectable machine check exception" },
|
||||
{ 0x07, 0x0c, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Processor", "Correctable machine check error" },
|
||||
|
||||
{ 0x08, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Presence detected" },
|
||||
{ 0x08, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Failure detected" },
|
||||
@ -336,7 +339,10 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x08, 0x06, 0x00, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error: Vendor Mismatch" },
|
||||
{ 0x08, 0x06, 0x01, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error: Revision Mismatch" },
|
||||
{ 0x08, 0x06, 0x02, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error: Processor Missing" },
|
||||
{ 0x08, 0x06, 0x03, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error: Power Supply Rating Mismatch" },
|
||||
{ 0x08, 0x06, 0x04, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error: Voltage Rating Mismatch" },
|
||||
{ 0x08, 0x06, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Config Error" },
|
||||
{ 0x08, 0x06, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Supply", "Power Supply Inactive" },
|
||||
|
||||
{ 0x09, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Power off/down" },
|
||||
{ 0x09, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Power Unit", "Power cycle" },
|
||||
@ -360,6 +366,7 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x0c, 0x07, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Configuration Error" },
|
||||
{ 0x0c, 0x08, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Spare" },
|
||||
{ 0x0c, 0x09, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Throttled" },
|
||||
{ 0x0c, 0x0a, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Memory", "Critical Overtemperature" },
|
||||
|
||||
{ 0x0d, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Drive Slot", "Drive Present" },
|
||||
{ 0x0d, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Drive Slot", "Drive Fault" },
|
||||
@ -479,6 +486,7 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x13, 0x08, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Uncorrectable error" },
|
||||
{ 0x13, 0x09, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Fatal NMI" },
|
||||
{ 0x13, 0x0a, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Fatal Error" },
|
||||
{ 0x13, 0x0b, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Critical Interrupt", "Bus Degraded" },
|
||||
|
||||
{ 0x14, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Button", "Power Button pressed" },
|
||||
{ 0x14, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Button", "Sleep Button pressed" },
|
||||
@ -491,6 +499,7 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x17, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Add-in Card", NULL },
|
||||
{ 0x18, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Chassis", NULL },
|
||||
{ 0x19, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Chip Set", NULL },
|
||||
{ 0x19, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Chip Set", "Thermal Trip" },
|
||||
{ 0x1a, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Other FRU", NULL },
|
||||
|
||||
{ 0x1b, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Cable/Interconnect", "Connected" },
|
||||
@ -520,6 +529,10 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x1f, 0x04, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "CD-ROM boot completed" },
|
||||
{ 0x1f, 0x05, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "ROM boot completed" },
|
||||
{ 0x1f, 0x06, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "boot completed - device not specified" },
|
||||
{ 0x1f, 0x07, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "Installation started" },
|
||||
{ 0x1f, 0x08, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "Installation completed" },
|
||||
{ 0x1f, 0x09, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "Installation aborted" },
|
||||
{ 0x1f, 0x0a, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Boot", "Installation failed" },
|
||||
|
||||
{ 0x20, 0x00, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Stop/Shutdown", "Error during system startup" },
|
||||
{ 0x20, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "OS Stop/Shutdown", "Run-time critical stop" },
|
||||
@ -676,6 +689,56 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
{ 0x00, 0x00, 0x00, 0x00, NULL, NULL },
|
||||
};
|
||||
|
||||
static uint16_t supermicro_x9dal[] = {
|
||||
0x0635
|
||||
};
|
||||
|
||||
static uint16_t supermicro_x9db[] = {
|
||||
0x0733, 0x0722, 0x0703, 0x0721, 0x0716, 0x0637
|
||||
};
|
||||
|
||||
static uint16_t supermicro_x9sb[] = {
|
||||
0x0651
|
||||
};
|
||||
|
||||
static uint16_t supermicro_x9[] = {
|
||||
0x0635, 0x0733, 0x0722, 0x0703, 0x0721, 0x0716, 0x0637, 0x0651
|
||||
};
|
||||
|
||||
static uint16_t supermicro_b8[] = {
|
||||
0x000A, 0x061c, 0x0620, 0x0101, 0x061f, 0x0612, 0x061e
|
||||
};
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
static uint16_t supermicro_p8[] = {
|
||||
0x6480, 0x7380, 0x6280, 0x7480, 0x5980
|
||||
};
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
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,
|
||||
0x0009
|
||||
};
|
||||
|
||||
int ipmi_sel_main(struct ipmi_intf *, int, char **);
|
||||
void ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt);
|
||||
void ipmi_sel_print_std_entry_verbose(struct ipmi_intf * intf, struct sel_event_record * evt);
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -39,19 +39,35 @@
|
||||
#include <ipmitool/ipmi.h>
|
||||
#include <ipmitool/ipmi_sdr.h>
|
||||
|
||||
#define IPMI_NETFN_SUNOEM 0x2e
|
||||
#define IPMI_NETFN_SUNOEM 0x2e
|
||||
|
||||
#define IPMI_SUNOEM_SET_SSH_KEY 0x01
|
||||
#define IPMI_SUNOEM_DEL_SSH_KEY 0x02
|
||||
#define IPMI_SUNOEM_GET_HEALTH_STATUS 0x10
|
||||
#define IPMI_SUNOEM_SET_FAN_SPEED 0x20
|
||||
#define IPMI_SUNOEM_LED_GET 0x21
|
||||
#define IPMI_SUNOEM_LED_SET 0x22
|
||||
#define IPMI_SUNOEM_SET_SSH_KEY 0x01
|
||||
#define IPMI_SUNOEM_DEL_SSH_KEY 0x02
|
||||
#define IPMI_SUNOEM_GET_HEALTH_STATUS 0x10
|
||||
#define IPMI_SUNOEM_CLI 0x19
|
||||
#define IPMI_SUNOEM_SET_FAN_SPEED 0x20
|
||||
#define IPMI_SUNOEM_LED_GET 0x21
|
||||
#define IPMI_SUNOEM_LED_SET 0x22
|
||||
#define IPMI_SUNOEM_ECHO 0x23
|
||||
#define IPMI_SUNOEM_VERSION 0x24
|
||||
#define IPMI_SUNOEM_NACNAME 0x29
|
||||
#define IPMI_SUNOEM_GETVAL 0x2A
|
||||
#define IPMI_SUNOEM_SETVAL 0x2C
|
||||
#define IPMI_SUNOEM_SENSOR_SET 0x3A
|
||||
#define IPMI_SUNOEM_SET_FAN_MODE 0x41
|
||||
#define IPMI_SUNOEM_CORE_TUNNEL 0x44
|
||||
|
||||
/*
|
||||
* Error codes of sunoem functions
|
||||
*/
|
||||
typedef enum {
|
||||
SUNOEM_EC_SUCCESS = 0,
|
||||
SUNOEM_EC_INVALID_ARG = 1,
|
||||
SUNOEM_EC_BMC_NOT_RESPONDING = 2,
|
||||
SUNOEM_EC_BMC_CCODE_NONZERO = 3
|
||||
} sunoem_ec_t;
|
||||
|
||||
int ipmi_sunoem_main(struct ipmi_intf *, int, char **);
|
||||
|
||||
struct ipmi_rs * sunoem_led_get(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, int ledtype);
|
||||
struct ipmi_rs * sunoem_led_set(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, int ledtype, int ledmode);
|
||||
|
||||
#endif /*IPMI_SUNOEM_H*/
|
||||
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef IPMI_KFWUM_H
|
||||
#define IPMI_KFWUM_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <ipmitool/ipmi.h>
|
||||
|
||||
|
||||
int ipmi_fwum_main(struct ipmi_intf *, int, char **);
|
||||
|
||||
#endif /* IPMI_KFWUM_H */
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef IPMI_HPMFWUPG_H
|
||||
#define IPMI_HPMFWUPG_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <ipmitool/ipmi.h>
|
||||
|
||||
int ipmi_hpmfwupg_main(struct ipmi_intf *, int, char **);
|
||||
|
||||
#endif /* IPMI_KFWUM_H */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,855 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2005 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <ipmitool/ipmi.h>
|
||||
#include <ipmitool/ipmi_intf.h>
|
||||
#include <ipmitool/helper.h>
|
||||
#include <ipmitool/log.h>
|
||||
#include <ipmitool/ipmi_sel.h>
|
||||
#include <ipmitool/ipmi_sdr.h>
|
||||
#include <ipmitool/ipmi_strings.h>
|
||||
#include <ipmitool/ipmi_channel.h>
|
||||
#include <ipmitool/ipmi_sunoem.h>
|
||||
#include <ipmitool/ipmi_raw.h>
|
||||
|
||||
static const struct valstr sunoem_led_type_vals[] = {
|
||||
{ 0, "OK2RM" },
|
||||
{ 1, "SERVICE" },
|
||||
{ 2, "ACT" },
|
||||
{ 3, "LOCATE" },
|
||||
{ 0xFF, NULL },
|
||||
};
|
||||
|
||||
static const struct valstr sunoem_led_mode_vals[] = {
|
||||
{ 0, "OFF" },
|
||||
{ 1, "ON" },
|
||||
{ 2, "STANDBY" },
|
||||
{ 3, "SLOW" },
|
||||
{ 4, "FAST" },
|
||||
{ 0xFF, NULL },
|
||||
};
|
||||
static const struct valstr sunoem_led_mode_optvals[] = {
|
||||
{ 0, "STEADY_OFF" },
|
||||
{ 1, "STEADY_ON" },
|
||||
{ 2, "STANDBY_BLINK" },
|
||||
{ 3, "SLOW_BLINK" },
|
||||
{ 4, "FAST_BLINK" },
|
||||
{ 0xFF, NULL },
|
||||
};
|
||||
|
||||
int is_sbcmd = 0;
|
||||
|
||||
static void
|
||||
ipmi_sunoem_usage(void)
|
||||
{
|
||||
lprintf(LOG_NOTICE, "usage: sunoem <command> [option...]");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " fan speed <0-100>");
|
||||
lprintf(LOG_NOTICE, " Set system fan speed (PWM duty cycle)");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " sshkey set <userid> <id_rsa.pub>");
|
||||
lprintf(LOG_NOTICE, " Set ssh key for a userid into authorized_keys,");
|
||||
lprintf(LOG_NOTICE, " view users with 'user list' command.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " sshkey del <userid>");
|
||||
lprintf(LOG_NOTICE, " Delete ssh key for userid from authorized_keys,");
|
||||
lprintf(LOG_NOTICE, " view users with 'user list' command.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " led get <sensorid> [ledtype]");
|
||||
lprintf(LOG_NOTICE,
|
||||
" Read status of LED found in Generic Device Locator.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " led set <sensorid> <ledmode> [ledtype]");
|
||||
lprintf(LOG_NOTICE,
|
||||
" Set mode of LED found in Generic Device Locator.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " sbled get <sensorid> [ledtype]");
|
||||
lprintf(LOG_NOTICE,
|
||||
" Read status of LED found in Generic Device Locator");
|
||||
lprintf(LOG_NOTICE, " for Sun Blade Modular Systems.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " sbled set <sensorid> <ledmode> [ledtype]");
|
||||
lprintf(LOG_NOTICE, " Set mode of LED found in Generic Device Locator");
|
||||
lprintf(LOG_NOTICE, " for Sun Blade Modular Systems.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE,
|
||||
" Use 'sdr list generic' command to get list of Generic");
|
||||
lprintf(LOG_NOTICE, " Devices that are controllable LEDs.");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " Required SIS LED Mode:");
|
||||
lprintf(LOG_NOTICE, " OFF Off");
|
||||
lprintf(LOG_NOTICE, " ON Steady On");
|
||||
lprintf(LOG_NOTICE, " STANDBY 100ms on 2900ms off blink rate");
|
||||
lprintf(LOG_NOTICE, " SLOW 1HZ blink rate");
|
||||
lprintf(LOG_NOTICE, " FAST 4HZ blink rate");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
lprintf(LOG_NOTICE, " Optional SIS LED Type:");
|
||||
lprintf(LOG_NOTICE, " OK2RM OK to Remove");
|
||||
lprintf(LOG_NOTICE, " SERVICE Service Required");
|
||||
lprintf(LOG_NOTICE, " ACT Activity");
|
||||
lprintf(LOG_NOTICE, " LOCATE Locate");
|
||||
lprintf(LOG_NOTICE, "");
|
||||
}
|
||||
|
||||
/*
|
||||
* IPMI Request Data: 1 byte
|
||||
*
|
||||
* [byte 0] FanSpeed Fan speed as percentage
|
||||
*/
|
||||
static int
|
||||
ipmi_sunoem_fan_speed(struct ipmi_intf * intf, uint8_t speed)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
|
||||
/*
|
||||
* sunoem fan speed <percent>
|
||||
*/
|
||||
|
||||
if (speed > 100) {
|
||||
lprintf(LOG_NOTICE, "Invalid fan speed: %d", speed);
|
||||
return -1;
|
||||
}
|
||||
|
||||
req.msg.netfn = IPMI_NETFN_SUNOEM;
|
||||
req.msg.cmd = IPMI_SUNOEM_SET_FAN_SPEED;
|
||||
req.msg.data = &speed;
|
||||
req.msg.data_len = 1;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Sun OEM Set Fan Speed command failed");
|
||||
return -1;
|
||||
}
|
||||
else if (rsp->ccode > 0) {
|
||||
lprintf(LOG_ERR, "Sun OEM Set Fan Speed command failed: %s",
|
||||
val2str(rsp->ccode, completion_code_vals));
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Set Fan speed to %d%%\n", speed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
__sdr_list_empty(struct sdr_record_list * head)
|
||||
{
|
||||
struct sdr_record_list * e, * f;
|
||||
for (e = head; e != NULL; e = f) {
|
||||
f = e->next;
|
||||
free(e);
|
||||
}
|
||||
head = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
led_print(const char * name, uint8_t state)
|
||||
{
|
||||
if (csv_output)
|
||||
printf("%s,%s\n", name, val2str(state, sunoem_led_mode_vals));
|
||||
else
|
||||
printf("%-16s | %s\n", name, val2str(state, sunoem_led_mode_vals));
|
||||
}
|
||||
|
||||
struct ipmi_rs *
|
||||
sunoem_led_get(struct ipmi_intf * intf,
|
||||
struct sdr_record_generic_locator * dev,
|
||||
int ledtype)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
uint8_t rqdata[7];
|
||||
int rqdata_len = 5;
|
||||
|
||||
if (dev == NULL)
|
||||
return NULL;
|
||||
|
||||
rqdata[0] = dev->dev_slave_addr;
|
||||
if (ledtype == 0xFF)
|
||||
rqdata[1] = dev->oem;
|
||||
else
|
||||
rqdata[1] = ledtype;
|
||||
rqdata[2] = dev->dev_access_addr;
|
||||
rqdata[3] = dev->oem;
|
||||
if (is_sbcmd) {
|
||||
rqdata[4] = dev->entity.id;
|
||||
rqdata[5] = dev->entity.instance;
|
||||
rqdata[6] = 0;
|
||||
rqdata_len = 7;
|
||||
}
|
||||
else {
|
||||
rqdata[4] = 0;
|
||||
}
|
||||
|
||||
req.msg.netfn = IPMI_NETFN_SUNOEM;
|
||||
req.msg.cmd = IPMI_SUNOEM_LED_GET;
|
||||
req.msg.lun = dev->lun;
|
||||
req.msg.data = rqdata;
|
||||
req.msg.data_len = rqdata_len;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Sun OEM Get LED command failed");
|
||||
return NULL;
|
||||
}
|
||||
else if (rsp->ccode > 0) {
|
||||
lprintf(LOG_ERR, "Sun OEM Get LED command failed: %s",
|
||||
val2str(rsp->ccode, completion_code_vals));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return rsp;
|
||||
}
|
||||
|
||||
struct ipmi_rs *
|
||||
sunoem_led_set(struct ipmi_intf * intf,
|
||||
struct sdr_record_generic_locator * dev,
|
||||
int ledtype, int ledmode)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
uint8_t rqdata[9];
|
||||
int rqdata_len = 7;
|
||||
|
||||
if (dev == NULL)
|
||||
return NULL;
|
||||
|
||||
rqdata[0] = dev->dev_slave_addr;
|
||||
if (ledtype == 0xFF)
|
||||
rqdata[1] = dev->oem;
|
||||
else
|
||||
rqdata[1] = ledtype;
|
||||
rqdata[2] = dev->dev_access_addr;
|
||||
rqdata[3] = dev->oem;
|
||||
rqdata[4] = ledmode;
|
||||
if (is_sbcmd) {
|
||||
rqdata[5] = dev->entity.id;
|
||||
rqdata[6] = dev->entity.instance;
|
||||
rqdata[7] = 0;
|
||||
rqdata[8] = 0;
|
||||
rqdata_len = 9;
|
||||
}
|
||||
else {
|
||||
rqdata[5] = 0;
|
||||
rqdata[6] = 0;
|
||||
}
|
||||
|
||||
req.msg.netfn = IPMI_NETFN_SUNOEM;
|
||||
req.msg.cmd = IPMI_SUNOEM_LED_SET;
|
||||
req.msg.lun = dev->lun;
|
||||
req.msg.data = rqdata;
|
||||
req.msg.data_len = rqdata_len;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Sun OEM Set LED command failed");
|
||||
return NULL;
|
||||
}
|
||||
else if (rsp->ccode > 0) {
|
||||
lprintf(LOG_ERR, "Sun OEM Set LED command failed: %s",
|
||||
val2str(rsp->ccode, completion_code_vals));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return rsp;
|
||||
}
|
||||
|
||||
static void
|
||||
sunoem_led_get_byentity(struct ipmi_intf * intf, uint8_t entity_id,
|
||||
uint8_t entity_inst, int ledtype)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct sdr_record_list *elist, *e;
|
||||
struct entity_id entity;
|
||||
|
||||
if (entity_id == 0)
|
||||
return;
|
||||
|
||||
/* lookup sdrs with this entity */
|
||||
memset(&entity, 0, sizeof(struct entity_id));
|
||||
entity.id = entity_id;
|
||||
entity.instance = entity_inst;
|
||||
|
||||
elist = ipmi_sdr_find_sdr_byentity(intf, &entity);
|
||||
|
||||
/* for each generic sensor set its led state */
|
||||
for (e = elist; e != NULL; e = e->next) {
|
||||
if (e->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
||||
continue;
|
||||
rsp = sunoem_led_get(intf, e->record.genloc, ledtype);
|
||||
if (rsp && rsp->data_len == 1) {
|
||||
led_print((const char *)e->record.genloc->id_string, rsp->data[0]);
|
||||
}
|
||||
}
|
||||
|
||||
__sdr_list_empty(elist);
|
||||
}
|
||||
|
||||
static void
|
||||
sunoem_led_set_byentity(struct ipmi_intf * intf, uint8_t entity_id,
|
||||
uint8_t entity_inst, int ledtype, int ledmode)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct sdr_record_list *elist, *e;
|
||||
struct entity_id entity;
|
||||
|
||||
if (entity_id == 0)
|
||||
return;
|
||||
|
||||
/* lookup sdrs with this entity */
|
||||
memset(&entity, 0, sizeof(struct entity_id));
|
||||
entity.id = entity_id;
|
||||
entity.instance = entity_inst;
|
||||
|
||||
elist = ipmi_sdr_find_sdr_byentity(intf, &entity);
|
||||
|
||||
/* for each generic sensor set its led state */
|
||||
for (e = elist; e != NULL; e = e->next) {
|
||||
if (e->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
||||
continue;
|
||||
rsp = sunoem_led_set(intf, e->record.genloc, ledtype, ledmode);
|
||||
if (rsp && rsp->data_len == 0) {
|
||||
led_print((const char *)e->record.genloc->id_string, ledmode);
|
||||
}
|
||||
}
|
||||
|
||||
__sdr_list_empty(elist);
|
||||
}
|
||||
|
||||
/*
|
||||
* IPMI Request Data: 5 bytes
|
||||
*
|
||||
* [byte 0] devAddr Value from the "Device Slave Address" field in
|
||||
* LED's Generic Device Locator record in the SDR
|
||||
* [byte 1] led LED Type: OK2RM, ACT, LOCATE, SERVICE
|
||||
* [byte 2] ctrlrAddr Controller address; value from the "Device
|
||||
* Access Address" field, 0x20 if the LED is local
|
||||
* [byte 3] hwInfo The OEM field from the SDR record
|
||||
* [byte 4] force 1 = directly access the device
|
||||
* 0 = go thru its controller
|
||||
* Ignored if LED is local
|
||||
*
|
||||
* The format below is for Sun Blade Modular systems only
|
||||
* [byte 4] entityID The entityID field from the SDR record
|
||||
* [byte 5] entityIns The entityIns field from the SDR record
|
||||
* [byte 6] force 1 = directly access the device
|
||||
* 0 = go thru its controller
|
||||
* Ignored if LED is local
|
||||
*/
|
||||
static int
|
||||
ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct sdr_record_list *sdr;
|
||||
struct sdr_record_list *alist, *a;
|
||||
struct sdr_record_entity_assoc *assoc;
|
||||
int ledtype = 0xFF;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* sunoem led/sbled get <id> [type]
|
||||
*/
|
||||
|
||||
if (argc < 1 || strncmp(argv[0], "help", 4) == 0) {
|
||||
ipmi_sunoem_usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc > 1) {
|
||||
ledtype = str2val(argv[1], sunoem_led_type_vals);
|
||||
if (ledtype == 0xFF)
|
||||
lprintf(LOG_ERR, "Unknow ledtype, will use data from the SDR oem field");
|
||||
}
|
||||
|
||||
if (strncasecmp(argv[0], "all", 3) == 0) {
|
||||
/* do all generic sensors */
|
||||
alist = ipmi_sdr_find_sdr_bytype(intf,
|
||||
SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR);
|
||||
for (a = alist; a != NULL; a = a->next) {
|
||||
if (a->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
||||
continue;
|
||||
if (a->record.genloc->entity.logical)
|
||||
continue;
|
||||
rsp = sunoem_led_get(intf, a->record.genloc, ledtype);
|
||||
if (rsp && rsp->data_len == 1) {
|
||||
led_print((const char *)a->record.genloc->id_string, rsp->data[0]);
|
||||
}
|
||||
}
|
||||
__sdr_list_empty(alist);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* look up generic device locator record in SDR */
|
||||
sdr = ipmi_sdr_find_sdr_byid(intf, argv[0]);
|
||||
|
||||
if (sdr == NULL) {
|
||||
lprintf(LOG_ERR, "No Sensor Data Record found for %s", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) {
|
||||
lprintf(LOG_ERR, "Invalid SDR type %d", sdr->type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!sdr->record.genloc->entity.logical) {
|
||||
/*
|
||||
* handle physical entity
|
||||
*/
|
||||
rsp = sunoem_led_get(intf, sdr->record.genloc, ledtype);
|
||||
if (rsp && rsp->data_len == 1) {
|
||||
led_print((const char *)sdr->record.genloc->id_string, rsp->data[0]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* handle logical entity for LED grouping
|
||||
*/
|
||||
|
||||
lprintf(LOG_INFO, "LED %s is logical device", argv[0]);
|
||||
|
||||
/* get entity assoc records */
|
||||
alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_ENTITY_ASSOC);
|
||||
for (a = alist; a != NULL; a = a->next) {
|
||||
if (a->type != SDR_RECORD_TYPE_ENTITY_ASSOC)
|
||||
continue;
|
||||
assoc = a->record.entassoc;
|
||||
if (assoc == NULL)
|
||||
continue;
|
||||
|
||||
/* check that the entity id/instance matches our generic record */
|
||||
if (assoc->entity.id != sdr->record.genloc->entity.id ||
|
||||
assoc->entity.instance != sdr->record.genloc->entity.instance)
|
||||
continue;
|
||||
|
||||
if (assoc->flags.isrange) {
|
||||
/*
|
||||
* handle ranged entity associations
|
||||
*
|
||||
* the test for non-zero entity id is handled in
|
||||
* sunoem_led_get_byentity()
|
||||
*/
|
||||
|
||||
/* first range set - id 1 and 2 must be equal */
|
||||
if (assoc->entity_id_1 == assoc->entity_id_2)
|
||||
for (i = assoc->entity_inst_1; i <= assoc->entity_inst_2; i++)
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_1, i, ledtype);
|
||||
|
||||
/* second range set - id 3 and 4 must be equal */
|
||||
if (assoc->entity_id_3 == assoc->entity_id_4)
|
||||
for (i = assoc->entity_inst_3; i <= assoc->entity_inst_4; i++)
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_3, i, ledtype);
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* handle entity list
|
||||
*/
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_1,
|
||||
assoc->entity_inst_1, ledtype);
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_2,
|
||||
assoc->entity_inst_2, ledtype);
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_3,
|
||||
assoc->entity_inst_3, ledtype);
|
||||
sunoem_led_get_byentity(intf, assoc->entity_id_4,
|
||||
assoc->entity_inst_4, ledtype);
|
||||
}
|
||||
}
|
||||
|
||||
__sdr_list_empty(alist);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* IPMI Request Data: 7 bytes
|
||||
*
|
||||
* [byte 0] devAddr Value from the "Device Slave Address" field in
|
||||
* LED's Generic Device Locator record in the SDR
|
||||
* [byte 1] led LED Type: OK2RM, ACT, LOCATE, SERVICE
|
||||
* [byte 2] ctrlrAddr Controller address; value from the "Device
|
||||
* Access Address" field, 0x20 if the LED is local
|
||||
* [byte 3] hwInfo The OEM field from the SDR record
|
||||
* [byte 4] mode LED Mode: OFF, ON, STANDBY, SLOW, FAST
|
||||
* [byte 5] force TRUE - directly access the device
|
||||
* FALSE - go thru its controller
|
||||
* Ignored if LED is local
|
||||
* [byte 6] role Used by BMC for authorization purposes
|
||||
*
|
||||
* The format below is for Sun Blade Modular systems only
|
||||
* [byte 5] entityID The entityID field from the SDR record
|
||||
* [byte 6] entityIns The entityIns field from the SDR record
|
||||
* [byte 7] force TRUE - directly access the device
|
||||
* FALSE - go thru its controller
|
||||
* Ignored if LED is local
|
||||
* [byte 8] role Used by BMC for authorization purposes
|
||||
*
|
||||
*
|
||||
* IPMI Response Data: 1 byte
|
||||
*
|
||||
* [byte 0] mode LED Mode: OFF, ON, STANDBY, SLOW, FAST
|
||||
*/
|
||||
|
||||
static int
|
||||
ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct sdr_record_list *sdr;
|
||||
struct sdr_record_list *alist, *a;
|
||||
struct sdr_record_entity_assoc *assoc;
|
||||
int ledmode;
|
||||
int ledtype = 0xFF;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* sunoem led/sbled set <id> <mode> [type]
|
||||
*/
|
||||
|
||||
if (argc < 2 || strncmp(argv[0], "help", 4) == 0) {
|
||||
ipmi_sunoem_usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
ledmode = str2val(argv[1], sunoem_led_mode_vals);
|
||||
if (ledmode == 0xFF) {
|
||||
ledmode = str2val(argv[1], sunoem_led_mode_optvals);
|
||||
if (ledmode == 0xFF) {
|
||||
lprintf(LOG_NOTICE, "Invalid LED Mode: %s", argv[1]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > 3) {
|
||||
ledtype = str2val(argv[2], sunoem_led_type_vals);
|
||||
if (ledtype == 0xFF)
|
||||
lprintf(LOG_ERR, "Unknow ledtype, will use data from the SDR oem field");
|
||||
}
|
||||
|
||||
if (strncasecmp(argv[0], "all", 3) == 0) {
|
||||
/* do all generic sensors */
|
||||
alist = ipmi_sdr_find_sdr_bytype(intf,
|
||||
SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR);
|
||||
for (a = alist; a != NULL; a = a->next) {
|
||||
if (a->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
||||
continue;
|
||||
if (a->record.genloc->entity.logical)
|
||||
continue;
|
||||
rsp = sunoem_led_set(intf, a->record.genloc, ledtype, ledmode);
|
||||
if (rsp && rsp->ccode == 0) {
|
||||
led_print((const char *)a->record.genloc->id_string, ledmode);
|
||||
}
|
||||
}
|
||||
__sdr_list_empty(alist);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* look up generic device locator records in SDR */
|
||||
sdr = ipmi_sdr_find_sdr_byid(intf, argv[0]);
|
||||
|
||||
if (sdr == NULL) {
|
||||
lprintf(LOG_ERR, "No Sensor Data Record found for %s",
|
||||
argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) {
|
||||
lprintf(LOG_ERR, "Invalid SDR type %d", sdr->type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!sdr->record.genloc->entity.logical) {
|
||||
/*
|
||||
* handle physical entity
|
||||
*/
|
||||
rsp = sunoem_led_set(intf, sdr->record.genloc, ledtype, ledmode);
|
||||
if (rsp && rsp->ccode == 0) {
|
||||
led_print(argv[0], ledmode);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* handle logical entity for LED grouping
|
||||
*/
|
||||
|
||||
lprintf(LOG_INFO, "LED %s is logical device", argv[0]);
|
||||
|
||||
/* get entity assoc records */
|
||||
alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_ENTITY_ASSOC);
|
||||
for (a = alist; a != NULL; a = a->next) {
|
||||
if (a->type != SDR_RECORD_TYPE_ENTITY_ASSOC)
|
||||
continue;
|
||||
assoc = a->record.entassoc;
|
||||
if (assoc == NULL)
|
||||
continue;
|
||||
|
||||
/* check that the entity id/instance matches our generic record */
|
||||
if (assoc->entity.id != sdr->record.genloc->entity.id ||
|
||||
assoc->entity.instance != sdr->record.genloc->entity.instance)
|
||||
continue;
|
||||
|
||||
if (assoc->flags.isrange) {
|
||||
/*
|
||||
* handle ranged entity associations
|
||||
*
|
||||
* the test for non-zero entity id is handled in
|
||||
* sunoem_led_get_byentity()
|
||||
*/
|
||||
|
||||
/* first range set - id 1 and 2 must be equal */
|
||||
if (assoc->entity_id_1 == assoc->entity_id_2)
|
||||
for (i = assoc->entity_inst_1; i <= assoc->entity_inst_2; i++)
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_1, i, ledtype,
|
||||
ledmode);
|
||||
|
||||
/* second range set - id 3 and 4 must be equal */
|
||||
if (assoc->entity_id_3 == assoc->entity_id_4)
|
||||
for (i = assoc->entity_inst_3; i <= assoc->entity_inst_4; i++)
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_3, i, ledtype,
|
||||
ledmode);
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* handle entity list
|
||||
*/
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_1,
|
||||
assoc->entity_inst_1, ledtype, ledmode);
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_2,
|
||||
assoc->entity_inst_2, ledtype, ledmode);
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_3,
|
||||
assoc->entity_inst_3, ledtype, ledmode);
|
||||
sunoem_led_set_byentity(intf, assoc->entity_id_4,
|
||||
assoc->entity_inst_4, ledtype, ledmode);
|
||||
}
|
||||
}
|
||||
|
||||
__sdr_list_empty(alist);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ipmi_sunoem_sshkey_del(struct ipmi_intf * intf, uint8_t uid)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
|
||||
memset(&req, 0, sizeof(struct ipmi_rq));
|
||||
req.msg.netfn = IPMI_NETFN_SUNOEM;
|
||||
req.msg.cmd = IPMI_SUNOEM_DEL_SSH_KEY;
|
||||
req.msg.data = &uid;
|
||||
req.msg.data_len = 1;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Unable to delete ssh key for UID %d", uid);
|
||||
return -1;
|
||||
}
|
||||
else if (rsp->ccode > 0) {
|
||||
lprintf(LOG_ERR, "Unable to delete ssh key for UID %d: %s", uid,
|
||||
val2str(rsp->ccode, completion_code_vals));
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Deleted SSH key for user id %d\n", uid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define SSHKEY_BLOCK_SIZE 64
|
||||
static int
|
||||
ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
FILE * fp;
|
||||
int count;
|
||||
uint16_t i_size, r, size;
|
||||
uint8_t wbuf[SSHKEY_BLOCK_SIZE + 3];
|
||||
|
||||
if (ifile == NULL) {
|
||||
lprintf(LOG_ERR, "Invalid or misisng input filename");
|
||||
return -1;
|
||||
}
|
||||
|
||||
fp = ipmi_open_file_read(ifile);
|
||||
if (fp == NULL) {
|
||||
lprintf(LOG_ERR, "Unable to open file %s for reading", ifile);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("Setting SSH key for user id %d...", uid);
|
||||
|
||||
memset(&req, 0, sizeof(struct ipmi_rq));
|
||||
req.msg.netfn = IPMI_NETFN_SUNOEM;
|
||||
req.msg.cmd = IPMI_SUNOEM_SET_SSH_KEY;
|
||||
req.msg.data = wbuf;
|
||||
|
||||
fseek(fp, 0, SEEK_END);
|
||||
size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
|
||||
for (r = 0; r < size; r += i_size) {
|
||||
i_size = size - r;
|
||||
if (i_size > SSHKEY_BLOCK_SIZE)
|
||||
i_size = SSHKEY_BLOCK_SIZE;
|
||||
|
||||
memset(wbuf, 0, SSHKEY_BLOCK_SIZE);
|
||||
fseek(fp, r, SEEK_SET);
|
||||
count = fread(wbuf+3, 1, i_size, fp);
|
||||
if (count != i_size) {
|
||||
lprintf(LOG_ERR, "Unable to read %d bytes from file %s", i_size, ifile);
|
||||
fclose(fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf(".");
|
||||
fflush(stdout);
|
||||
|
||||
wbuf[0] = uid;
|
||||
if ((r + SSHKEY_BLOCK_SIZE) >= size)
|
||||
wbuf[1] = 0xff;
|
||||
else
|
||||
wbuf[1] = (uint8_t)(r / SSHKEY_BLOCK_SIZE);
|
||||
wbuf[2] = i_size;
|
||||
req.msg.data_len = i_size + 3;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Unable to set ssh key for UID %d", uid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("done\n");
|
||||
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
int rc = (-1);
|
||||
|
||||
if (argc == 0 || strncmp(argv[0], "help", 4) == 0) {
|
||||
ipmi_sunoem_usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (strncmp(argv[0], "fan", 3) == 0) {
|
||||
if (argc == 3 && strncmp(argv[1], "speed", 5) == 0) {
|
||||
uint8_t pct = 0;
|
||||
if (str2uchar(argv[2], &pct) != 0 || pct > 100) {
|
||||
lprintf(LOG_ERR, "Fan speed is limited to range <0..100>.");
|
||||
return (-1);
|
||||
}
|
||||
rc = ipmi_sunoem_fan_speed(intf, pct);
|
||||
}
|
||||
else {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if ((strncmp(argv[0], "led", 3) == 0)
|
||||
|| (strncmp(argv[0], "sbled", 5) == 0)) {
|
||||
if (argc < 2) {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
if (strncmp(argv[0], "sbled", 5) == 0) {
|
||||
is_sbcmd = 1;
|
||||
}
|
||||
if (strncmp(argv[1], "get", 3) == 0) {
|
||||
if (argc < 3) {
|
||||
char * arg[] = { "all" };
|
||||
rc = ipmi_sunoem_led_get(intf, 1, arg);
|
||||
}
|
||||
else {
|
||||
rc = ipmi_sunoem_led_get(intf, argc-2, &(argv[2]));
|
||||
}
|
||||
}
|
||||
else if (strncmp(argv[1], "set", 3) == 0) {
|
||||
if (argc < 4) {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
rc = ipmi_sunoem_led_set(intf, argc-2, &(argv[2]));
|
||||
}
|
||||
else {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else if (strncmp(argv[0], "sshkey", 6) == 0) {
|
||||
uint8_t uid = 0;
|
||||
if (argc < 3) {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (str2uchar(argv[2], &uid) != 0 || uid < 1 || uid > 63) {
|
||||
lprintf(LOG_ERR, "User ID is limited to range <1..63>.");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (strncmp(argv[1], "del", 3) == 0) {
|
||||
rc = ipmi_sunoem_sshkey_del(intf, uid);
|
||||
}
|
||||
else if (argc == 4 && strncmp(argv[1], "set", 3) == 0) {
|
||||
rc = ipmi_sunoem_sshkey_set(intf, uid, argv[3]);
|
||||
}
|
||||
else {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ipmi_sunoem_usage();
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
@ -1,309 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights 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 Sun Microsystems, Inc. or the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
# include <config.h>
|
||||
#endif
|
||||
#include <ipmitool/ipmi_intf.h>
|
||||
#include <ipmitool/ipmi.h>
|
||||
#include <ipmitool/ipmi_sdr.h>
|
||||
#include <ipmitool/log.h>
|
||||
|
||||
#ifdef IPMI_INTF_OPEN
|
||||
extern struct ipmi_intf ipmi_open_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_IMB
|
||||
extern struct ipmi_intf ipmi_imb_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LIPMI
|
||||
extern struct ipmi_intf ipmi_lipmi_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_BMC
|
||||
extern struct ipmi_intf ipmi_bmc_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LAN
|
||||
extern struct ipmi_intf ipmi_lan_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LANPLUS
|
||||
extern struct ipmi_intf ipmi_lanplus_intf;
|
||||
#endif
|
||||
#ifdef IPMI_INTF_FREE
|
||||
extern struct ipmi_intf ipmi_free_intf;
|
||||
#endif
|
||||
|
||||
struct ipmi_intf * ipmi_intf_table[] = {
|
||||
#ifdef IPMI_INTF_OPEN
|
||||
&ipmi_open_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_IMB
|
||||
&ipmi_imb_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LIPMI
|
||||
&ipmi_lipmi_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_BMC
|
||||
&ipmi_bmc_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LAN
|
||||
&ipmi_lan_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_LANPLUS
|
||||
&ipmi_lanplus_intf,
|
||||
#endif
|
||||
#ifdef IPMI_INTF_FREE
|
||||
&ipmi_free_intf,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
/* ipmi_intf_print - Print list of interfaces
|
||||
*
|
||||
* no meaningful return code
|
||||
*/
|
||||
void ipmi_intf_print(struct ipmi_intf_support * intflist)
|
||||
{
|
||||
struct ipmi_intf ** intf;
|
||||
struct ipmi_intf_support * sup;
|
||||
int def = 1;
|
||||
int found;
|
||||
|
||||
lprintf(LOG_NOTICE, "Interfaces:");
|
||||
|
||||
for (intf = ipmi_intf_table; intf && *intf; intf++) {
|
||||
|
||||
if (intflist != NULL) {
|
||||
found = 0;
|
||||
for (sup=intflist; sup->name != NULL; sup++) {
|
||||
if (strncmp(sup->name, (*intf)->name, strlen(sup->name)) == 0 &&
|
||||
strncmp(sup->name, (*intf)->name, strlen((*intf)->name)) == 0 &&
|
||||
sup->supported == 1)
|
||||
found = 1;
|
||||
}
|
||||
if (found == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
lprintf(LOG_NOTICE, "\t%-12s %s %s",
|
||||
(*intf)->name, (*intf)->desc,
|
||||
def ? "[default]" : "");
|
||||
def = 0;
|
||||
}
|
||||
lprintf(LOG_NOTICE, "");
|
||||
}
|
||||
|
||||
/* ipmi_intf_load - Load an interface from the interface table above
|
||||
* If no interface name is given return first entry
|
||||
*
|
||||
* @name: interface name to try and load
|
||||
*
|
||||
* returns pointer to inteface structure if found
|
||||
* returns NULL on error
|
||||
*/
|
||||
struct ipmi_intf * ipmi_intf_load(char * name)
|
||||
{
|
||||
struct ipmi_intf ** intf;
|
||||
struct ipmi_intf * i;
|
||||
|
||||
if (name == NULL) {
|
||||
i = ipmi_intf_table[0];
|
||||
if (i->setup != NULL && (i->setup(i) < 0)) {
|
||||
lprintf(LOG_ERR, "Unable to setup "
|
||||
"interface %s", name);
|
||||
return NULL;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
for (intf = ipmi_intf_table;
|
||||
((intf != NULL) && (*intf != NULL));
|
||||
intf++) {
|
||||
i = *intf;
|
||||
if (strncmp(name, i->name, strlen(name)) == 0) {
|
||||
if (i->setup != NULL && (i->setup(i) < 0)) {
|
||||
lprintf(LOG_ERR, "Unable to setup "
|
||||
"interface %s", name);
|
||||
return NULL;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_hostname(struct ipmi_intf * intf, char * hostname)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
memset(intf->session->hostname, 0, 16);
|
||||
|
||||
if (hostname != NULL) {
|
||||
memcpy(intf->session->hostname, hostname,
|
||||
__min(strlen(hostname), 64));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_username(struct ipmi_intf * intf, char * username)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
memset(intf->session->username, 0, 17);
|
||||
|
||||
if (username == NULL)
|
||||
return;
|
||||
|
||||
memcpy(intf->session->username, username, __min(strlen(username), 16));
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_password(struct ipmi_intf * intf, char * password)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
memset(intf->session->authcode, 0, IPMI_AUTHCODE_BUFFER_SIZE);
|
||||
|
||||
if (password == NULL) {
|
||||
intf->session->password = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
intf->session->password = 1;
|
||||
memcpy(intf->session->authcode, password,
|
||||
__min(strlen(password), IPMI_AUTHCODE_BUFFER_SIZE));
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_privlvl(struct ipmi_intf * intf, uint8_t level)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->privlvl = level;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_lookupbit(struct ipmi_intf * intf, uint8_t lookupbit)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->v2_data.lookupbit = lookupbit;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_cipher_suite_id(struct ipmi_intf * intf, uint8_t cipher_suite_id)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->cipher_suite_id = cipher_suite_id;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_sol_escape_char(struct ipmi_intf * intf, char sol_escape_char)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->sol_escape_char = sol_escape_char;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_kgkey(struct ipmi_intf * intf, char * kgkey)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
memset(intf->session->v2_data.kg, 0, IPMI_KG_BUFFER_SIZE);
|
||||
|
||||
if (kgkey == NULL)
|
||||
return;
|
||||
|
||||
memcpy(intf->session->v2_data.kg, kgkey,
|
||||
__min(strlen(kgkey), IPMI_KG_BUFFER_SIZE));
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_port(struct ipmi_intf * intf, int port)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->port = port;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
/* clear password field if authtype NONE specified */
|
||||
if (authtype == IPMI_SESSION_AUTHTYPE_NONE) {
|
||||
memset(intf->session->authcode, 0, IPMI_AUTHCODE_BUFFER_SIZE);
|
||||
intf->session->password = 0;
|
||||
}
|
||||
|
||||
intf->session->authtype_set = authtype;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->timeout = timeout;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_intf_session_set_retry(struct ipmi_intf * intf, int retry)
|
||||
{
|
||||
if (intf->session == NULL)
|
||||
return;
|
||||
|
||||
intf->session->retry = retry;
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_cleanup(struct ipmi_intf * intf)
|
||||
{
|
||||
ipmi_sdr_list_empty(intf);
|
||||
}
|
@ -39,7 +39,8 @@ libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.c \
|
||||
ipmi_oem.c ipmi_isol.c ipmi_sunoem.c ipmi_fwum.c ipmi_picmg.c \
|
||||
ipmi_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c \
|
||||
ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \
|
||||
ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c
|
||||
ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c \
|
||||
../src/plugins/lan/md5.c ../src/plugins/lan/md5.h
|
||||
|
||||
libipmitool_la_LDFLAGS = -export-dynamic
|
||||
libipmitool_la_LIBADD = -lm
|
@ -719,7 +719,8 @@ const struct valstr jedec_id5_vals[] = {
|
||||
int
|
||||
ipmi_spd_print(uint8_t *spd_data, int len)
|
||||
{
|
||||
int size;
|
||||
int k = 0;
|
||||
int ii = 0;
|
||||
|
||||
if (len < 92)
|
||||
return -1; /* we need first 91 bytes to do our thing */
|
||||
@ -802,8 +803,15 @@ ipmi_spd_print(uint8_t *spd_data, int len)
|
||||
}
|
||||
else
|
||||
{
|
||||
size = spd_data[5] * (spd_data[31] << 2);
|
||||
printf(" Memory Size : %d MB\n", size);
|
||||
ii = (spd_data[3] & 0x0f) + (spd_data[4] & 0x0f) - 17;
|
||||
k = ((spd_data[5] & 0x7) + 1) * spd_data[17];
|
||||
|
||||
if(ii > 0 && ii <= 12 && k > 0) {
|
||||
printf(" Memory Size : %d MB\n", ((1 << ii) * k));
|
||||
} else {
|
||||
printf(" Memory Size INVALID: %d, %d, %d, %d\n", spd_data[3],
|
||||
spd_data[4], spd_data[5], spd_data[17]);
|
||||
}
|
||||
printf(" Voltage Intf : %s\n",
|
||||
val2str(spd_data[8], spd_voltage_vals));
|
||||
printf(" Error Detect/Cor : %s\n",
|
@ -44,6 +44,7 @@
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
@ -145,6 +146,33 @@ const char * oemval2str(uint32_t oem, uint16_t val,
|
||||
return un_str;
|
||||
}
|
||||
|
||||
/* str2double - safely convert string to double
|
||||
*
|
||||
* @str: source string to convert from
|
||||
* @double_ptr: pointer where to store result
|
||||
*
|
||||
* returns zero on success
|
||||
* returns (-1) if one of args is NULL, (-2) invalid input, (-3) for *flow
|
||||
*/
|
||||
int str2double(const char * str, double * double_ptr)
|
||||
{
|
||||
char * end_ptr = 0;
|
||||
if (!str || !double_ptr)
|
||||
return (-1);
|
||||
|
||||
*double_ptr = 0;
|
||||
errno = 0;
|
||||
*double_ptr = strtod(str, &end_ptr);
|
||||
|
||||
if (*end_ptr != '\0')
|
||||
return (-2);
|
||||
|
||||
if (errno != 0)
|
||||
return (-3);
|
||||
|
||||
return 0;
|
||||
} /* str2double(...) */
|
||||
|
||||
/* str2long - safely convert string to int64_t
|
||||
*
|
||||
* @str: source string to convert from
|
||||
@ -168,7 +196,7 @@ int str2long(const char * str, int64_t * lng_ptr)
|
||||
|
||||
if (errno != 0)
|
||||
return (-3);
|
||||
|
||||
|
||||
return 0;
|
||||
} /* str2long(...) */
|
||||
|
||||
@ -211,6 +239,9 @@ int str2int(const char * str, int32_t * int_ptr)
|
||||
{
|
||||
int rc = 0;
|
||||
int64_t arg_long = 0;
|
||||
if (!str || !int_ptr)
|
||||
return (-1);
|
||||
|
||||
if ( (rc = str2long(str, &arg_long)) != 0 ) {
|
||||
*int_ptr = 0;
|
||||
return rc;
|
||||
@ -235,6 +266,9 @@ int str2uint(const char * str, uint32_t * uint_ptr)
|
||||
{
|
||||
int rc = 0;
|
||||
uint64_t arg_ulong = 0;
|
||||
if (!str || !uint_ptr)
|
||||
return (-1);
|
||||
|
||||
if ( (rc = str2ulong(str, &arg_ulong)) != 0) {
|
||||
*uint_ptr = 0;
|
||||
return rc;
|
||||
@ -259,6 +293,9 @@ int str2short(const char * str, int16_t * shrt_ptr)
|
||||
{
|
||||
int rc = (-3);
|
||||
int64_t arg_long = 0;
|
||||
if (!str || !shrt_ptr)
|
||||
return (-1);
|
||||
|
||||
if ( (rc = str2long(str, &arg_long)) != 0 ) {
|
||||
*shrt_ptr = 0;
|
||||
return rc;
|
||||
@ -283,6 +320,9 @@ int str2ushort(const char * str, uint16_t * ushrt_ptr)
|
||||
{
|
||||
int rc = (-3);
|
||||
uint64_t arg_ulong = 0;
|
||||
if (!str || !ushrt_ptr)
|
||||
return (-1);
|
||||
|
||||
if ( (rc = str2ulong(str, &arg_ulong)) != 0 ) {
|
||||
*ushrt_ptr = 0;
|
||||
return rc;
|
||||
@ -295,6 +335,31 @@ int str2ushort(const char * str, uint16_t * ushrt_ptr)
|
||||
return 0;
|
||||
} /* str2ushort(...) */
|
||||
|
||||
/* str2char - safely convert string to int8
|
||||
*
|
||||
* @str: source string to convert from
|
||||
* @chr_ptr: pointer where to store result
|
||||
*
|
||||
* returns zero on success
|
||||
* returns (-1) if one of args is NULL, (-2) or (-3) if conversion fails
|
||||
*/
|
||||
int str2char(const char *str, int8_t * chr_ptr)
|
||||
{
|
||||
int rc = (-3);
|
||||
int64_t arg_long = 0;
|
||||
if (!str || !chr_ptr) {
|
||||
return (-1);
|
||||
}
|
||||
if ((rc = str2long(str, &arg_long)) != 0) {
|
||||
*chr_ptr = 0;
|
||||
return rc;
|
||||
}
|
||||
if (arg_long < INT8_MIN || arg_long > INT8_MAX) {
|
||||
return (-3);
|
||||
}
|
||||
return 0;
|
||||
} /* str2char(...) */
|
||||
|
||||
/* str2uchar - safely convert string to uint8
|
||||
*
|
||||
* @str: source string to convert from
|
||||
@ -307,6 +372,9 @@ int str2uchar(const char * str, uint8_t * uchr_ptr)
|
||||
{
|
||||
int rc = (-3);
|
||||
uint64_t arg_ulong = 0;
|
||||
if (!str || !uchr_ptr)
|
||||
return (-1);
|
||||
|
||||
if ( (rc = str2ulong(str, &arg_ulong)) != 0 ) {
|
||||
*uchr_ptr = 0;
|
||||
return rc;
|
||||
@ -549,10 +617,6 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
||||
sigset_t sighup;
|
||||
#endif
|
||||
|
||||
/* if we are started from init no need to become daemon */
|
||||
if (getppid() == 1)
|
||||
return;
|
||||
|
||||
#ifdef SIGHUP
|
||||
sigemptyset(&sighup);
|
||||
sigaddset(&sighup, SIGHUP);
|
||||
@ -576,7 +640,7 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
||||
pid = (pid_t) fork();
|
||||
if (pid < 0 || pid > 0)
|
||||
exit(0);
|
||||
|
||||
|
||||
#if defined(SIGTSTP) && defined(TIOCNOTTY)
|
||||
if (setpgid(0, getpid()) == -1)
|
||||
exit(1);
|
||||
@ -600,7 +664,126 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
open("/dev/null", O_RDWR);
|
||||
dup(0);
|
||||
dup(0);
|
||||
fd = open("/dev/null", O_RDWR);
|
||||
assert(0 == fd);
|
||||
dup(fd);
|
||||
dup(fd);
|
||||
}
|
||||
|
||||
/* is_fru_id - wrapper for str-2-int FRU ID conversion. Message is printed
|
||||
* on error.
|
||||
* FRU ID range: <0..255>
|
||||
*
|
||||
* @argv_ptr: source string to convert from; usually argv
|
||||
* @fru_id_ptr: pointer where to store result
|
||||
*
|
||||
* returns zero on success
|
||||
* returns (-1) on error and message is printed on STDERR
|
||||
*/
|
||||
int
|
||||
is_fru_id(const char *argv_ptr, uint8_t *fru_id_ptr)
|
||||
{
|
||||
if (!argv_ptr || !fru_id_ptr) {
|
||||
lprintf(LOG_ERR, "is_fru_id(): invalid argument(s).");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (str2uchar(argv_ptr, fru_id_ptr) == 0) {
|
||||
return 0;
|
||||
}
|
||||
lprintf(LOG_ERR, "FRU ID '%s' is either invalid or out of range.",
|
||||
argv_ptr);
|
||||
return (-1);
|
||||
} /* is_fru_id(...) */
|
||||
|
||||
/* is_ipmi_channel_num - wrapper for str-2-int Channel conversion. Message is
|
||||
* printed on error.
|
||||
*
|
||||
* 6.3 Channel Numbers, p. 45, IPMIv2 spec.
|
||||
* Valid channel numbers are: <0..7>, <E-F>
|
||||
* Reserved channel numbers: <8-D>
|
||||
*
|
||||
* @argv_ptr: source string to convert from; usually argv
|
||||
* @channel_ptr: pointer where to store result
|
||||
*
|
||||
* returns zero on success
|
||||
* returns (-1) on error and message is printed on STDERR
|
||||
*/
|
||||
int
|
||||
is_ipmi_channel_num(const char *argv_ptr, uint8_t *channel_ptr)
|
||||
{
|
||||
if (!argv_ptr || !channel_ptr) {
|
||||
lprintf(LOG_ERR,
|
||||
"is_ipmi_channel_num(): invalid argument(s).");
|
||||
return (-1);
|
||||
}
|
||||
if ((str2uchar(argv_ptr, channel_ptr) == 0)
|
||||
&& ((*channel_ptr >= 0x0 && *channel_ptr <= 0x7)
|
||||
|| (*channel_ptr >= 0xE && *channel_ptr <= 0xF))) {
|
||||
return 0;
|
||||
}
|
||||
lprintf(LOG_ERR,
|
||||
"Given Channel number '%s' is either invalid or out of range.",
|
||||
argv_ptr);
|
||||
lprintf(LOG_ERR, "Channel number must be from ranges: <0..7>, <0xE..0xF>");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* is_ipmi_user_id() - wrapper for str-2-uint IPMI UID conversion. Message is
|
||||
* printed on error.
|
||||
*
|
||||
* @argv_ptr: source string to convert from; usually argv
|
||||
* @ipmi_uid_ptr: pointer where to store result
|
||||
*
|
||||
* returns zero on success
|
||||
* returns (-1) on error and message is printed on STDERR
|
||||
*/
|
||||
int
|
||||
is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr)
|
||||
{
|
||||
if (!argv_ptr || !ipmi_uid_ptr) {
|
||||
lprintf(LOG_ERR,
|
||||
"is_ipmi_user_id(): invalid argument(s).");
|
||||
return (-1);
|
||||
}
|
||||
if ((str2uchar(argv_ptr, ipmi_uid_ptr) == 0)
|
||||
&& *ipmi_uid_ptr >= IPMI_UID_MIN
|
||||
&& *ipmi_uid_ptr <= IPMI_UID_MAX) {
|
||||
return 0;
|
||||
}
|
||||
lprintf(LOG_ERR,
|
||||
"Given User ID '%s' is either invalid or out of range.",
|
||||
argv_ptr);
|
||||
lprintf(LOG_ERR, "User ID is limited to range <%i..%i>.",
|
||||
IPMI_UID_MIN, IPMI_UID_MAX);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
uint16_t
|
||||
ipmi_get_oem_id(struct ipmi_intf *intf)
|
||||
{
|
||||
/* Execute a Get Board ID command to determine the board */
|
||||
struct ipmi_rs *rsp;
|
||||
struct ipmi_rq req;
|
||||
uint16_t oem_id;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_TSOL;
|
||||
req.msg.cmd = 0x21;
|
||||
req.msg.data_len = 0;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (rsp == NULL) {
|
||||
lprintf(LOG_ERR, "Get Board ID command failed");
|
||||
return 0;
|
||||
}
|
||||
if (rsp->ccode > 0) {
|
||||
lprintf(LOG_ERR, "Get Board ID command failed: %#x %s",
|
||||
rsp->ccode, val2str(rsp->ccode, completion_code_vals));
|
||||
return 0;
|
||||
}
|
||||
oem_id = rsp->data[0] | (rsp->data[1] << 8);
|
||||
lprintf(LOG_DEBUG,"Board ID: %x", oem_id);
|
||||
|
||||
return oem_id;
|
||||
}
|
289
lib/hpm2.c
Normal file
289
lib/hpm2.c
Normal file
@ -0,0 +1,289 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Pigeon Point Systems. All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistribution of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistribution in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* Neither the name of Pigeon Point Systems nor the names of
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* This software is provided "AS IS," without a warranty of any kind.
|
||||
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
||||
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
||||
* PIGEON POINT SYSTEMS ("PPS") AND ITS LICENSORS SHALL NOT BE LIABLE
|
||||
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||||
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
||||
* PPS OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
||||
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
||||
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
||||
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
||||
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <ipmitool/hpm2.h>
|
||||
#include <ipmitool/ipmi_intf.h>
|
||||
#include <ipmitool/log.h>
|
||||
#include <ipmitool/bswap.h>
|
||||
|
||||
#if HAVE_PRAGMA_PACK
|
||||
# pragma pack(push, 1)
|
||||
#endif
|
||||
|
||||
/* HPM.x Get Capabilities request */
|
||||
struct hpmx_cmd_get_capabilities_rq {
|
||||
uint8_t picmg_id;
|
||||
uint8_t hpmx_id;
|
||||
} ATTRIBUTE_PACKING;
|
||||
|
||||
/* HPM.2 Get Capabilities response */
|
||||
struct hpm2_cmd_get_capabilities_rp {
|
||||
uint8_t picmg_id;
|
||||
struct hpm2_lan_attach_capabilities caps;
|
||||
} ATTRIBUTE_PACKING;
|
||||
|
||||
#if HAVE_PRAGMA_PACK
|
||||
# pragma pack(pop)
|
||||
#endif
|
||||
|
||||
/* IPMI Get LAN Configuration Parameters command */
|
||||
#define IPMI_LAN_GET_CONFIG 0x02
|
||||
|
||||
int hpm2_get_capabilities(struct ipmi_intf * intf,
|
||||
struct hpm2_lan_attach_capabilities * caps)
|
||||
{
|
||||
struct ipmi_rq req;
|
||||
struct ipmi_rs * rsp;
|
||||
struct hpmx_cmd_get_capabilities_rq rq;
|
||||
|
||||
/* reset result */
|
||||
memset(caps, 0, sizeof(struct hpm2_lan_attach_capabilities));
|
||||
|
||||
/* prepare request */
|
||||
rq.picmg_id = 0;
|
||||
rq.hpmx_id = 2;
|
||||
|
||||
/* prepare request */
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_PICMG;
|
||||
req.msg.cmd = HPM2_GET_LAN_ATTACH_CAPABILITIES;
|
||||
req.msg.data = (uint8_t *)&rq;
|
||||
req.msg.data_len = sizeof(rq);
|
||||
|
||||
|
||||
/* send */
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
|
||||
if (!rsp) {
|
||||
lprintf(LOG_NOTICE, "Error sending request.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rsp->ccode == 0xC1) {
|
||||
lprintf(LOG_DEBUG, "IPM Controller is not HPM.2 compatible");
|
||||
return rsp->ccode;
|
||||
} else if (rsp->ccode) {
|
||||
lprintf(LOG_NOTICE, "Get HPM.x Capabilities request failed,"
|
||||
" compcode = %x", rsp->ccode);
|
||||
return rsp->ccode;
|
||||
}
|
||||
|
||||
/* check response length */
|
||||
if (rsp->data_len < 2 || rsp->data_len > 10) {
|
||||
lprintf(LOG_NOTICE, "Bad response length, len=%d", rsp->data_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check HPM.x identifier */
|
||||
if (rsp->data[1] != 2) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.x ID, id=%d", rsp->data[1]);
|
||||
return rsp->ccode;
|
||||
}
|
||||
|
||||
/*
|
||||
* this hardly can happen, since completion code is already checked.
|
||||
* but check for safety
|
||||
*/
|
||||
if (rsp->data_len < 4) {
|
||||
lprintf(LOG_NOTICE, "Bad response length, len=%d", rsp->data_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* copy HPM.2 capabilities */
|
||||
memcpy(caps, rsp->data + 2, rsp->data_len - 2);
|
||||
|
||||
#if WORDS_BIGENDIAN
|
||||
/* swap bytes to convert from little-endian format */
|
||||
caps->lan_channel_mask = BSWAP_16(caps->lan_channel_mask);
|
||||
#endif
|
||||
|
||||
/* check HPM.2 revision */
|
||||
if (caps->hpm2_revision_id != HPM2_REVISION) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 revision, rev=%d",
|
||||
caps->hpm2_revision_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!caps->lan_channel_mask) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check response length */
|
||||
if (rsp->data_len < 8) {
|
||||
lprintf(LOG_NOTICE, "Bad response length, len=%d", rsp->data_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check HPM.2 LAN parameters start */
|
||||
if (caps->hpm2_lan_params_start < 0xC0) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 LAN params start, start=%x",
|
||||
caps->hpm2_lan_params_start);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check HPM.2 LAN parameters revision */
|
||||
if (caps->hpm2_lan_params_rev != HPM2_LAN_PARAMS_REV) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 LAN params revision, rev=%d",
|
||||
caps->hpm2_lan_params_rev);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check for HPM.2 SOL extension */
|
||||
if (!(caps->hpm2_caps & HPM2_CAPS_SOL_EXTENSION)) {
|
||||
/* no further checks */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check response length */
|
||||
if (rsp->data_len < 10) {
|
||||
lprintf(LOG_NOTICE, "Bad response length, len=%d", rsp->data_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check HPM.2 SOL parameters start */
|
||||
if (caps->hpm2_sol_params_start < 0xC0) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 SOL params start, start=%x",
|
||||
caps->hpm2_sol_params_start);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check HPM.2 SOL parameters revision */
|
||||
if (caps->hpm2_sol_params_rev != HPM2_SOL_PARAMS_REV) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 SOL params revision, rev=%d",
|
||||
caps->hpm2_sol_params_rev);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hpm2_get_lan_channel_capabilities(struct ipmi_intf * intf,
|
||||
uint8_t hpm2_lan_params_start,
|
||||
struct hpm2_lan_channel_capabilities * caps)
|
||||
{
|
||||
struct ipmi_rq req;
|
||||
struct ipmi_rs * rsp;
|
||||
uint8_t rq[4];
|
||||
|
||||
/* reset result */
|
||||
memset(caps, 0, sizeof(struct hpm2_lan_channel_capabilities));
|
||||
|
||||
/* prepare request */
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_TRANSPORT;
|
||||
req.msg.cmd = IPMI_LAN_GET_CONFIG;
|
||||
req.msg.data = (uint8_t *)&rq;
|
||||
req.msg.data_len = sizeof(rq);
|
||||
|
||||
/* prepare request data */
|
||||
rq[0] = 0xE; /* sending channel */
|
||||
rq[1] = hpm2_lan_params_start; /* HPM.2 Channel Caps */
|
||||
rq[2] = rq[3] = 0;
|
||||
|
||||
/* send */
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
|
||||
if (rsp) {
|
||||
lprintf(LOG_NOTICE, "Error sending request");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (rsp->ccode == 0x80) {
|
||||
lprintf(LOG_DEBUG, "HPM.2 Channel Caps parameter is not supported");
|
||||
return rsp->ccode;
|
||||
} else if (rsp->ccode) {
|
||||
lprintf(LOG_NOTICE, "Get LAN Configuration Parameters request failed,"
|
||||
" compcode = %x", rsp->ccode);
|
||||
return rsp->ccode;
|
||||
}
|
||||
|
||||
/* check response length */
|
||||
if (rsp->data_len != sizeof (struct hpm2_lan_channel_capabilities) + 1) {
|
||||
lprintf(LOG_NOTICE, "Bad response length, len=%d", rsp->data_len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check parameter revision */
|
||||
if (rsp->data[0] != HPM2_LAN_PARAMS_REV) {
|
||||
lprintf(LOG_NOTICE, "Bad HPM.2 LAN parameter revision, rev=%d",
|
||||
rsp->data[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* copy parameter data */
|
||||
memcpy(caps, &rsp->data[1], sizeof (struct hpm2_lan_channel_capabilities));
|
||||
|
||||
#if WORDS_BIGENDIAN
|
||||
/* swap bytes to convert from little-endian format */
|
||||
caps->max_inbound_pld_size = BSWAP_16(caps->max_inbound_pld_size);
|
||||
caps->max_outbound_pld_size = BSWAP_16(caps->max_outbound_pld_size);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hpm2_detect_max_payload_size(struct ipmi_intf * intf)
|
||||
{
|
||||
struct hpm2_lan_attach_capabilities attach_caps;
|
||||
struct hpm2_lan_channel_capabilities channel_caps;
|
||||
int err;
|
||||
|
||||
/* query HPM.2 support */
|
||||
err = hpm2_get_capabilities(intf, &attach_caps);
|
||||
|
||||
/* check if HPM.2 is supported */
|
||||
if (err != 0 || !attach_caps.lan_channel_mask) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* query channel capabilities */
|
||||
err = hpm2_get_lan_channel_capabilities(intf,
|
||||
attach_caps.hpm2_lan_params_start, &channel_caps);
|
||||
|
||||
/* check if succeeded */
|
||||
if (err != 0) {
|
||||
return err;
|
||||
}
|
||||
|
||||
/* update request and response sizes */
|
||||
ipmi_intf_set_max_request_data_size(intf,
|
||||
channel_caps.max_inbound_pld_size - 7);
|
||||
ipmi_intf_set_max_response_data_size(intf,
|
||||
channel_caps.max_outbound_pld_size - 8);
|
||||
|
||||
/* print debug info */
|
||||
lprintf(LOG_DEBUG, "Set maximum request size to %d\n"
|
||||
"Set maximum response size to %d",
|
||||
intf->max_request_data_size, intf->max_response_data_size);
|
||||
|
||||
return 0;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user