mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
Compare commits
577 Commits
IPMITOOL_1
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
be11d948f8 | ||
|
4b791f8bf6 | ||
|
9328748672 | ||
|
26b088193a | ||
|
9dfdf14270 | ||
|
707a2980f6 | ||
|
966d6e80b0 | ||
|
206dba615d | ||
|
8f0946a81e | ||
|
63d59a50a6 | ||
|
f033b5549e | ||
|
1edb0e27e4 | ||
|
4519b4baac | ||
|
19d78782d7 | ||
|
46fd8d942c | ||
|
a1dc78c456 | ||
|
4d25a93f49 | ||
|
65ba015f5c | ||
|
4d4f29f0b6 | ||
|
5ac7f6a54e | ||
|
a24a512bdd | ||
|
39ca56bf33 | ||
|
08151adef3 | ||
|
86ef8fb091 | ||
|
66cda7e18f | ||
|
15418696ea | ||
|
7c47cf75f4 | ||
|
b7adc1dcaf | ||
|
11c7605c0d | ||
|
5cf436056f | ||
|
cdac4e07f7 | ||
|
cd57365fc4 | ||
|
351dad24a2 | ||
|
fb47ae8d7c | ||
|
50479484a2 | ||
|
9a1c0e68ba | ||
|
1f429f1ed7 | ||
|
59b7d6cf8f | ||
|
6b1ce6c1ac | ||
|
6a3ded7333 | ||
|
61bb233c5b | ||
|
fb176a1995 | ||
|
d88bbf3c41 | ||
|
69cdef116a | ||
|
9a86189425 | ||
|
5a36080f92 | ||
|
682fec09ef | ||
|
e7550f722c | ||
|
d674bfdc9a | ||
|
050f5da631 | ||
|
7fd7c0f2ba | ||
|
e78144d2c7 | ||
|
7108884793 | ||
|
1245aaa387 | ||
|
50d8c36edf | ||
|
aee377bead | ||
|
b302d8202c | ||
|
3452cf1ca2 | ||
|
f3ffa616e6 | ||
|
16f937a117 | ||
|
3a1a9cb283 | ||
|
239ef6a4ef | ||
|
c6a0baee84 | ||
|
bc13db6304 | ||
|
8838e4b0e2 | ||
|
055719b7b9 | ||
|
38b120eb5a | ||
|
01b53a013b | ||
|
0cd847579f | ||
|
2158e6ea49 | ||
|
1f92c9ee23 | ||
|
b18619e14e | ||
|
84469a9c54 | ||
|
956ae2b372 | ||
|
e3fc775d26 | ||
|
6e037d6bfb | ||
|
9d5ea21df7 | ||
|
dfe17311d6 | ||
|
b97a110721 | ||
|
284adfe2e2 | ||
|
2a17967159 | ||
|
c3939dac2c | ||
|
f80effb1fc | ||
|
7ccea283dd | ||
|
d45572d71e | ||
|
9452be8718 | ||
|
41d7026946 | ||
|
840fb1cbb4 | ||
|
e824c23316 | ||
|
7a66d8725d | ||
|
63dd71c39c | ||
|
e60eac12cc | ||
|
dec04e79fd | ||
|
d9adbf12f1 | ||
|
5647cd16d2 | ||
|
42a023ff07 | ||
|
58c9263a28 | ||
|
0663814eec | ||
|
aa72d9c426 | ||
|
0854344db5 | ||
|
4b89f1b42d | ||
|
0e3e436eb6 | ||
|
eed9d5950e | ||
|
4dc962b614 | ||
|
6940a6717a | ||
|
51a2ab8180 | ||
|
af062a9a5e | ||
|
1724b031b3 | ||
|
9006f2b26d | ||
|
b7db637984 | ||
|
82d6629a66 | ||
|
c396a310ba | ||
|
002e1d95f5 | ||
|
2ee7aca4e4 | ||
|
efd28d1bc1 | ||
|
d95775288d | ||
|
ef78ef3792 | ||
|
2676ae43fd | ||
|
54abbaf0e8 | ||
|
bd0475ce4a | ||
|
b397a07e9e | ||
|
8071cf7389 | ||
|
ca7767793e | ||
|
a45704e5ea | ||
|
94f7646a8e | ||
|
62a04390e1 | ||
|
de1d5c9924 | ||
|
73d6af5782 | ||
|
c9510635d7 | ||
|
e11f463b4e | ||
|
619a02cf5d | ||
|
e65a96b38d | ||
|
9fa01f1a54 | ||
|
432ea31804 | ||
|
12e2f5da63 | ||
|
d818c2ff85 | ||
|
cdd9d51c5f | ||
|
95038ba01b | ||
|
b0d84e0f15 | ||
|
1b636434a6 | ||
|
400622760f | ||
|
b7b455a38c | ||
|
fa8e2ced19 | ||
|
55ec2df41f | ||
|
48f4fba39a | ||
|
df076b9547 | ||
|
51634fd77c | ||
|
3bfa1da201 | ||
|
08348f1b72 | ||
|
a8b3b6282b | ||
|
eb5f26060a | ||
|
feecd2bbf4 | ||
|
be3d57c013 | ||
|
f64044a3de | ||
|
3737b035e8 | ||
|
6b003c3852 | ||
|
8991f5a9a0 | ||
|
49384e47be | ||
|
6dcb168442 | ||
|
1c4a00d26b | ||
|
aef8a1ccb4 | ||
|
81761e6f60 | ||
|
715c7b8a1f | ||
|
92ee477cde | ||
|
6d515dd06b | ||
|
7941806a9b | ||
|
4631d3f942 | ||
|
272d9d0d9b | ||
|
0ca9c66b84 | ||
|
8b6d127bb1 | ||
|
34fc86bd75 | ||
|
9ec2232321 | ||
|
64727f59c4 | ||
|
5183b2c288 | ||
|
83fee27624 | ||
|
3e0ecc5edc | ||
|
8ea6094118 | ||
|
d6d9c85139 | ||
|
9a55136bfb | ||
|
4ac93853a6 | ||
|
a4c1040420 | ||
|
576d4855d9 | ||
|
f2780c5d86 | ||
|
dc9b4ebfc9 | ||
|
6e2b688e24 | ||
|
6c3d4b56c9 | ||
|
4f05b95f6c | ||
|
f0d5c17ea7 | ||
|
a4ac8ce4ab | ||
|
65a2c548d8 | ||
|
1283382e82 | ||
|
7772254b62 | ||
|
a8862d7508 | ||
|
081bde8e1b | ||
|
9e05c0b120 | ||
|
6f336d04f1 | ||
|
9d49a6edfe | ||
|
c70665c3d1 | ||
|
2ed677c388 | ||
|
03d2b53c97 | ||
|
4c155320be | ||
|
40d52b5fa1 | ||
|
0b6abe8cd9 | ||
|
f43a78bfc3 | ||
|
b44ec2fb65 | ||
|
e9716e216d | ||
|
f3ef88724f | ||
|
9ecfb762bd | ||
|
bb1a4cc805 | ||
|
232773d171 | ||
|
a8f3413dc2 | ||
|
29e7d26edb | ||
|
7747d86cc4 | ||
|
5491b12596 | ||
|
3db2bf6c4b | ||
|
5a684b54ed | ||
|
6d6411d2fc | ||
|
5c033c06ab | ||
|
72b4b25b05 | ||
|
3aade24297 | ||
|
329ebdff84 | ||
|
6ee52071dd | ||
|
249e092967 | ||
|
b3d258b234 | ||
|
928716244d | ||
|
2de8a5e1a9 | ||
|
861ffb4680 | ||
|
0310208383 | ||
|
e8e94d8976 | ||
|
e49a20eece | ||
|
6c00d448d5 | ||
|
2a78ff2482 | ||
|
27f2f00dc6 | ||
|
f222df3081 | ||
|
8c0e76c21a | ||
|
432f06db3f | ||
|
564aef2aff | ||
|
ef7564a7ac | ||
|
724f7329a3 | ||
|
f498e3e296 | ||
|
6d9c540f6b | ||
|
60723084e6 | ||
|
9d41136c9b | ||
|
ecb4cfbff8 | ||
|
1664902525 | ||
|
f004b4b719 | ||
|
ba01dc84b4 | ||
|
497f7767cd | ||
|
7b0302cef5 | ||
|
840f573083 | ||
|
41fa699ae9 | ||
|
b35a634908 | ||
|
bc7d23761d | ||
|
e45dc6234b | ||
|
5db314f694 | ||
|
77fe563503 | ||
|
7b102293e8 | ||
|
b57487e360 | ||
|
80345ac56a | ||
|
0ea110a247 | ||
|
076ffb5650 | ||
|
b5ce925744 | ||
|
1487681b8c | ||
|
75a79e164d | ||
|
2d4762d573 | ||
|
2cc196d518 | ||
|
89cffb984b | ||
|
3f7e82a6b4 | ||
|
c6cd49ea37 | ||
|
052655cd91 | ||
|
fa2c1550b9 | ||
|
51198a1749 | ||
|
cc9a6b3964 | ||
|
ea471ed5fa | ||
|
e30c357db7 | ||
|
95eb252ecd | ||
|
2c99bf69ec | ||
|
34711329c2 | ||
|
2f76ab3d3a | ||
|
7f8d37493f | ||
|
f9211f8ed9 | ||
|
ea46724878 | ||
|
9a6ba64651 | ||
|
f8a711b9e8 | ||
|
fcf7445bce | ||
|
a3bec1d365 | ||
|
8bd9659101 | ||
|
9341982a38 | ||
|
4ecac48c68 | ||
|
6d8ad594cc | ||
|
a203644728 | ||
|
d56220f81f | ||
|
c89be0354a | ||
|
0fdfbce8b6 | ||
|
2153bd7aa3 | ||
|
9b1a1a1e82 | ||
|
0ffe39dedc | ||
|
7e991a18e0 | ||
|
b42c16d9dc | ||
|
55834ec3aa | ||
|
a7b0c213f9 | ||
|
70253df032 | ||
|
ec8ba928d4 | ||
|
f62a16f7f2 | ||
|
681bc21d32 | ||
|
fe2fcaf3ef | ||
|
27ac0c15ac | ||
|
8ca47f21ca | ||
|
b74c20c5d5 | ||
|
997b3ea328 | ||
|
ebe6b0ce48 | ||
|
b44366e92d | ||
|
e88e5c8186 | ||
|
a65b49c387 | ||
|
107e6affd0 | ||
|
5fca596492 | ||
|
244ce02f91 | ||
|
ccfa5aec4f | ||
|
eb94a394ba | ||
|
1636dbcf0c | ||
|
9f2072e6c3 | ||
|
d57bf32668 | ||
|
0d6a45357b | ||
|
d1b0e68515 | ||
|
4520b6ff0e | ||
|
a40737f856 | ||
|
a40d51abff | ||
|
9fd4dedd37 | ||
|
baa2c08ab3 | ||
|
955a875274 | ||
|
5d271b0f67 | ||
|
954859e330 | ||
|
19423c68d0 | ||
|
0f896e36f2 | ||
|
0008072590 | ||
|
aeba39bffc | ||
|
f3f4361568 | ||
|
aede0cee75 | ||
|
61d2f24090 | ||
|
3123ce01b5 | ||
|
f70a19cf63 | ||
|
02cdde0264 | ||
|
19293f08df | ||
|
c7169bc27e | ||
|
d6ca800da2 | ||
|
8fe8a5c74c | ||
|
9639cb3fa1 | ||
|
d65658aacc | ||
|
4648843f81 | ||
|
24ebe2fed9 | ||
|
2b8974fb22 | ||
|
38241decc7 | ||
|
a6a67e5e9c | ||
|
ac646c329b | ||
|
25e39b337c | ||
|
cacdd1b6ec | ||
|
eb5c73c04e | ||
|
55b024f573 | ||
|
e1897e2a1d | ||
|
9289aeb8c2 | ||
|
4e707af583 | ||
|
dc5dead291 | ||
|
b8ca3cac3a | ||
|
a74e837562 | ||
|
6a196c4a6a | ||
|
909fc7815c | ||
|
65ea078bdf | ||
|
89dbad1655 | ||
|
9020b67347 | ||
|
f62b924cb4 | ||
|
8055e0d9fb | ||
|
f67a7a3b2f | ||
|
ac1b3e1d46 | ||
|
336b2cb1ab | ||
|
2c3a876a73 | ||
|
37307c93e9 | ||
|
c9e3e6a01b | ||
|
603c14274a | ||
|
14368335b2 | ||
|
c56b5c9667 | ||
|
718a242205 | ||
|
636a785d82 | ||
|
c38ecd063f | ||
|
b6d0afb0f6 | ||
|
5be090f047 | ||
|
607cfe6f47 | ||
|
999cd0ad91 | ||
|
ffeb535db8 | ||
|
4a8691f477 | ||
|
c04aa9bb4e | ||
|
329281bbce | ||
|
e2c5b322d8 | ||
|
13a2a29156 | ||
|
3412d86143 | ||
|
a98eedb272 | ||
|
372b458e0f | ||
|
0caa68115e | ||
|
a5c1120dbb | ||
|
1add1486f9 | ||
|
89e9e63443 | ||
|
30becb3588 | ||
|
0d8f9a7453 | ||
|
ff80a188f3 | ||
|
169d9ac3fc | ||
|
6dec83ff5d | ||
|
c87aa0b96a | ||
|
fb6e311d27 | ||
|
24fd406506 | ||
|
a585af7e0c | ||
|
e8450850e3 | ||
|
2d79e69f5f | ||
|
259500e127 | ||
|
70099a3c40 | ||
|
82f6175dc7 | ||
|
d12b3b4870 | ||
|
ace0e646a1 | ||
|
eb54136775 | ||
|
9caa78be38 | ||
|
925a2fe55c | ||
|
531569ec62 | ||
|
ce861658c0 | ||
|
f1c6118c72 | ||
|
d5c2e976d4 | ||
|
7a854623aa | ||
|
fd5fdc59f2 | ||
|
4725cfd6d9 | ||
|
5a30d18af2 | ||
|
11bbf18345 | ||
|
026a8b6fce | ||
|
410606e868 | ||
|
8081427543 | ||
|
8f1f31cfdc | ||
|
90e2134413 | ||
|
66eee40df4 | ||
|
a6d47ceba4 | ||
|
21151953a5 | ||
|
b591bc2ab7 | ||
|
0e99dafa12 | ||
|
4c5058cdc3 | ||
|
f35ed010f0 | ||
|
512ec41ab4 | ||
|
b88a523ded | ||
|
75843864ba | ||
|
45c54aad0e | ||
|
32c4690950 | ||
|
03d8aa1882 | ||
|
d874267e9b | ||
|
c59e7247dd | ||
|
88891f69d6 | ||
|
aabd9eb1ac | ||
|
82a0caa38b | ||
|
55b1a41855 | ||
|
c56458da18 | ||
|
ce3f35d9d9 | ||
|
4dfb15281e | ||
|
7bd7c4fdd1 | ||
|
f0acdf1b50 | ||
|
ece5e55745 | ||
|
99721b52e4 | ||
|
0b54fac782 | ||
|
312f95930d | ||
|
d36cfcb817 | ||
|
33f9336e85 | ||
|
6febd10121 | ||
|
6b8d55d68b | ||
|
12b85b3c7b | ||
|
0ff2d6e464 | ||
|
dab7f5bf81 | ||
|
6c3f60e57c | ||
|
278dc84b22 | ||
|
0801b4588d | ||
|
56aa025dc2 | ||
|
238d3c4ea9 | ||
|
69f668309b | ||
|
585cb7c83d | ||
|
708be8bc45 | ||
|
d6deeb264e | ||
|
bcb96209c5 | ||
|
8227384c02 | ||
|
39fb1af285 | ||
|
faae8fd247 | ||
|
b6ec5072f4 | ||
|
fb36c69391 | ||
|
d099dca9c5 | ||
|
af276d4082 | ||
|
e4be291c65 | ||
|
bb35d370ba | ||
|
31f9d4c635 | ||
|
6d1afbf3a7 | ||
|
d9acbc4cd0 | ||
|
9811f79eae | ||
|
2d66f8d5cf | ||
|
8775af38f5 | ||
|
9fc4a39fda | ||
|
a6957f875c | ||
|
4ef4618366 | ||
|
8ac8361aca | ||
|
fb69b5dc9e | ||
|
c2e65d0dce | ||
|
12eeca602c | ||
|
c076fde0a6 | ||
|
ecfaeb2706 | ||
|
61db4df637 | ||
|
e37e3ab7de | ||
|
c97dbd3461 | ||
|
48117f5ddf | ||
|
70984dcad5 | ||
|
ce02ffaf2a | ||
|
3105812a44 | ||
|
148d0e0904 | ||
|
6ca88cb687 | ||
|
6d4e2bb632 | ||
|
104a7176ac | ||
|
d9f89a8da0 | ||
|
0a1f5c03e5 | ||
|
140add9d77 | ||
|
0562c809af | ||
|
a87b2ccc67 | ||
|
ad77da2065 | ||
|
6e6a04f971 | ||
|
befb21497f | ||
|
1d1ce49bf4 | ||
|
50bd7d01a8 | ||
|
4d3decc4c0 | ||
|
f8ce85ee6c | ||
|
2aa5d8c902 | ||
|
3c34aa0e1d | ||
|
a58a627fae | ||
|
aaf98b89d5 | ||
|
7cd86aaf1e | ||
|
dd4cab8153 | ||
|
d671052143 | ||
|
e9c3de03c3 | ||
|
1cf65c3236 | ||
|
0eaa2eae51 | ||
|
f56d740d98 | ||
|
342f44b9f3 | ||
|
e1c7b532bd | ||
|
3314024867 | ||
|
15499d014f | ||
|
21fbd0e967 | ||
|
deb9a4ed5d | ||
|
58837647c2 | ||
|
5c85c7bc61 | ||
|
aa8bac2da2 | ||
|
2b15969dcb | ||
|
7560d4f2f4 | ||
|
859e8a4576 | ||
|
f49c9eec53 | ||
|
a6f34c9029 | ||
|
bee3fda656 | ||
|
737b801768 | ||
|
96b19bb62d | ||
|
9372d2e34e | ||
|
9babab10f3 | ||
|
58d510f90f | ||
|
ea49700ec1 | ||
|
732be1b968 | ||
|
2f57897501 | ||
|
d79b0e05af | ||
|
3b15a7c0e2 | ||
|
3f508629a5 | ||
|
3473670051 | ||
|
aefd287222 | ||
|
6d25903a0b | ||
|
26da519310 | ||
|
edfee17f21 | ||
|
b37b914973 | ||
|
4e4a92100c | ||
|
8f7837364b | ||
|
be7917f9f5 | ||
|
a7d3bda08d | ||
|
d531785a23 | ||
|
eeeb973e39 | ||
|
166ae1da23 | ||
|
4f0967779e | ||
|
9d88837ef3 |
37
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
37
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: AlexanderAmelkin
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
*Please **DO NOT** report ANYTHING about 1.8.18, it is outdated. Please first check your alleged bug with the latest code from the top of the master branch here.*
|
||||||
|
|
||||||
|
**IPMITOOL Version**
|
||||||
|
|
||||||
|
Make sure you're reporting a bug in the latest code taken from `master` branch here, NOT a bug
|
||||||
|
that you've found in some version that you've got from your OS vendor or any source other than this repository.
|
||||||
|
|
||||||
|
```none
|
||||||
|
$ ipmitool -V
|
||||||
|
<output here>
|
||||||
|
```
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Using hardware/BMC '...'
|
||||||
|
2. Run `ipmitool ...`
|
||||||
|
3. Observe the abnormal reply:
|
||||||
|
```none
|
||||||
|
abnormal output example
|
||||||
|
```
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
120
.github/workflows/ci.yml
vendored
Normal file
120
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
# vi: set et ts=2 sw=2 :
|
||||||
|
name: build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-18.04, ubuntu-20.04, ubuntu-22.04 ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- name: install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt install \
|
||||||
|
automake \
|
||||||
|
gcc \
|
||||||
|
git \
|
||||||
|
libssl-dev \
|
||||||
|
libtool \
|
||||||
|
make \
|
||||||
|
wget
|
||||||
|
- name: install extra libraries
|
||||||
|
# This build job tries to verify as much of ipmitool code
|
||||||
|
# as possible, hence these libraries. They aren't usually
|
||||||
|
# needed for normal user builds:
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install \
|
||||||
|
libsystemd-dev \
|
||||||
|
libreadline-dev \
|
||||||
|
libfreeipmi-dev \
|
||||||
|
libusb-dev
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: bootstrap
|
||||||
|
run: ./bootstrap
|
||||||
|
- name: configure
|
||||||
|
run: |
|
||||||
|
# For Linux, build as many extra interfaces as possible
|
||||||
|
# to verify the code
|
||||||
|
./configure --enable-intf-dummy \
|
||||||
|
--enable-intf-dbus \
|
||||||
|
--enable-intf-usb \
|
||||||
|
--enable-intf-free
|
||||||
|
- name: make
|
||||||
|
run: make
|
||||||
|
- name: make check
|
||||||
|
run: make check
|
||||||
|
- name: make distcheck
|
||||||
|
run: make distcheck
|
||||||
|
|
||||||
|
macos:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ macos-10.15, macos-11, macos-12 ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: install dependencies
|
||||||
|
run: brew install automake openssl libtool freeipmi wget
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: bootstrap
|
||||||
|
run: ./bootstrap
|
||||||
|
- name: configure
|
||||||
|
run: |
|
||||||
|
./configure --enable-intf-dummy \
|
||||||
|
LDFLAGS=-L/usr/local/opt/openssl@1.1/lib \
|
||||||
|
CFLAGS=-I/usr/local/opt/openssl@1.1/include
|
||||||
|
- name: make
|
||||||
|
run: make
|
||||||
|
- name: make check
|
||||||
|
run: make check
|
||||||
|
- name: make distcheck
|
||||||
|
run: make distcheck
|
||||||
|
|
||||||
|
windows:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ windows-2019, windows-2022 ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: install dependencies
|
||||||
|
run: |-
|
||||||
|
choco install cygwin -y
|
||||||
|
choco install cyg-get -y
|
||||||
|
# Line continuation in PowerShell is backtick. Weird as Windows.
|
||||||
|
cyg-get gcc-g++ `
|
||||||
|
make `
|
||||||
|
automake `
|
||||||
|
autoconf `
|
||||||
|
m4 `
|
||||||
|
libtool `
|
||||||
|
libncurses-devel `
|
||||||
|
libreadline-devel `
|
||||||
|
libssl-devel `
|
||||||
|
dos2unix `
|
||||||
|
wget
|
||||||
|
echo "C:/tools/cygwin/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
echo "C:/tools/cygwin/usr/bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: convert line ends
|
||||||
|
# checkout action on Windows apparently converts line ends
|
||||||
|
# so we have to convert them back because cygwin bash can't
|
||||||
|
# can't handle Windows line ends
|
||||||
|
run: dos2unix bootstrap configure.ac csv-revision
|
||||||
|
- name: bootstrap
|
||||||
|
run: bash -c "./bootstrap"
|
||||||
|
- name: configure
|
||||||
|
run: bash -c "./configure"
|
||||||
|
- name: make
|
||||||
|
run: make
|
||||||
|
- name: make check
|
||||||
|
run: make check
|
||||||
|
- name: make distcheck
|
||||||
|
run: make distcheck
|
39
.gitignore
vendored
Normal file
39
.gitignore
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
.deps
|
||||||
|
.dirstamp
|
||||||
|
.libs
|
||||||
|
.*.swp
|
||||||
|
*.log
|
||||||
|
*.rej
|
||||||
|
*.orig
|
||||||
|
*.o
|
||||||
|
*.lo
|
||||||
|
*.la
|
||||||
|
*.*~
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
aclocal.m4
|
||||||
|
autom4te.cache
|
||||||
|
compile
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.status
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
depcomp
|
||||||
|
install-sh
|
||||||
|
ltmain.sh
|
||||||
|
libtool
|
||||||
|
missing
|
||||||
|
stamp-h1
|
||||||
|
control/ipmitool.spec
|
||||||
|
control/pkginfo
|
||||||
|
control/prototype
|
||||||
|
control/rpmmacros
|
||||||
|
src/ipmievd
|
||||||
|
src/ipmitool
|
||||||
|
doc/ipmievd.8
|
||||||
|
doc/ipmitool.1
|
||||||
|
cscope.out
|
||||||
|
tags
|
566
ChangeLog
566
ChangeLog
@ -1,4 +1,550 @@
|
|||||||
version 1.8.14 2014-03-28
|
version 1.8.19 2022-08-31
|
||||||
|
* Cast type before the left shift
|
||||||
|
* sel: Fix the deasserted thresholds inequality
|
||||||
|
* man: Update the text for -C option
|
||||||
|
* chassis restart_cause: Add new causes
|
||||||
|
* sel: Remove redundant "Reserve SEL"
|
||||||
|
* zero initialize the recv structure on the stack
|
||||||
|
* zero initialize the recv structure on the stack
|
||||||
|
* ci: Add support for MacOS-11
|
||||||
|
* ci: Remove ubuntu-16.04 support
|
||||||
|
* sdr: Fix modifier unit
|
||||||
|
* Fix compile error
|
||||||
|
* Refactor bridging level detection to dedicated function
|
||||||
|
* Fix double bridge detection in get_max_(req|rsp)_data_size()
|
||||||
|
* ipmi_mc: Fix the IPM_DEV_FWREV1_MAJOR_MASK
|
||||||
|
* helper: Fix stderr file descriptor
|
||||||
|
* Fix codefactor-io / CodeFactor warnings
|
||||||
|
* Use /run instead of /var/run
|
||||||
|
* oem: Update product IDs for YADRO
|
||||||
|
* lan: Add processing of get/set specific CCs
|
||||||
|
* lan: Refactor pointer style
|
||||||
|
* doc: update lanplus doc to reflect default cipher suite change
|
||||||
|
* ekanalyzer: Fix internal use area off-by-one bug
|
||||||
|
* ekanalyzer frushow: Fix internal area size calc
|
||||||
|
* sel: Fix "power supply inactive" flag offset
|
||||||
|
* ci: Add support for Ubuntu 20.04
|
||||||
|
* ci: Fix Ubuntu builds
|
||||||
|
* Fix compiler warning
|
||||||
|
* Fix compiler warning
|
||||||
|
* Fix compiler warning
|
||||||
|
* ci: Update for GitHub Actions v2.274.2
|
||||||
|
* free: Fix implicit function declarations
|
||||||
|
* Use "#pragma once" for headers
|
||||||
|
* Remove unneeded execution bits from C source files and a header file
|
||||||
|
* Convert line endings to LF
|
||||||
|
* Fixed compiler warning.
|
||||||
|
* RPM support: fixed broken build due to use of headers from kernel
|
||||||
|
* imbapi: replace __FUNCTION__ to eleminate compiler warnings
|
||||||
|
* lanplus: remove unused variable
|
||||||
|
* hpmfwupg: Clean up / refactor
|
||||||
|
* fru: Fix crashes on 6-bit ASCII strings
|
||||||
|
* oem: Add product ID for YADRO VEGMAN
|
||||||
|
* configure.ac: add '--location' for curl to follow location
|
||||||
|
* configure.ac: replace '-#' by '--progress-bar' with curl
|
||||||
|
* Add version info to debug output
|
||||||
|
* doc, ci: Fix an error in package name for Windows
|
||||||
|
* doc: Fix a small typo in INSTALL
|
||||||
|
* RPM support: updated spec file changelog
|
||||||
|
* RPM support: simplified build process
|
||||||
|
* RPM support: fixed broken RPM build
|
||||||
|
* doc: Update INSTALL with Windows info
|
||||||
|
* ci: Add Windows/cygwin config
|
||||||
|
* doc: Update INSTALL for new CI
|
||||||
|
* ci: Add github workflow, drop travis
|
||||||
|
* Fix compatibility with OpenBSD and macOS
|
||||||
|
* dist: Fix dependencies and cleanup
|
||||||
|
* dist: Add missing ipmi_time.h header to packaging
|
||||||
|
* configure: Fix compatibility with non-bash systems
|
||||||
|
* Finalize refactoring of string comparisons
|
||||||
|
* channel: Refactor set_user_access option processing
|
||||||
|
* Refactor string comparisons
|
||||||
|
* sel: Fix OEM record definition example
|
||||||
|
* sdr: harden against bad records
|
||||||
|
* fru: fix memory leak in ipmi_spd_print_fru
|
||||||
|
* ipmi_sel_set_time: fix strptime() return check
|
||||||
|
* hpm: use portable __max() in hpmfwupg
|
||||||
|
* hpmfwupg: move variable definition to .c file
|
||||||
|
* sel: time: fix null pointer dereference in set
|
||||||
|
* fru, sdr: Fix id_string buffer overflows
|
||||||
|
* lanp: Fix buffer overflows in get_lan_param_select
|
||||||
|
* channel: Fix buffer overflow
|
||||||
|
* session: Fix buffer overflow in ipmi_get_session_info
|
||||||
|
* fru: Fix buffer overflow in ipmi_spd_print_fru
|
||||||
|
* fru: Fix buffer overflow vulnerabilities
|
||||||
|
* configure: Drop requirement for curses et. al libs
|
||||||
|
* configure: remove some duplicate code
|
||||||
|
* doc: Update INSTALL to fix installation errors
|
||||||
|
* ipmi_dcmi: fix typo in nm_policy_options initialization.
|
||||||
|
* Docs: Add info on packages to install on Ubuntu 16.04
|
||||||
|
* chassis: Refactor to get rid of strncmp()
|
||||||
|
* chassis: Refactor main for centralized exiting
|
||||||
|
* chassis: bootdev: Refactor more
|
||||||
|
* chassis: bootdev: Refactor to reduce nesting
|
||||||
|
* chassis: bootdev: Fix help message and its formatting
|
||||||
|
* chassis: bootparam/bootdev: Refactor for less magic
|
||||||
|
* oem: supermicro: Add product codes from IPMICFG
|
||||||
|
* doc: Update man page regarding `user set password`
|
||||||
|
* user: Cleanup/refactor ipmi_user_password()
|
||||||
|
* user: Improve password length handling
|
||||||
|
* user: Alter "set password" usage information
|
||||||
|
* intf: Add missing function declarations
|
||||||
|
* doc: fix URL in README
|
||||||
|
* event: Clean up event sending from a file
|
||||||
|
* event: Clean up the event sending code
|
||||||
|
* event: Fix event submission via SSIF
|
||||||
|
* make: Use DESTDIR to install IANA PEN database
|
||||||
|
* lanplus: Fix embedded bridged responses handling
|
||||||
|
* Update .gitignore
|
||||||
|
* mc: Fix reporting of manufacturers > 64K
|
||||||
|
* Add installation of enterprise-numbers database
|
||||||
|
* Update documentation in regard to IANA PEN registry
|
||||||
|
* Use configurable path to IANA PEN registry
|
||||||
|
* Load IANA PEN registry from a file
|
||||||
|
* dbus: Replace obsolete INCLUDES with AM_CPPFLAGS
|
||||||
|
* oem: name change from Newisys to Viking Enterprise Solutions
|
||||||
|
* Fix default interface to behave as it did before
|
||||||
|
* man: Add documentation for chassis bootmbox
|
||||||
|
* man: Update the chassis bootparam section
|
||||||
|
* chassis: Add boot initiator mailbox support
|
||||||
|
* chassis: Use command-specific completion code parser
|
||||||
|
* Add support for command-specific completion codes
|
||||||
|
* Add a helper htoipmi24() function
|
||||||
|
* Add a helper args2buf() function
|
||||||
|
* man: Cleanup the manpage formatting tags
|
||||||
|
* create_pen_list: only print if values are set
|
||||||
|
* chassis: Refactor to reduce code duplication
|
||||||
|
* chassis: Refactor to reduce code duplication
|
||||||
|
* sdr: Fix segfault on invalid unit types
|
||||||
|
* vendor: Add YADRO TATLIN Storage Controller ID
|
||||||
|
* exchange-bmc-os-info: Remove dependency on ipmi.service
|
||||||
|
* Add mechanism to configure to set the default interface
|
||||||
|
* ci: Update INSTALL to reflect recent changes
|
||||||
|
* ci: Set up matrix builds with Travis CI
|
||||||
|
* Enable Travis build of D-Bus interface
|
||||||
|
* add OpenBMC D-Bus interface
|
||||||
|
* Fix "ipmitool pef {status,info}" not printing final newline
|
||||||
|
* Remove unused include
|
||||||
|
* Fix IPMI DCMI message typo
|
||||||
|
* open: swap free() calls for free_n()
|
||||||
|
* open: checking received msg id against expectation
|
||||||
|
* open: fix whitespace
|
||||||
|
* Refactor free_n() function
|
||||||
|
* fru: swap free() calls for free_n()
|
||||||
|
* fru: Fix write chunk reduction code
|
||||||
|
* fru: add macro FRU_AREA macros
|
||||||
|
* fru: replace magic return codes with macros
|
||||||
|
* fru header: add return error codes specific to fru
|
||||||
|
* fru: fix ipmi_fru_picmg_ext_edit as bool
|
||||||
|
* fru: use bool with ipmi_fru_oemkontron_edit
|
||||||
|
* fru: change ipmi_fru_query_new_value to return bool
|
||||||
|
* fru: mark ipmi_fru_query_new_value as static
|
||||||
|
* fru: add fru_cc_rq2big helper method for code checks
|
||||||
|
* fru: cleanup ipmi_fru_upg_ekeying
|
||||||
|
* fru: use ipmi_cc defined maros for return codes
|
||||||
|
* fru: drop extraneous parentheses on negative returns
|
||||||
|
* fru: delete unused variable matchInstance
|
||||||
|
* fru: cleanup ipmi_fru_oemkontron_get
|
||||||
|
* fru: fixup array bounds checking
|
||||||
|
* hpm: Adhere to centralized exiting
|
||||||
|
* hpm: Minor refactoring
|
||||||
|
* hpm: Fix resource leak
|
||||||
|
* sol: Make interface timeout obey the -N option
|
||||||
|
* helper: add free_n method to handle clearing pointers
|
||||||
|
* cygwin: imb: Fix build error (wchar_t)
|
||||||
|
* lanplus: Fix segfault for truncated dcmi response
|
||||||
|
* Move led color static array to source file
|
||||||
|
* drop unused static arrays
|
||||||
|
* move static objects to source file
|
||||||
|
* cleanup all unused-parameter warnings
|
||||||
|
* use __UNUSED__ macro instead of gcc specific attribute
|
||||||
|
* implement __UNUSED__ macro for marking unused
|
||||||
|
* Add .dirstamp to .gitignore
|
||||||
|
* fru: Fix processing of unspecified board mfg. date
|
||||||
|
* [compiler-warnings-fixes] use correct fall through comment
|
||||||
|
* [compiler-warnings-fixes] ipmi_start_daemon: check return values
|
||||||
|
* [compiler-warnings-fixes] ipmi_sdr.c: remove unused function parameters
|
||||||
|
* lan: Fix processing disabled VLAN
|
||||||
|
* Make ipmitool respect system locale settings
|
||||||
|
* Fix strftime() non-literal argument warning
|
||||||
|
* Refactor timestamp handling
|
||||||
|
* doc: Update manpage with new contact info
|
||||||
|
* lanplus: Refactoring
|
||||||
|
* lanplus: Fix -C option processing
|
||||||
|
* lanplus: Auto-select 'best' cipher suite available
|
||||||
|
* lanplus: Fix compile with deprecated APIs disabled.
|
||||||
|
* doc: Update home page links
|
||||||
|
* doc: Update formatting of ipmitool man page
|
||||||
|
* sensor: Refactor ipmi_sensor_print_fc_threshold()
|
||||||
|
* sensor: Add support for csv output
|
||||||
|
* plugins: open: Properly enable event receiver (#35)
|
||||||
|
* lan: Refactoring: Remove unused function
|
||||||
|
* general: Get rid of some unused parameter warnings
|
||||||
|
* mc: guid: Implement encoding autodetection
|
||||||
|
* mc: guid: Fix timestamp decoding
|
||||||
|
* mc: guid: Add support for non-standard encodings
|
||||||
|
* mc: guid: Fix byte ordering to follow IPMI spec
|
||||||
|
* Refactoring: optimize pointer checks
|
||||||
|
* imb: Refactoring: remove duplicate code
|
||||||
|
* Refactoring: get rid of superfluous comparisons
|
||||||
|
* Refactoring. Improve code reuse ratio.
|
||||||
|
* general: Fix several misspellings
|
||||||
|
* mc: Fix compiler warnings
|
||||||
|
* general: Add array_byteswap() to helper
|
||||||
|
* lanplus: Make byteswapping generic
|
||||||
|
* framework: Update .gitignore
|
||||||
|
* framework: Switch to C11 standard with GNU extensions
|
||||||
|
* framework: ci: Add support for Travis CI
|
||||||
|
* oem: Add basic support for Quanta
|
||||||
|
* intf: Refactoring. Remove unused sendrsp()
|
||||||
|
* dummy: Add default dummy socket
|
||||||
|
* mc: Fix manufacturer ID masking
|
||||||
|
* Refactoring. Remove useless feature test macros.
|
||||||
|
* general: Make byteswapping arch-independent
|
||||||
|
* sel: Minor refactoring
|
||||||
|
* sdr: Refactor/optimize code. No functional changes.
|
||||||
|
* Add an option to display all dates in UTC
|
||||||
|
* mc: Code refactor to reduce copy-paste ratio
|
||||||
|
* mc: watchdog set: Refactor to reduce complexity
|
||||||
|
* mc: watchdog set: Fix intr setting
|
||||||
|
* mc: watchdog get: Update to match IPMI 2.0 spec
|
||||||
|
* mc: watchdog: Add `set` command
|
||||||
|
* framework: Make git ignore cscope.out
|
||||||
|
* plugins/open: Fix for interrupted select
|
||||||
|
* nm: Fix policy range (#12)
|
||||||
|
* Replace user_id masks with a macro (#8)
|
||||||
|
* fru: internaluse: Fix segmentation fault (#9)
|
||||||
|
* dcmi: Refactor
|
||||||
|
* ID:508 - Fix segfaults in dcmi command handlers
|
||||||
|
* vendor: Add YADRO VESNIN identification
|
||||||
|
* ID:491 - Fetch vendor IDs from IANA
|
||||||
|
* ID:472 - Fix The Most recent Addition/Erase date
|
||||||
|
* ID:480 - Call EVP_CIPHER_CTX_free() instead of EVP_CIPHER_CTX_cleanup()
|
||||||
|
* ID:480 - ipmitool coredumps in EVP_CIPHER_CTX_init
|
||||||
|
* Make git revision more descriptive
|
||||||
|
* ID:477 - fru: Fix decoding of non-text data in get_fru_area_str()
|
||||||
|
* ID:479 - ekanalyzer: fix processing of custom mfg. fields
|
||||||
|
* ID:478 - ekanalyzer: Fixed decoding of FRU fields
|
||||||
|
* Add some more configure/build/editor byproducts to .gitignore
|
||||||
|
* Add git hash and dirty mark to ipmitool version
|
||||||
|
* Prevent autoreconf from complaining about missing NEWS
|
||||||
|
* Add bootstrap support for Mac
|
||||||
|
* ID:474 - Compile fix on nonlinux systems
|
||||||
|
* ID:461 - Make compiler happier about changes related to OpenSSL 1.1
|
||||||
|
* ID:461 - OpenSSL 1.1 compatibility - "error: storage size of 'ctx' isn't known"
|
||||||
|
|
||||||
|
version 1.8.18 2016-10-08
|
||||||
|
* Add mac2str() and str2mac() to print/parse MAC address
|
||||||
|
* Change formatting, remove commented-out code in
|
||||||
|
src/plugins/imb/imbapi.c
|
||||||
|
* Export find_lan_channel() as global
|
||||||
|
* Expose _ipmi_get_channel_info()
|
||||||
|
* Extend buf2str to allow separator
|
||||||
|
* Fix indentation of #define in src/plugins/imb/imbapi.c
|
||||||
|
* Fix missing `goto out_free;` when ipmi_parse_hex() returns (-1)
|
||||||
|
* Fix warning for buf2str argument
|
||||||
|
* ID 408 - fix sel list last X listing
|
||||||
|
* ID: 38 - Protocol violating SOL retries when talking to
|
||||||
|
SIMSO-HTC
|
||||||
|
* ID: 459 - Fix reading FRU on Artesyn (Emerson) shelf manager,
|
||||||
|
MF105.
|
||||||
|
* ID: 464 - ipmievd crash fix in log_event
|
||||||
|
* ID:230 - check return value of malloc() in lib/ipmi_ekanalyzer.c
|
||||||
|
* ID:261 - Fix err. output consistency for % ipmitool chassis
|
||||||
|
INV_PARAM;
|
||||||
|
* ID:287 - Fix print-out of DDR3 SDRAM Serial Number
|
||||||
|
* ID:287 - Remove trailing white-spaces from dimm_spd.c
|
||||||
|
* ID:289 - bmx-snmp-proxy: PEF alerting does not work for
|
||||||
|
multiple destinations
|
||||||
|
* ID:312 - BREAKING CHANGE - Re-design of PEF user interface
|
||||||
|
* ID:312 - Fix bitmask in _ipmi_set_pef_policy_entry()
|
||||||
|
* ID:335 - Check return value of fseek(), prevent segfault
|
||||||
|
* ID:335 - Check return value of fseek(), prevent segfault
|
||||||
|
* ID:355 - Comment out statement without effect in lib/ipmi_sel.c
|
||||||
|
* ID:355 - Fix 'missing initializer' in struct lan_param
|
||||||
|
* ID:355 - Fix ``warning: ISO C forbids zero-size array 'data'''
|
||||||
|
* ID:355 - Fix different pointer type in lib/ipmi_picmg.c
|
||||||
|
* ID:355 - Fix missing struct initializers in lib/ipmi_firewall.c
|
||||||
|
* ID:355 - Fix printf format in lib/ipmi_sunoem.c
|
||||||
|
* ID:355 - Fix printf() related warnings in lib/ipmi_delloem.c
|
||||||
|
* ID:355 - Fix signedness warnings in lib/ipmi_sdr.c
|
||||||
|
* ID:355 - Fix statements without effect in lib/ipmi_ekanalyzer.c
|
||||||
|
* ID:355 - Move section_id from ipmi_fru. to ipmi_fru.c
|
||||||
|
* ID:355 - Replace DEBUG() macro with lprintf(LOG_DEBUG, ...)
|
||||||
|
* ID:375 - Add lan6 subcommand to handle IPv6 LAN parameters
|
||||||
|
* ID:400 - Add support for VITA-specific sensor types and events.
|
||||||
|
* ID:441 - Add support for HMAC_MD5 and HMAC_SHA256
|
||||||
|
* ID:443 - Disable USB driver by default on non-Linux systems
|
||||||
|
* ID:444 - Cleanup of defaults in configure.ac
|
||||||
|
* ID:445 - Fix of compilation on FreeBSD
|
||||||
|
* ID:446 - Fix broken firewall reset iterator
|
||||||
|
* ID:447 - Fix access beyond array limits in serial_terminal
|
||||||
|
* ID:449 - ipmitool close console session for sol deactivate
|
||||||
|
command
|
||||||
|
* ID:451 - Modify the memory ecc error display of SEL for new
|
||||||
|
supermicro motherboards.
|
||||||
|
* ID:452 - Add PICMG extension 5.x for PICMG extension check
|
||||||
|
* ID:454 - Add support for PICMG 3.1 R2.0 Link Types and Link
|
||||||
|
Classes.
|
||||||
|
* ID:456 - Unable to disable the VLAN ID using ipmitool
|
||||||
|
* ID:457 - Display User ID enable/disable status
|
||||||
|
* ID:463 - Removal of Nokia Siemens Networks
|
||||||
|
* ID:465 - Supermicro memory ecc Modify the memory ecc error
|
||||||
|
display of SEL for new supermicro boards.
|
||||||
|
* Moved ipmi_parse_hex() to helper.c
|
||||||
|
* Re-work ipmi_mc_get_guid() and turn it into reusable code
|
||||||
|
* Revert "ID:335 - Check return value of fseek(), prevent
|
||||||
|
segfault"
|
||||||
|
* Rewrite code with the notion that Kg is binary data, not string
|
||||||
|
|
||||||
|
version 1.8.17 2016-05-01
|
||||||
|
* Add INSTALL and NEWS, mandated by autoconf
|
||||||
|
* Added missing ipmi_sel_supermicro.h to template Makefile.am
|
||||||
|
* Check rsp->data_len in ipmi_sel_get_info()
|
||||||
|
* Fix "redirecting incorrect #include <sys/poll.h> to <poll.h>"
|
||||||
|
warning with musl libc
|
||||||
|
* Fix automake compatibility warnings
|
||||||
|
* Fix implicit declaration of function
|
||||||
|
'get_nic_selection_mode_12g' in lib/ipmi_delloem.c
|
||||||
|
* Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/imb/imb.c
|
||||||
|
* Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/lanplus/lanplus.c
|
||||||
|
* Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/open/open.c
|
||||||
|
* Fix implicit declarations of functions 'HpmfwupgPreUpgradeCheck'
|
||||||
|
and 'ipmi_intf_get_max_request_data_size' in lib/ipmi_hpmfwupg.c
|
||||||
|
* Fix implicit declarations of functions
|
||||||
|
'ipmi_intf_set_max_request_data_size' and
|
||||||
|
'ipmi_intf_set_max_response_data_size' in lib/hpm2.c
|
||||||
|
* Fix implicit function declaration of
|
||||||
|
ipmi_intf_get_max_response_data_size in lib/ipmi_sdr.c
|
||||||
|
* Fix several implicit declarations of functions in
|
||||||
|
lib/ipmi_main.c
|
||||||
|
* Fix several implicit function declarations in lib/ipmi_fru.c
|
||||||
|
* Fix warning: suggest parentheses around '+' inside '<<'
|
||||||
|
in lib/ipmi_main.c
|
||||||
|
* Fix warning: suggest parentheses around arithmetic in operand of
|
||||||
|
'|' in include/ipmitool/hpm2
|
||||||
|
* Get rid of old INCLUDES macro, use AM_CPPFLAGS instead.
|
||||||
|
* ID 440 - Fix 'unknown type name fd_set" error.
|
||||||
|
* ID 440 - remove obsolete headers from lib/ipmi_sunoem.c
|
||||||
|
* ID:322 - let 'ekanalyzer frushow' run without a working
|
||||||
|
IPMI target
|
||||||
|
* ID:355 - Add #include <strings.h> to lib/ipmi_sel.c
|
||||||
|
* ID:355 - Add macros and #include and reduce number of warnings
|
||||||
|
* ID:355 - Change CFLAG -std=c99 to -std=gnu99
|
||||||
|
* ID:355 - Move Super Micro stuff into dedicated header file
|
||||||
|
* ID:355 - Remove declared, but not used variables
|
||||||
|
* ID:404 - Edit FRU information update problem
|
||||||
|
* ID:405 - Use meaningful Generator ID for "ipmitool sel add"
|
||||||
|
* ID:407 - Avoid assert on mismatched session ID
|
||||||
|
* ID:409 - Fix IPv6 socket creation on Windows/Cygwin.
|
||||||
|
* ID:410 - Disable USB interface for Windows/Cygwin by default.
|
||||||
|
* ID:410 - Enable/disable USB interface by "auto"
|
||||||
|
* ID:411 - Fix HPM.2 revision check for R1.1 and subsequent
|
||||||
|
specification revisions.
|
||||||
|
* ID:412 - Check errors when setting a user password.
|
||||||
|
* ID:413 - Print new line chne character when setting user
|
||||||
|
privilege.
|
||||||
|
* ID:414 - ekanalyzer frushow fails to show 'Product Info'
|
||||||
|
correctly
|
||||||
|
* ID:417 - Fix some typos
|
||||||
|
* ID:418 - Fix Compiling under Mac OS X
|
||||||
|
* ID:419 - List dummy.h in Makefile.am, so it gets included in
|
||||||
|
a release tarball
|
||||||
|
* ID:421 - Fix memleak for sol output
|
||||||
|
* ID:423 - Don't assume internal use area is present in ekanalyzer
|
||||||
|
* ID:424 - Update dimm_spd.c with data from the latest JEDEC List
|
||||||
|
* ID:425 - Disable USB interface for OS X/darwin
|
||||||
|
* ID:426 - Fallback to run-time detection of PAGESIZE if
|
||||||
|
compile-time detection is not supported
|
||||||
|
* ID:426 - Include sys/socket.h instead of asm/socket.h
|
||||||
|
* ID:426 - Include wchar.h instead of defining wchar_t ourselves
|
||||||
|
* ID:427 - Cleanup comment in ipmi_sdr_get_header()
|
||||||
|
* ID:427 - The first two bytes of dumped raw SDR data is wrong.
|
||||||
|
* ID:428 - Update IANA numbers / Product Name for IBM and ADLINK
|
||||||
|
* ID:430 - Change Nokia Siemens Networks to Nokia Solutions
|
||||||
|
and Networks
|
||||||
|
* ID:431 - Fix correct interpretation of led states
|
||||||
|
* ID:437 - sel: Fix "sel time set <time>"
|
||||||
|
* Make bootstrap script part of dist packages
|
||||||
|
* Remove #if 0 code aka not-compiled-in
|
||||||
|
* Remove trailing white-spaces in lib/log.c
|
||||||
|
* git-ignore autoconf-generated files
|
||||||
|
|
||||||
|
version 1.8.16 2015-11-22
|
||||||
|
* Add _ipmi_get_channel_access() and _ipmi_get_channel_info()
|
||||||
|
* Add _ipmi_get_user_access() and _ipmi_set_user_access()
|
||||||
|
* Add _ipmi_get_user_name()
|
||||||
|
* Add _ipmi_set_channel_access() function
|
||||||
|
* Add _ipmi_set_user_password() function
|
||||||
|
* Add limits check in get_cmdline_macaddr()
|
||||||
|
* Change expression in ipmi_pef_get_info() in order to silence Coverity
|
||||||
|
* Change expression in ipmi_pef_list_policies() in order to silence Coverity
|
||||||
|
* Code cleanup in ipmi_user_main()
|
||||||
|
* Create ask_password() and re-use code
|
||||||
|
* Delete dead code from ipmi_sunoem_echo() - CID#1261338
|
||||||
|
* Don't output pidfile before parsing command line arguments
|
||||||
|
* Don't use tmp variable since it's not necessary in ipmi_user_test()
|
||||||
|
* Fix 'user help' output
|
||||||
|
* Fix Assign instead of compare in KfwumGetDeviceInfo() - CID#1149034
|
||||||
|
* Fix Identical code for different branches in ipmi_tsol_main() -
|
||||||
|
CID#1261346
|
||||||
|
* Fix big parameter passed by value in ipmi_sel_oem_match() - CID#1261347
|
||||||
|
* Fix dead code in ipmi_firewall_reset() - CID#1261342
|
||||||
|
* Fix eval logic in ipmi_user_priv()
|
||||||
|
* Fix file descriptor leak in ipmi_exec_main() - CID#1149040
|
||||||
|
* Fix identical code for diff branches in DellOEM - CID#1261326
|
||||||
|
* Fix memory leak in get_supermicro_evt_desc()
|
||||||
|
* Fix memory leak in ipmi_ek_display_board_info_area() - CID#1149051
|
||||||
|
* Fix missing return in ipmi_kontronoem_main() - CID#1261317
|
||||||
|
* Fix of previous commit - memset() expects pointer
|
||||||
|
* Fix out-of-bound-reads in get_supermicro_evt_desc()
|
||||||
|
* Fix resource leak in fru_area_print_board() - CDI#1149048
|
||||||
|
* Fix resource leak in fru_area_print_chassis() - CID#1149047
|
||||||
|
* Fix resource leak in fru_area_print_product() - CID#1149046
|
||||||
|
* Fix resource leak in ipmi_kontron_set_serial_number() - CID#1149041
|
||||||
|
* Fix typo vlan->VLAN in ipmi_lan_set_vlan_id() and
|
||||||
|
ipmi_lan_set_vlan_priority()
|
||||||
|
* Fix uninitialized struct in ipmi_fru_upg_ekeying() - CID#1149065
|
||||||
|
* Fix user input validation in Channel and User sub-commands
|
||||||
|
* Fix wrong size argument in ipmi_sdr_list_cache_fromfile() - CID#1149056
|
||||||
|
* Fix/remove pointer cast in _ipmi_set_user_access()
|
||||||
|
* Hook functions in ipmi_user to _ipmi_set_user_password()
|
||||||
|
* Hook ipmi_get_channel_info() to _ipmi_get_*()
|
||||||
|
* Hook ipmi_get_channel_medium() to new _ipmi_get_*() functions
|
||||||
|
* Hook ipmi_lan_set_password() to _ipmi_set_user_password()
|
||||||
|
* Hook ipmi_print_user_list() and friends to _ipmi_* functions
|
||||||
|
* Hook ipmi_set_alert_enable() to _ipmi_*()
|
||||||
|
* Hook ipmi_set_user_access() to _ipmi_set_user_access()
|
||||||
|
* Hook ipmi_user_priv() to _ipmi_set_user_access()
|
||||||
|
* ID:307 - Intel I82751 super pass through mode fixup
|
||||||
|
* ID:355 - Fix compiler warnings for Dummy Interface
|
||||||
|
* ID:380 - raw commands override retry and timeout values
|
||||||
|
* ID:319 - Interface safe re-open
|
||||||
|
* ID:320 - Add VITA 46.11 support
|
||||||
|
* ID:333 - Set read timeout to 15s in OpenIPMI interface
|
||||||
|
* ID:336 - ipmitool does not fall back to IPv4 for IPMI v2 / RMCP+ sessions
|
||||||
|
* ID:343 - Print actual sensor thresholds in 'sensors' comand
|
||||||
|
* ID:343 - Remove AC_FUNC_MALLOC
|
||||||
|
* ID:344 - Fix HPM.2 long message support
|
||||||
|
* ID:345 - Do not do several close session retries when catching SIGINT
|
||||||
|
* ID:346 - lib/ipmi_sdradd.c ipmi_sdr_read_record has a file descriptor leak
|
||||||
|
* ID:347 - Incorrect reserved channel number
|
||||||
|
* ID:348 - Add support for the "System Firmware Version"
|
||||||
|
* ID:349 - user set password - add option to choose 16/20 byte password
|
||||||
|
* ID:354 - Replace obsolete u_int with uint32_t in dimm_spd.c
|
||||||
|
* ID:354 - Replace obsolete u_int[0-9]+_t with standardized types in Free
|
||||||
|
iface
|
||||||
|
* ID:354 - forcefully switch to C99 and more strict CFLAGS
|
||||||
|
* ID:354 - replace/drop caddr_t in IMB
|
||||||
|
* ID:354 - struct member h_addr has been replaced
|
||||||
|
* ID:354 - uint8_t >= 0 is always true, don't test it
|
||||||
|
* ID:355 - Fix Enumeration value not handled in ipmi_get_event_desc()
|
||||||
|
* ID:355 - Fix ``ISO C forbids omitting the middle term of a ?: expression''
|
||||||
|
* ID:355 - Fix ``obsolete use of designated initializer with ¿:¿'' warning
|
||||||
|
* ID:355 - Fix comparison of unsigned expression
|
||||||
|
* ID:355 - Fix compiler warnings
|
||||||
|
* ID:355 - Fix compiler warnings in dimm_spd.c
|
||||||
|
* ID:355 - Fix couple compiler warnings in ipmi_lanp.h
|
||||||
|
* ID:355 - Fix formatting warning in get_cmdline_ipaddr()
|
||||||
|
* ID:355 - Fix zero-length format string warning in
|
||||||
|
get_supermicro_evt_desc()
|
||||||
|
* ID:355 - Remove defined but unused variable in _set_command_enables()
|
||||||
|
* ID:355 - remove unused variables from ipmi_dcmi.c
|
||||||
|
* ID:357 - out-of-bound access in DDR4 code ID:356 - DIMM4 Die Count is
|
||||||
|
unreachable
|
||||||
|
* ID:357 - out-of-bound access in DDR4 code
|
||||||
|
* ID:358 - check data length in else branch of ipmi_spd_print()
|
||||||
|
* ID:361 - Add a OEM IANA information
|
||||||
|
* ID:363 - Node Manager feature patch.
|
||||||
|
* ID:363 - fix Coverity issues in NM implementation
|
||||||
|
* ID:364 - Fix for serial-basic interface bridging
|
||||||
|
* ID:365 - Fix for ipmitool crash when using serial-terminal interface
|
||||||
|
* ID:366 - Properly clean LAN and LAN+ interfaces on close
|
||||||
|
* ID:367 - Fix building of non-bridged LAN interface commands
|
||||||
|
* ID:368 - Fix handling of bridging-related parameters
|
||||||
|
* ID:369 - Fix lanplus interface bridging and response matching
|
||||||
|
* ID:370 - add anonymous union support in CFLAGS for older gcc
|
||||||
|
* ID:371 - add ericsson oem
|
||||||
|
* ID:373 - Fix compilation of IMB on Windows
|
||||||
|
* ID:374 - Check/set LED Duration correctly
|
||||||
|
* ID:376 - Add means to configure "Bad Password Threshold"
|
||||||
|
* ID:381 - Script to log installation status as SEL events
|
||||||
|
* ID:382 - Fix memcpy() params in HpmFwupgActionUploadFirmware()
|
||||||
|
* ID:383 - Fix compile-time error in src/plugins/lan/lan.c
|
||||||
|
* ID:384 - Fix compilation under cygwin64
|
||||||
|
* ID:388 - Fix Error message always printed if BMC does not support VITA
|
||||||
|
* ID:388 - Handle ccode 0xCC as well in VITA discovery
|
||||||
|
* ID:388 - Turn all messages into LOG_INFO in VITA discovery
|
||||||
|
* ID:389 - Add on of Advantech IANA number
|
||||||
|
* ID:390 - Support for new Communication Interface (USB Medium)
|
||||||
|
* ID:391 - changing data_len from 17 to 16 according to ipmi spec 22.29,
|
||||||
|
first byte is completion code
|
||||||
|
* ID:392 - _ipmi_get_user_name() work-around for some BMCs
|
||||||
|
* ID:393 - ipmitool man page addition for Node Manager support.
|
||||||
|
* ID:394 - close fp if isn't NULL and set it NULL afterwards in USB plugin
|
||||||
|
* ID:394 - plugins/usb: Fix probe for SCSI devices
|
||||||
|
* ID:395 - Fix fru string without resizing it
|
||||||
|
* ID:396 - Fixed invalid length check in picmg led cap command.
|
||||||
|
* ID:397 - Fixed picmg policy set command.
|
||||||
|
* ID:398 - Fixed channel setaccess command.
|
||||||
|
* ID:399 - Fixed channel getciphers command.
|
||||||
|
* ID:401 - Fixed 30 second delay when activating SOL on 'dumb' Intel MACs.
|
||||||
|
* ID:402 - Misguiding error print-out when using some 'lan' commands.
|
||||||
|
* Init user_access_t struct in ipmi_user_priv()
|
||||||
|
* Make user User Privilege Limit is within range
|
||||||
|
* Node Manager Feature, correct 1268194 missing break.
|
||||||
|
* Output pidfile only in verbose mode
|
||||||
|
* Print error message to STDERR in ipmi_channel.c
|
||||||
|
* Re-work 'channel getaccess' and 'channel setaccess'
|
||||||
|
* Re-work ccode eval in ipmi_get_channel_medium()
|
||||||
|
* Remove commented-out code in ipmi_picmg_clk_set() - CID#1261339
|
||||||
|
* Remove dead code - rsp can't be NULL at this point - CID#1149005
|
||||||
|
* Remove dead code in fru_area_print_board() - CID#1149001
|
||||||
|
* Remove dead code in fru_area_print_chassis() - CID#1149000
|
||||||
|
* Remove dead code in fru_area_print_product() - CID#1148999
|
||||||
|
* Remove dead(duplicate) code from ipmi_sol_main() - CID#1148996
|
||||||
|
* Remove get_channel_access_rsp and get_channel_info_rsp structs
|
||||||
|
* Remove ipmi_user_set_password()
|
||||||
|
* Remove length checks in get_supermicro_evt_desc()
|
||||||
|
* Remove redundant user-input conversion from ipmi_sel_delete()
|
||||||
|
* Remove trailing white-spaces in ipmi_user.c
|
||||||
|
* Remove trailing white-spaces in ipmi_user.c
|
||||||
|
* Remove trailing white-spaces in src/plugins/dummy/dummy.c
|
||||||
|
* Remove unused variable from ipmi_get_channel_cipher_suites()
|
||||||
|
* Replace deprecated bzero() with memset()
|
||||||
|
* Replace s6_addr16 with s6_addr since Mac OS X does not have it
|
||||||
|
* Rewrite ipmi_set_channel_access()
|
||||||
|
* Split ipmi_user_main() into smaller functions
|
||||||
|
* ipmi_print_user_summary() to utilize _ipmi_get_user_access()
|
||||||
|
* ipmitool delloem: ipmitool delloem extension always return success - fix
|
||||||
|
it
|
||||||
|
|
||||||
|
version 1.8.15 2014-11-24
|
||||||
|
* ID: 340 - ipmitool sol session improperly closes on packet retry
|
||||||
|
* ID: 277 - support for hostnames longer than 64 chars
|
||||||
|
* ID: 313 - ipmitool doesn't support hostname long than 64 symbols
|
||||||
|
* ID: 277 - Minor issue with ipmi_intf_session_set_hostname()
|
||||||
|
* ID: 247 - 'sensor thresh' help output is wrong
|
||||||
|
* ID: 324 - conflicting declaration write_fru_area()
|
||||||
|
* ID: 337 - Add support for 13G Dell PowerEdge
|
||||||
|
* ID: 325 - DDR4 DIMM Decoding Logic
|
||||||
|
* ID: 328 - HPM.2 fixes
|
||||||
|
* ID: 329 - hpm.1 upgrade fixes
|
||||||
|
* ID: 103 - picmg discover messages should be DEBUG, not INFO
|
||||||
|
* ID: 331 - Passwords provided in file (-f option) truncated on space
|
||||||
|
* ID: 318 - ipmi_tsol.c: fix buffer overflow
|
||||||
|
* ID: 306 - "fru print" command prints the FRU #0 twice
|
||||||
|
* ID: 305 - HPM.1 deferred activation support fixup
|
||||||
|
* ID: 317 - ipmi_fwum.c: fix typo
|
||||||
|
* ID: 315 - buildsystem: configure.in is deprecated
|
||||||
|
* ID: 316 - Directory debian is outdated
|
||||||
|
* ID: 103 - 'lib/ipmi_ekanalyzer.c' needs a re-work
|
||||||
|
* ID: 46 - SEL OEM record corner case
|
||||||
|
|
||||||
|
version 1.8.14 2014-05-05
|
||||||
* ID: 299 - openipmi plugin writes zero to wrong byte
|
* ID: 299 - openipmi plugin writes zero to wrong byte
|
||||||
* ID: 301 - Add OS/Hypervisor installation status events
|
* ID: 301 - Add OS/Hypervisor installation status events
|
||||||
* ID: 298 - fix LANplus retry
|
* ID: 298 - fix LANplus retry
|
||||||
@ -23,18 +569,22 @@ version 1.8.14 2014-03-28
|
|||||||
* ID: 90 - Add options to chassis bootparam set bootflag
|
* ID: 90 - Add options to chassis bootparam set bootflag
|
||||||
* ID: 292 -Properly handle plugin non-zero target adddress with -t
|
* ID: 292 -Properly handle plugin non-zero target adddress with -t
|
||||||
* Numerous Fixes based on running Coverity
|
* Numerous Fixes based on running Coverity
|
||||||
* Use TIOCFLUSH if TCFLSH is missing to get the serial plugin building on Hurd.
|
* Use TIOCFLUSH if TCFLSH is missing to get the serial plugin building on
|
||||||
* Disable imb and open plugins by default on Hurd. The platform lack the required kernel support.
|
Hurd.
|
||||||
* Change serial plugin to only try to disable the IUCLC serial line flag on platforms supporting it. Fixes build problem on Hurd and FreeBSD.
|
* Disable imb and open plugins by default on Hurd. The platform lack
|
||||||
* Add support for enabling/disabling PEF policy entries
|
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
|
* PA: 83 - Revised IPv6 patch
|
||||||
* FR: 24 - Exchange OS Name Hostname BMC URL during startup
|
* FR: 24 - Exchange OS Name Hostname BMC URL during startup
|
||||||
* Incorect byteswap in SOL maximum payload
|
* ID: 304 - Incorect byteswap in SOL maximum payload
|
||||||
* Fix build error in HPM.2 code
|
* ID: 303 - Fix build error in HPM.2 code
|
||||||
* ID: 300 - new sunoem functionality
|
* ID: 300 - new sunoem functionality
|
||||||
* ID: 144 - Fix 'dcmi power set_limit action <value>'
|
* ID: 144 - Fix 'dcmi power set_limit action <value>'
|
||||||
* ID: 302 - HPM.2 long message support
|
* ID: 302 - HPM.2 long message support
|
||||||
* Add new SEL entries for ipmi 2.0 rev 1.1
|
* 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
|
version 1.8.13 2013-09-09
|
||||||
* ID: 3611905 - Direct Serial Basic/Terminal Mode Interface drivers
|
* ID: 3611905 - Direct Serial Basic/Terminal Mode Interface drivers
|
||||||
|
431
INSTALL
Normal file
431
INSTALL
Normal file
@ -0,0 +1,431 @@
|
|||||||
|
Installation Instructions
|
||||||
|
*************************
|
||||||
|
|
||||||
|
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
|
||||||
|
Copying and distribution of this file, with or without modification,
|
||||||
|
are permitted in any medium without royalty provided the copyright
|
||||||
|
notice and this notice are preserved. This file is offered as-is,
|
||||||
|
without warranty of any kind.
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
=============
|
||||||
|
|
||||||
|
This project requires at least gcc 4.8.1 as it uses some GNU
|
||||||
|
extensions and some C11 features. For `lanplus` interface the OpenSSL
|
||||||
|
library and development headers are required. As of July 2020, the
|
||||||
|
project is tested automatically to build cleanly for the following
|
||||||
|
64-bit operating systems using GitHub Actions workflow:
|
||||||
|
|
||||||
|
- Ubuntu 18.04 Bionic Beaver
|
||||||
|
- Ubuntu 20.04 Focal Fossa
|
||||||
|
- Ubuntu 22.04 Jammy Jellyfish
|
||||||
|
- MacOS X 10.15 Catalina
|
||||||
|
- MacOS 11 Big Sur
|
||||||
|
- MacOS 12 Monterey
|
||||||
|
- Microsoft Windows Server 2019
|
||||||
|
- Microsoft Windows Server 2022
|
||||||
|
|
||||||
|
It is also known to build successfully on Ubuntu 14.04 and Fedora 31,
|
||||||
|
but that is not automatically verified.
|
||||||
|
|
||||||
|
For Ubuntu 14.04+ it is recommended to do the following before building:
|
||||||
|
|
||||||
|
$ sudo apt install automake gcc git libreadline-dev libssl-dev \
|
||||||
|
libtool make wget
|
||||||
|
|
||||||
|
For Ubuntu 20.04+ you will also need this:
|
||||||
|
|
||||||
|
$ sudo apt install musl-dev
|
||||||
|
|
||||||
|
For Fedora 31 it is recommended to do the following before building:
|
||||||
|
|
||||||
|
$ sudo dnf install automake gcc git libtool make openssl-devel \
|
||||||
|
readline-devel wget
|
||||||
|
|
||||||
|
For MacOS with Xcode and homebrew installed, it is recommended to do the
|
||||||
|
following before building:
|
||||||
|
|
||||||
|
$ brew install automake openssl libtool freeipmi wget
|
||||||
|
$ export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
|
||||||
|
$ export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
|
||||||
|
|
||||||
|
To prepare for building in Windows it is recommended to use Chocolatey
|
||||||
|
and do the following using PowerShell:
|
||||||
|
|
||||||
|
PS C:\ipmitool> choco install cygwin -y
|
||||||
|
PS C:\ipmitool> choco install cyg-get -y
|
||||||
|
PS C:\ipmitool> cyg-get gcc-g++ make automake autoconf `
|
||||||
|
# m4 libtool libncurses-devel libreadline-devel libssl-devel `
|
||||||
|
# dos2unix wget
|
||||||
|
PS C:\ipmitool> $env:path="C:\tools\cygwin\usr\bin;$env:path"
|
||||||
|
PS C:\ipmitool> $env:path="C:\tools\cygwin\bin;$env:path"
|
||||||
|
PS C:\ipmitool> dos2unix bootstrap configure.ac csv-revision
|
||||||
|
|
||||||
|
Basic Installation
|
||||||
|
==================
|
||||||
|
|
||||||
|
Briefly, the followong shell command should configure, build, and
|
||||||
|
install this package:
|
||||||
|
|
||||||
|
./bootstrap && ./configure && make && sudo make install
|
||||||
|
|
||||||
|
For Windows the above command must be run inside a cygwin bash
|
||||||
|
shell.
|
||||||
|
|
||||||
|
The following more-detailed instructions are generic; see the
|
||||||
|
`README' file for instructions specific to this package. Some
|
||||||
|
packages provide this `INSTALL' file but do not implement all of the
|
||||||
|
features documented below. The lack of an optional feature in a given
|
||||||
|
package is not necessarily a bug. More recommendations for GNU
|
||||||
|
packages can be found in *note Makefile Conventions:
|
||||||
|
(standards)Makefile Conventions.
|
||||||
|
|
||||||
|
The `configure' shell script attempts to guess correct values for
|
||||||
|
various system-dependent variables used during compilation. It uses
|
||||||
|
those values to create a `Makefile' in each directory of the package.
|
||||||
|
It may also create one or more `.h' files containing system-dependent
|
||||||
|
definitions. Finally, it creates a shell script `config.status' that
|
||||||
|
you can run in the future to recreate the current configuration, and a
|
||||||
|
file `config.log' containing compiler output (useful mainly for
|
||||||
|
debugging `configure').
|
||||||
|
|
||||||
|
It can also use an optional file (typically called `config.cache'
|
||||||
|
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||||
|
the results of its tests to speed up reconfiguring. Caching is
|
||||||
|
disabled by default to prevent problems with accidental use of stale
|
||||||
|
cache files.
|
||||||
|
|
||||||
|
If you need to do unusual things to compile the package, please try
|
||||||
|
to figure out how `configure' could check whether to do them, and mail
|
||||||
|
diffs or instructions to the address given in the `README' so they can
|
||||||
|
be considered for the next release. If you are using the cache, and at
|
||||||
|
some point `config.cache' contains results you don't want to keep, you
|
||||||
|
may remove or edit it.
|
||||||
|
|
||||||
|
The file `configure.ac' (or `configure.in') is used to create
|
||||||
|
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||||
|
you want to change it or regenerate `configure' using a newer version
|
||||||
|
of `autoconf'.
|
||||||
|
|
||||||
|
The simplest way to compile this package is:
|
||||||
|
|
||||||
|
1. `cd' to the directory containing the package's source code and type
|
||||||
|
`./configure' to configure the package for your system.
|
||||||
|
|
||||||
|
Running `configure' might take a while. While running, it prints
|
||||||
|
some messages telling which features it is checking for.
|
||||||
|
|
||||||
|
2. Type `make' to compile the package.
|
||||||
|
|
||||||
|
3. Optionally, type `make check' to run any self-tests that come with
|
||||||
|
the package, generally using the just-built uninstalled binaries.
|
||||||
|
|
||||||
|
4. Type `make install' to install the programs and any data files and
|
||||||
|
documentation. When installing into a prefix owned by root, it is
|
||||||
|
recommended that the package be configured and built as a regular
|
||||||
|
user, and only the `make install' phase executed with root
|
||||||
|
privileges.
|
||||||
|
|
||||||
|
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||||
|
this time using the binaries in their final installed location.
|
||||||
|
This target does not install anything. Running this target as a
|
||||||
|
regular user, particularly if the prior `make install' required
|
||||||
|
root privileges, verifies that the installation completed
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
6. You can remove the program binaries and object files from the
|
||||||
|
source code directory by typing `make clean'. To also remove the
|
||||||
|
files that `configure' created (so you can compile the package for
|
||||||
|
a different kind of computer), type `make distclean'. There is
|
||||||
|
also a `make maintainer-clean' target, but that is intended mainly
|
||||||
|
for the package's developers. If you use it, you may have to get
|
||||||
|
all sorts of other programs in order to regenerate files that came
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
7. Often, you can also type `make uninstall' to remove the installed
|
||||||
|
files again. In practice, not all packages have tested that
|
||||||
|
uninstallation works correctly, even though it is required by the
|
||||||
|
GNU Coding Standards.
|
||||||
|
|
||||||
|
8. Some packages, particularly those that use Automake, provide `make
|
||||||
|
distcheck', which can by used by developers to test that all other
|
||||||
|
targets like `make install' and `make uninstall' work correctly.
|
||||||
|
This target is generally not run by end users.
|
||||||
|
|
||||||
|
Compilers and Options
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Some systems require unusual options for compilation or linking that
|
||||||
|
the `configure' script does not know about. Run `./configure --help'
|
||||||
|
for details on some of the pertinent environment variables.
|
||||||
|
|
||||||
|
You can give `configure' initial values for configuration parameters
|
||||||
|
by setting variables in the command line or in the environment. Here
|
||||||
|
is an example:
|
||||||
|
|
||||||
|
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||||
|
|
||||||
|
*Note Defining Variables::, for more details.
|
||||||
|
|
||||||
|
Compiling For Multiple Architectures
|
||||||
|
====================================
|
||||||
|
|
||||||
|
You can compile the package for more than one kind of computer at the
|
||||||
|
same time, by placing the object files for each architecture in their
|
||||||
|
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||||
|
directory where you want the object files and executables to go and run
|
||||||
|
the `configure' script. `configure' automatically checks for the
|
||||||
|
source code in the directory that `configure' is in and in `..'. This
|
||||||
|
is known as a "VPATH" build.
|
||||||
|
|
||||||
|
With a non-GNU `make', it is safer to compile the package for one
|
||||||
|
architecture at a time in the source code directory. After you have
|
||||||
|
installed the package for one architecture, use `make distclean' before
|
||||||
|
reconfiguring for another architecture.
|
||||||
|
|
||||||
|
On MacOS and later systems, you can create libraries and
|
||||||
|
executables that work on multiple system types--known as "fat" or
|
||||||
|
"universal" binaries--by specifying multiple `-arch' options to the
|
||||||
|
compiler but only a single `-arch' option to the preprocessor. Like
|
||||||
|
this:
|
||||||
|
|
||||||
|
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||||
|
CPP="gcc -E" CXXCPP="g++ -E"
|
||||||
|
|
||||||
|
This is not guaranteed to produce working output in all cases, you
|
||||||
|
may have to build one architecture at a time and combine the results
|
||||||
|
using the `lipo' tool if you have problems.
|
||||||
|
|
||||||
|
Installation Names
|
||||||
|
==================
|
||||||
|
|
||||||
|
By default, `make install' installs the package's commands under
|
||||||
|
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||||
|
can specify an installation prefix other than `/usr/local' by giving
|
||||||
|
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||||
|
absolute file name.
|
||||||
|
|
||||||
|
You can specify separate installation prefixes for
|
||||||
|
architecture-specific files and architecture-independent files. If you
|
||||||
|
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||||
|
PREFIX as the prefix for installing programs and libraries.
|
||||||
|
Documentation and other data files still use the regular prefix.
|
||||||
|
|
||||||
|
In addition, if you use an unusual directory layout you can give
|
||||||
|
options like `--bindir=DIR' to specify different values for particular
|
||||||
|
kinds of files. Run `configure --help' for a list of the directories
|
||||||
|
you can set and what kinds of files go in them. In general, the
|
||||||
|
default for these options is expressed in terms of `${prefix}', so that
|
||||||
|
specifying just `--prefix' will affect all of the other directory
|
||||||
|
specifications that were not explicitly provided.
|
||||||
|
|
||||||
|
The most portable way to affect installation locations is to pass the
|
||||||
|
correct locations to `configure'; however, many packages provide one or
|
||||||
|
both of the following shortcuts of passing variable assignments to the
|
||||||
|
`make install' command line to change installation locations without
|
||||||
|
having to reconfigure or recompile.
|
||||||
|
|
||||||
|
The first method involves providing an override variable for each
|
||||||
|
affected directory. For example, `make install
|
||||||
|
prefix=/alternate/directory' will choose an alternate location for all
|
||||||
|
directory configuration variables that were expressed in terms of
|
||||||
|
`${prefix}'. Any directories that were specified during `configure',
|
||||||
|
but not in terms of `${prefix}', must each be overridden at install
|
||||||
|
time for the entire installation to be relocated. The approach of
|
||||||
|
makefile variable overrides for each directory variable is required by
|
||||||
|
the GNU Coding Standards, and ideally causes no recompilation.
|
||||||
|
However, some platforms have known limitations with the semantics of
|
||||||
|
shared libraries that end up requiring recompilation when using this
|
||||||
|
method, particularly noticeable in packages that use GNU Libtool.
|
||||||
|
|
||||||
|
The second method involves providing the `DESTDIR' variable. For
|
||||||
|
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||||
|
`/alternate/directory' before all installation names. The approach of
|
||||||
|
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||||
|
does not work on platforms that have drive letters. On the other hand,
|
||||||
|
it does better at avoiding recompilation issues, and works well even
|
||||||
|
when some directory options were not specified in terms of `${prefix}'
|
||||||
|
at `configure' time.
|
||||||
|
|
||||||
|
Optional Features
|
||||||
|
=================
|
||||||
|
|
||||||
|
If the package supports it, you can cause programs to be installed
|
||||||
|
with an extra prefix or suffix on their names by giving `configure' the
|
||||||
|
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||||
|
|
||||||
|
Some packages pay attention to `--enable-FEATURE' options to
|
||||||
|
`configure', where FEATURE indicates an optional part of the package.
|
||||||
|
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||||
|
is something like `gnu-as' or `x' (for the X Window System). The
|
||||||
|
`README' should mention any `--enable-' and `--with-' options that the
|
||||||
|
package recognizes.
|
||||||
|
|
||||||
|
For packages that use the X Window System, `configure' can usually
|
||||||
|
find the X include and library files automatically, but if it doesn't,
|
||||||
|
you can use the `configure' options `--x-includes=DIR' and
|
||||||
|
`--x-libraries=DIR' to specify their locations.
|
||||||
|
|
||||||
|
Some packages offer the ability to configure how verbose the
|
||||||
|
execution of `make' will be. For these packages, running `./configure
|
||||||
|
--enable-silent-rules' sets the default to minimal output, which can be
|
||||||
|
overridden with `make V=1'; while running `./configure
|
||||||
|
--disable-silent-rules' sets the default to verbose, which can be
|
||||||
|
overridden with `make V=0'.
|
||||||
|
|
||||||
|
Particular systems
|
||||||
|
==================
|
||||||
|
|
||||||
|
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||||
|
CC is not installed, it is recommended to use the following options in
|
||||||
|
order to use an ANSI C compiler:
|
||||||
|
|
||||||
|
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||||
|
|
||||||
|
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||||
|
|
||||||
|
HP-UX `make' updates targets which have the same time stamps as
|
||||||
|
their prerequisites, which makes it generally unusable when shipped
|
||||||
|
generated files such as `configure' are involved. Use GNU `make'
|
||||||
|
instead.
|
||||||
|
|
||||||
|
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||||
|
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||||
|
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||||
|
to try
|
||||||
|
|
||||||
|
./configure CC="cc"
|
||||||
|
|
||||||
|
and if that doesn't work, try
|
||||||
|
|
||||||
|
./configure CC="cc -nodtk"
|
||||||
|
|
||||||
|
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||||
|
directory contains several dysfunctional programs; working variants of
|
||||||
|
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||||
|
in your `PATH', put it _after_ `/usr/bin'.
|
||||||
|
|
||||||
|
On Haiku, software installed for all users goes in `/boot/common',
|
||||||
|
not `/usr/local'. It is recommended to use the following options:
|
||||||
|
|
||||||
|
./configure --prefix=/boot/common
|
||||||
|
|
||||||
|
Specifying the System Type
|
||||||
|
==========================
|
||||||
|
|
||||||
|
There may be some features `configure' cannot figure out
|
||||||
|
automatically, but needs to determine by the type of machine the package
|
||||||
|
will run on. Usually, assuming the package is built to be run on the
|
||||||
|
_same_ architectures, `configure' can figure that out, but if it prints
|
||||||
|
a message saying it cannot guess the machine type, give it the
|
||||||
|
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||||
|
type, such as `sun4', or a canonical name which has the form:
|
||||||
|
|
||||||
|
CPU-COMPANY-SYSTEM
|
||||||
|
|
||||||
|
where SYSTEM can have one of these forms:
|
||||||
|
|
||||||
|
OS
|
||||||
|
KERNEL-OS
|
||||||
|
|
||||||
|
See the file `config.sub' for the possible values of each field. If
|
||||||
|
`config.sub' isn't included in this package, then this package doesn't
|
||||||
|
need to know the machine type.
|
||||||
|
|
||||||
|
If you are _building_ compiler tools for cross-compiling, you should
|
||||||
|
use the option `--target=TYPE' to select the type of system they will
|
||||||
|
produce code for.
|
||||||
|
|
||||||
|
If you want to _use_ a cross compiler, that generates code for a
|
||||||
|
platform different from the build platform, you should specify the
|
||||||
|
"host" platform (i.e., that on which the generated programs will
|
||||||
|
eventually be run) with `--host=TYPE'.
|
||||||
|
|
||||||
|
Sharing Defaults
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to set default values for `configure' scripts to share,
|
||||||
|
you can create a site shell script called `config.site' that gives
|
||||||
|
default values for variables like `CC', `cache_file', and `prefix'.
|
||||||
|
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||||
|
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||||
|
`CONFIG_SITE' environment variable to the location of the site script.
|
||||||
|
A warning: not all `configure' scripts look for a site script.
|
||||||
|
|
||||||
|
Defining Variables
|
||||||
|
==================
|
||||||
|
|
||||||
|
Variables not defined in a site shell script can be set in the
|
||||||
|
environment passed to `configure'. However, some packages may run
|
||||||
|
configure again during the build, and the customized values of these
|
||||||
|
variables may be lost. In order to avoid this problem, you should set
|
||||||
|
them in the `configure' command line, using `VAR=value'. For example:
|
||||||
|
|
||||||
|
./configure CC=/usr/local2/bin/gcc
|
||||||
|
|
||||||
|
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||||
|
overridden in the site shell script).
|
||||||
|
|
||||||
|
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||||
|
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||||
|
this workaround:
|
||||||
|
|
||||||
|
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||||
|
|
||||||
|
`configure' Invocation
|
||||||
|
======================
|
||||||
|
|
||||||
|
`configure' recognizes the following options to control how it
|
||||||
|
operates.
|
||||||
|
|
||||||
|
`--help'
|
||||||
|
`-h'
|
||||||
|
Print a summary of all of the options to `configure', and exit.
|
||||||
|
|
||||||
|
`--help=short'
|
||||||
|
`--help=recursive'
|
||||||
|
Print a summary of the options unique to this package's
|
||||||
|
`configure', and exit. The `short' variant lists options used
|
||||||
|
only in the top level, while the `recursive' variant lists options
|
||||||
|
also present in any nested packages.
|
||||||
|
|
||||||
|
`--version'
|
||||||
|
`-V'
|
||||||
|
Print the version of Autoconf used to generate the `configure'
|
||||||
|
script, and exit.
|
||||||
|
|
||||||
|
`--cache-file=FILE'
|
||||||
|
Enable the cache: use and save the results of the tests in FILE,
|
||||||
|
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||||
|
disable caching.
|
||||||
|
|
||||||
|
`--config-cache'
|
||||||
|
`-C'
|
||||||
|
Alias for `--cache-file=config.cache'.
|
||||||
|
|
||||||
|
`--quiet'
|
||||||
|
`--silent'
|
||||||
|
`-q'
|
||||||
|
Do not print messages saying which checks are being made. To
|
||||||
|
suppress all normal output, redirect it to `/dev/null' (any error
|
||||||
|
messages will still be shown).
|
||||||
|
|
||||||
|
`--srcdir=DIR'
|
||||||
|
Look for the package's source code in directory DIR. Usually
|
||||||
|
`configure' can determine that directory automatically.
|
||||||
|
|
||||||
|
`--prefix=DIR'
|
||||||
|
Use DIR as the installation prefix. *note Installation Names::
|
||||||
|
for more details, including other options available for fine-tuning
|
||||||
|
the installation locations.
|
||||||
|
|
||||||
|
`--no-create'
|
||||||
|
`-n'
|
||||||
|
Run the configure checks, but stop before creating any output
|
||||||
|
files.
|
||||||
|
|
||||||
|
`configure' also accepts some other, not widely useful, options. Run
|
||||||
|
`configure --help' for more details.
|
52
Makefile.am
52
Makefile.am
@ -28,12 +28,10 @@
|
|||||||
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
# 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.
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
DOCDIR = $(datadir)/doc/$(PACKAGE)
|
DOCDIR = $(docdir)
|
||||||
DOCLIST = $(top_srcdir)/README $(top_srcdir)/COPYING $(top_srcdir)/AUTHORS $(top_srcdir)/ChangeLog
|
DOCLIST = $(top_srcdir)/README $(top_srcdir)/COPYING $(top_srcdir)/AUTHORS $(top_srcdir)/ChangeLog
|
||||||
|
|
||||||
EXTRA_DIST = $(DOCLIST) \
|
EXTRA_DIST = $(DOCLIST) bootstrap
|
||||||
debian/changelog debian/control debian/copyright \
|
|
||||||
debian/dirs debian/docs debian/rules
|
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = dist-bzip2
|
AUTOMAKE_OPTIONS = dist-bzip2
|
||||||
|
|
||||||
@ -43,15 +41,49 @@ MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure configure-stamp \
|
|||||||
$(distdir).tar.gz $(distdir).tar.bz2
|
$(distdir).tar.gz $(distdir).tar.bz2
|
||||||
|
|
||||||
SUBDIRS = lib src include doc contrib control
|
SUBDIRS = lib src include doc contrib control
|
||||||
|
IANA_PEN = http://www.iana.org/assignments/enterprise-numbers.txt
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
cp control/ipmitool.spec $(distdir)
|
cp control/ipmitool.spec $(distdir)
|
||||||
|
|
||||||
install-data-local:
|
.PHONY: install-pen-database uninstall-pen-database
|
||||||
|
.INTERMEDIATE: %.o %.la enterprise-numbers
|
||||||
|
|
||||||
|
if DOWNLOAD
|
||||||
|
|
||||||
|
enterprise-numbers:
|
||||||
|
@echo Downloading IANA PEN database...
|
||||||
|
@$(DOWNLOAD) "$(IANA_PEN)" > tmpfile.$$PPID || {\
|
||||||
|
echo "FAILED to download the IANA PEN database"; \
|
||||||
|
rm tmpfile.$$PPID; \
|
||||||
|
false; \
|
||||||
|
}
|
||||||
|
@mv tmpfile.$$PPID $@
|
||||||
|
|
||||||
|
install-pen-database: enterprise-numbers
|
||||||
|
mkdir -m 755 -p $(DESTDIR)$(IANADIR)
|
||||||
|
$(INSTALL_DATA) $< $(DESTDIR)$(IANADIR)/
|
||||||
|
|
||||||
|
uninstall-pen-database:
|
||||||
|
-rm -rf $(DESTDIR)$(IANADIR)/enterprise-numbers
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
install-pen-database:
|
||||||
|
@echo "*** NOT installing the IANA PEN database."
|
||||||
|
@echo "*** Don't know how to download it."
|
||||||
|
|
||||||
|
uninstall-pen-database:
|
||||||
|
@echo "*** NOT uninstalling the IANA PEN database."
|
||||||
|
@echo "*** It was installed manually (if ever)."
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
install-data-local: install-pen-database
|
||||||
mkdir -p $(DESTDIR)$(DOCDIR)
|
mkdir -p $(DESTDIR)$(DOCDIR)
|
||||||
$(INSTALL_DATA) $(DOCLIST) $(DESTDIR)$(DOCDIR)
|
$(INSTALL_DATA) $(DOCLIST) $(DESTDIR)$(DOCDIR)
|
||||||
|
|
||||||
uninstall-local:
|
uninstall-local: uninstall-pen-database
|
||||||
-rm -rf $(DESTDIR)$(DOCDIR)
|
-rm -rf $(DESTDIR)$(DOCDIR)
|
||||||
|
|
||||||
.PHONY: pkg
|
.PHONY: pkg
|
||||||
@ -69,12 +101,8 @@ SRCDIR = ${shell cd $(top_srcdir) ; pwd | sed -e 's,^[^:\\/]:[\\/],/,'}
|
|||||||
RPMDIR = $(BUILDDIR)/rpmbuild
|
RPMDIR = $(BUILDDIR)/rpmbuild
|
||||||
|
|
||||||
.PHONY: rpm
|
.PHONY: rpm
|
||||||
rpm: control/ipmitool.spec dist
|
rpm: dist
|
||||||
mkdir -p $(RPMDIR)/{BUILD,RPMS,SRPMS,SOURCES,SPECS,tmp}
|
@RPMBUILD@ -ta --define "_topdir $(RPMDIR)" $(distdir).tar.gz
|
||||||
cp control/ipmitool.spec $(RPMDIR)/SPECS
|
|
||||||
BUILDDIR=$(RPMDIR) CONFIGDIR=$(BUILDDIR)/control \
|
|
||||||
@RPMBUILD@ -ba --rcfile $(SRCDIR)/control/rpmrc \
|
|
||||||
$(RPMDIR)/SPECS/ipmitool.spec
|
|
||||||
|
|
||||||
.PHONY: clean-rpm
|
.PHONY: clean-rpm
|
||||||
clean-rpm:
|
clean-rpm:
|
||||||
|
17
README
17
README
@ -24,7 +24,7 @@ Background
|
|||||||
==========
|
==========
|
||||||
I originally wrote ipmitool while between projects and employeed at Sun
|
I originally wrote ipmitool while between projects and employeed at Sun
|
||||||
Microsystems. Sun had just embarked on a new line of general-purpose x86
|
Microsystems. Sun had just embarked on a new line of general-purpose x86
|
||||||
servers that inclued an OEM Intel board with an IPMIv1.5 BMC on board.
|
servers that included an OEM Intel board with an IPMIv1.5 BMC on board.
|
||||||
It started with an idea that remote chassis power control would be a handy
|
It started with an idea that remote chassis power control would be a handy
|
||||||
feature for my systems in the lab and from there it grew into a multi-
|
feature for my systems in the lab and from there it grew into a multi-
|
||||||
purpose tool that lots of people found useful. I decided to release it
|
purpose tool that lots of people found useful. I decided to release it
|
||||||
@ -42,8 +42,8 @@ Requirements
|
|||||||
============
|
============
|
||||||
Obviously the largest requirement is hardware with a service processor
|
Obviously the largest requirement is hardware with a service processor
|
||||||
that supports the IPMI specification. Many x86-based servers are now
|
that supports the IPMI specification. Many x86-based servers are now
|
||||||
comming with IPMI support, check with your preferred hardware vendor
|
coming with IPMI support, check with your preferred hardware vendor
|
||||||
about available prodcuts.
|
about available products.
|
||||||
|
|
||||||
Once you are certain you have the required hardware, you then need to
|
Once you are certain you have the required hardware, you then need to
|
||||||
decide how you want to access the BMC. The most common case involve
|
decide how you want to access the BMC. The most common case involve
|
||||||
@ -126,7 +126,7 @@ hardware will come with a utility (often a DOS bootable CD) for configuring
|
|||||||
enabling the LAN interface as well.
|
enabling the LAN interface as well.
|
||||||
|
|
||||||
In order to support the IPMIv2.0 interface you must have an OpenSSL library
|
In order to support the IPMIv2.0 interface you must have an OpenSSL library
|
||||||
with the required encrytion functions. Recent distributions should have
|
with the required encryption functions. Recent distributions should have
|
||||||
no problems. The IPMIv1.5 interface will attempt to use OpenSSL for MD5
|
no problems. The IPMIv1.5 interface will attempt to use OpenSSL for MD5
|
||||||
hash function at compile time but if that is not found it will use an
|
hash function at compile time but if that is not found it will use an
|
||||||
internal library.
|
internal library.
|
||||||
@ -396,16 +396,13 @@ ipmievd: Memory Sensor 01 - Correctable ECC
|
|||||||
Resources
|
Resources
|
||||||
=========
|
=========
|
||||||
IPMItool homepage
|
IPMItool homepage
|
||||||
http://ipmitool.sourceforge.net
|
http://github.com/ipmitool/ipmitool
|
||||||
|
|
||||||
IPMItool manpage
|
IPMItool manpage
|
||||||
http://ipmitool.sourceforge.net/manpage.html
|
https://github.com/ipmitool/ipmitool/blob/master/doc/ipmitool.1.in
|
||||||
|
|
||||||
IPMItool overview paper from Linux.conf.au 2004
|
|
||||||
http://ipmitool.sourceforge.net/lca2004_ipmitool.pdf
|
|
||||||
|
|
||||||
Intelligent Platform Management Interface specification
|
Intelligent Platform Management Interface specification
|
||||||
http://www.intel.com/design/servers/ipmi/spec.htm
|
https://www.intel.com/content/www/us/en/servers/ipmi/ipmi-home.html
|
||||||
|
|
||||||
OpenIPMI project: Linux IPMI kernel driver and userland library
|
OpenIPMI project: Linux IPMI kernel driver and userland library
|
||||||
http://openipmi.sourceforge.net
|
http://openipmi.sourceforge.net
|
||||||
|
10
bootstrap
10
bootstrap
@ -31,7 +31,15 @@
|
|||||||
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
aclocal
|
aclocal
|
||||||
libtoolize --automake --copy
|
|
||||||
|
case `uname` in
|
||||||
|
Darwin*)
|
||||||
|
glibtoolize --automake --copy
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
libtoolize --automake --copy
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
autoheader
|
autoheader
|
||||||
automake --foreign --add-missing --copy
|
automake --foreign --add-missing --copy
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
dnl
|
dnl
|
||||||
dnl autoconf for ipmitool
|
dnl autoconf for ipmitool
|
||||||
dnl
|
dnl
|
||||||
AC_INIT([src/ipmitool.c])
|
m4_define([git_suffix], m4_esyscmd_s(./csv-revision))
|
||||||
AC_CANONICAL_SYSTEM
|
AC_INIT([ipmitool], [1.8.19git_suffix])
|
||||||
AM_INIT_AUTOMAKE([ipmitool], [1.8.14-cvs])
|
|
||||||
AM_CONFIG_HEADER(config.h)
|
|
||||||
AC_CONFIG_SRCDIR([src/ipmitool.c])
|
AC_CONFIG_SRCDIR([src/ipmitool.c])
|
||||||
|
AC_CONFIG_COMMANDS_PRE([export prefix=$prefix])
|
||||||
|
AC_CANONICAL_SYSTEM
|
||||||
|
AM_INIT_AUTOMAKE([foreign])
|
||||||
|
AM_CONFIG_HEADER(config.h)
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
AC_SUBST(ac_configure_args)
|
AC_SUBST(ac_configure_args)
|
||||||
|
|
||||||
@ -26,14 +28,13 @@ AC_C_CONST
|
|||||||
AC_C_INLINE
|
AC_C_INLINE
|
||||||
AC_C_BIGENDIAN
|
AC_C_BIGENDIAN
|
||||||
|
|
||||||
AC_FUNC_MALLOC
|
|
||||||
AC_FUNC_SELECT_ARGTYPES
|
AC_FUNC_SELECT_ARGTYPES
|
||||||
AC_FUNC_STRTOD
|
AC_FUNC_STRTOD
|
||||||
AC_CHECK_FUNCS([alarm gethostbyname getaddrinfo getifaddrs socket select])
|
AC_CHECK_FUNCS([alarm gethostbyname getaddrinfo getifaddrs socket select])
|
||||||
AC_CHECK_FUNCS([memmove memset strchr strdup strerror])
|
AC_CHECK_FUNCS([memmove memset strchr strdup strerror])
|
||||||
AC_CHECK_FUNCS([getpassphrase])
|
AC_CHECK_FUNCS([getpassphrase])
|
||||||
|
|
||||||
CFLAGS="$CFLAGS -fno-strict-aliasing -Wreturn-type"
|
CFLAGS="$CFLAGS -Wall -Wextra -std=gnu11 -pedantic -Wformat -Wformat-nonliteral"
|
||||||
|
|
||||||
AM_PROG_LIBTOOL
|
AM_PROG_LIBTOOL
|
||||||
LIBTOOL="$LIBTOOL --silent"
|
LIBTOOL="$LIBTOOL --silent"
|
||||||
@ -53,17 +54,48 @@ if test "x$exec_prefix" = "xNONE"; then
|
|||||||
exec_prefix="$prefix"
|
exec_prefix="$prefix"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl allow enabling/disabling the fetching of the IANA PEN registry
|
||||||
|
AC_ARG_ENABLE([registry-download],
|
||||||
|
[AC_HELP_STRING([--enable-registry-download],
|
||||||
|
[download/install the IANA PEN registry [default=yes]])],
|
||||||
|
[xenable_registry_download=$enableval],
|
||||||
|
[xenable_registry_download=yes])
|
||||||
|
|
||||||
|
AM_CONDITIONAL([DOWNLOAD], [false])
|
||||||
|
|
||||||
|
if test "x$xenable_registry_download" = "xyes"; then
|
||||||
|
AC_CHECK_PROG([WGET], [wget], [wget])
|
||||||
|
AC_CHECK_PROG([CURL], [curl], [curl])
|
||||||
|
|
||||||
|
if test "x$WGET" = "x" && test "x$CURL" = "x"; then
|
||||||
|
AC_MSG_WARN([** Neither wget nor curl could be found.])
|
||||||
|
AC_MSG_WARN([** IANA PEN database will not be installed by `make install` !])
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([DOWNLOAD], [true])
|
||||||
|
if test "x$WGET" != "x"; then
|
||||||
|
DOWNLOAD="$WGET -c -nd -O -"
|
||||||
|
else
|
||||||
|
DOWNLOAD="$CURL --location --progress-bar"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_MSG_WARN([** Download is: $DOWNLOAD])
|
||||||
|
AC_SUBST(DOWNLOAD, $DOWNLOAD)
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl set default option values
|
dnl set default option values
|
||||||
dnl
|
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_all_options=yes
|
||||||
|
xenable_intf_bmc=no
|
||||||
|
xenable_intf_dbus=no
|
||||||
|
xenable_intf_dummy=no
|
||||||
|
xenable_intf_imb=yes
|
||||||
|
xenable_intf_lipmi=yes
|
||||||
|
xenable_intf_open=yes
|
||||||
|
#xenable_intf_serial=yes
|
||||||
|
xenable_intf_usb=no
|
||||||
xenable_ipmishell=yes
|
xenable_ipmishell=yes
|
||||||
|
|
||||||
dnl set some things so we build with GNU tools on Solaris
|
dnl set some things so we build with GNU tools on Solaris
|
||||||
@ -88,31 +120,29 @@ solaris*)
|
|||||||
xenable_intf_imb=no
|
xenable_intf_imb=no
|
||||||
xenable_intf_open=no
|
xenable_intf_open=no
|
||||||
xenable_intf_lipmi=no
|
xenable_intf_lipmi=no
|
||||||
xenable_intf_bmc=no
|
|
||||||
;;
|
;;
|
||||||
*darwin*|aix*)
|
*darwin*|aix*)
|
||||||
# disable the linux and solaris-specific interfaces
|
# disable the linux and solaris-specific interfaces
|
||||||
xenable_intf_imb=no
|
xenable_intf_imb=no
|
||||||
xenable_intf_open=no
|
xenable_intf_open=no
|
||||||
xenable_intf_lipmi=no
|
xenable_intf_lipmi=no
|
||||||
xenable_intf_bmc=no
|
|
||||||
xenable_ipmishell=no
|
xenable_ipmishell=no
|
||||||
;;
|
;;
|
||||||
*freebsd*)
|
*freebsd*)
|
||||||
xenable_intf_imb=no
|
xenable_intf_imb=no
|
||||||
xenable_intf_lipmi=no
|
xenable_intf_lipmi=no
|
||||||
xenable_intf_bmc=no
|
CFLAGS="$CFLAGS -D__BSD_VISIBLE"
|
||||||
;;
|
;;
|
||||||
*netbsd*)
|
*netbsd*)
|
||||||
xenable_intf_imb=no
|
xenable_intf_imb=no
|
||||||
xenable_intf_lipmi=no
|
xenable_intf_lipmi=no
|
||||||
xenable_intf_bmc=no
|
|
||||||
xenable_intf_open=no
|
xenable_intf_open=no
|
||||||
;;
|
;;
|
||||||
gnu*)
|
gnu*)
|
||||||
# disable the linux and solaris-specific interfaces on Hurd
|
# disable the linux and solaris-specific interfaces on Hurd
|
||||||
xenable_intf_imb=no
|
xenable_intf_imb=no
|
||||||
xenable_intf_open=no
|
xenable_intf_open=no
|
||||||
|
xenable_intf_usb=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -131,6 +161,24 @@ if test "x$xenable_all_options" = "xyes" || test "x$xenable_solaris_opt" = "xyes
|
|||||||
AC_DEFINE(ENABLE_ALL_OPTIONS, [1], [Define to 1 to enable all command line options.])
|
AC_DEFINE(ENABLE_ALL_OPTIONS, [1], [Define to 1 to enable all command line options.])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Determine anonymous union/structure support in GCC
|
||||||
|
AC_TRY_COMPILE([
|
||||||
|
#include <stdio.h>
|
||||||
|
], [
|
||||||
|
struct test {
|
||||||
|
union {
|
||||||
|
int a;
|
||||||
|
unsigned int b;
|
||||||
|
};
|
||||||
|
} test;
|
||||||
|
|
||||||
|
printf("a is %d", test.a);
|
||||||
|
], ac_need_fms_extension=no, ac_need_fms_extension=yes)
|
||||||
|
if test "x$ac_need_fms_extension" = "xyes"; then
|
||||||
|
CFLAGS="$CFLAGS -fms-extensions"
|
||||||
|
AC_SUBST(CFLAGS)
|
||||||
|
fi
|
||||||
|
|
||||||
dnl check for OpenSSL functionality
|
dnl check for OpenSSL functionality
|
||||||
AC_ARG_ENABLE([internal-md5],
|
AC_ARG_ENABLE([internal-md5],
|
||||||
[AC_HELP_STRING([--enable-internal-md5],
|
[AC_HELP_STRING([--enable-internal-md5],
|
||||||
@ -144,6 +192,16 @@ AC_CHECK_LIB([crypto], [EVP_aes_128_cbc],
|
|||||||
fi],
|
fi],
|
||||||
[have_crypto=no], [-lcrypto])
|
[have_crypto=no], [-lcrypto])
|
||||||
|
|
||||||
|
AC_CHECK_LIB([crypto], [EVP_sha256],
|
||||||
|
[if test "x$xenable_internal_sha256" != "xyes"; then
|
||||||
|
if test "x$have_crypto" != "xyes"; then
|
||||||
|
LIBS="$LIBS -lcrypto"
|
||||||
|
have_sha256=yes
|
||||||
|
fi
|
||||||
|
AC_DEFINE(HAVE_CRYPTO_SHA256, [1], [Define to 1 if libcrypto supports SHA256.])
|
||||||
|
fi],
|
||||||
|
[], [-lcrypto])
|
||||||
|
|
||||||
AC_CHECK_LIB([crypto], [MD5_Init],
|
AC_CHECK_LIB([crypto], [MD5_Init],
|
||||||
[if test "x$xenable_internal_md5" != "xyes"; then
|
[if test "x$xenable_internal_md5" != "xyes"; then
|
||||||
if test "x$have_crypto" != "xyes"; then
|
if test "x$have_crypto" != "xyes"; then
|
||||||
@ -164,6 +222,14 @@ AC_CHECK_LIB([crypto], [MD2_Init],
|
|||||||
fi],
|
fi],
|
||||||
[], [-lcrypto])
|
[], [-lcrypto])
|
||||||
|
|
||||||
|
dnl check for libsystemd in case dbus-intf is requested
|
||||||
|
AC_CHECK_LIB([systemd], [sd_bus_default],
|
||||||
|
[
|
||||||
|
LIBS="$LIBS -lsystemd"
|
||||||
|
have_systemd=yes
|
||||||
|
],
|
||||||
|
[ have_systemd=no],[])
|
||||||
|
|
||||||
dnl enable IPMIv1.5 LAN interface
|
dnl enable IPMIv1.5 LAN interface
|
||||||
AC_ARG_ENABLE([intf-lan],
|
AC_ARG_ENABLE([intf-lan],
|
||||||
[AC_HELP_STRING([--enable-intf-lan],
|
[AC_HELP_STRING([--enable-intf-lan],
|
||||||
@ -180,6 +246,22 @@ if test "x$xenable_intf_lan" = "xyes"; then
|
|||||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lan/libintf_lan.la"
|
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB lan/libintf_lan.la"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl enable IPMI USB interface
|
||||||
|
AC_ARG_ENABLE([intf-usb],
|
||||||
|
[AC_HELP_STRING([--enable-intf-usb],
|
||||||
|
[enable IPMI USB interface [default=auto]])],
|
||||||
|
[xenable_intf_usb=$enableval],
|
||||||
|
[xenable_intf_usb=$xenable_intf_usb])
|
||||||
|
if test "x$xenable_intf_usb" = "xstatic" || test "x$xenable_intf_usb" = "xplugin"; then
|
||||||
|
xenable_intf_usb=yes
|
||||||
|
fi
|
||||||
|
if test "x$xenable_intf_usb" = "xyes"; then
|
||||||
|
AC_DEFINE(IPMI_INTF_USB, [1], [Define to 1 to enable USB interface.])
|
||||||
|
AC_SUBST(INTF_USB, [usb])
|
||||||
|
AC_SUBST(INTF_USB_LIB, [libintf_usb.la])
|
||||||
|
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB usb/libintf_usb.la"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl enable IPMIv2.0 RMCP+ LAN interface
|
dnl enable IPMIv2.0 RMCP+ LAN interface
|
||||||
AC_ARG_ENABLE([intf-lanplus],
|
AC_ARG_ENABLE([intf-lanplus],
|
||||||
[AC_HELP_STRING([--enable-intf-lanplus],
|
[AC_HELP_STRING([--enable-intf-lanplus],
|
||||||
@ -511,6 +593,25 @@ if test "x$xenable_intf_bmc" = "xyes"; then
|
|||||||
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB bmc/libintf_bmc.la"
|
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB bmc/libintf_bmc.la"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl enable IPMI dbus interface
|
||||||
|
AC_ARG_ENABLE([intf-dbus],
|
||||||
|
[AC_HELP_STRING([--enable-intf-dbus],
|
||||||
|
[enable IPMI dbus interface [default=no]])],
|
||||||
|
[xenable_intf_dbus=$enableval],
|
||||||
|
[xenable_intf_dbus=no])
|
||||||
|
if test "x$xenable_intf_dbus" != "xno"; then
|
||||||
|
if test "x$have_systemd" != "xyes"; then
|
||||||
|
AC_MSG_ERROR([** Unable to find libsystemd required by dbus-intf.])
|
||||||
|
xenable_intf_dbus=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "x$xenable_intf_dbus" = "xyes"; then
|
||||||
|
AC_DEFINE(IPMI_INTF_DBUS, [1], [Define to 1 to enable dbus interface.])
|
||||||
|
AC_SUBST(INTF_DBUS, [dbus])
|
||||||
|
AC_SUBST(INTF_DBUS_LIB, [libintf_dbus.la])
|
||||||
|
IPMITOOL_INTF_LIB="$IPMITOOL_INTF_LIB dbus/libintf_dbus.la"
|
||||||
|
fi
|
||||||
|
|
||||||
dnl enable Dummy interface for testing
|
dnl enable Dummy interface for testing
|
||||||
AC_ARG_ENABLE([intf-dummy],
|
AC_ARG_ENABLE([intf-dummy],
|
||||||
[AC_HELP_STRING([--enable-intf-dummy],
|
[AC_HELP_STRING([--enable-intf-dummy],
|
||||||
@ -525,30 +626,22 @@ fi
|
|||||||
|
|
||||||
AC_SUBST(IPMITOOL_INTF_LIB)
|
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_ARG_ENABLE([ipmishell],
|
||||||
[AC_HELP_STRING([--enable-ipmishell],
|
[AC_HELP_STRING([--enable-ipmishell],
|
||||||
[enable IPMI shell interface [default=auto]])],
|
[enable IPMI shell interface [default=auto]])],
|
||||||
[xenable_ipmishell=$enableval],
|
[xenable_ipmishell=$enableval],
|
||||||
[])
|
[])
|
||||||
|
|
||||||
|
dnl check for readline library to enable ipmi shell
|
||||||
if test "x$xenable_ipmishell" = "xyes"; then
|
if test "x$xenable_ipmishell" = "xyes"; then
|
||||||
AC_SEARCH_LIBS([tgetent], [tinfo ncurses curses readline termcap])
|
PKG_PROG_PKG_CONFIG
|
||||||
AC_SEARCH_LIBS([initscr], [ncurses curses], [have_curses=yes])
|
PKG_CHECK_MODULES([READLINE], [readline],
|
||||||
AC_SEARCH_LIBS([readline], [readline edit], [have_readline=yes])
|
[LIBS="$LIBS $READLINE_LIBS" have_readline=yes],
|
||||||
if test "x$have_curses" != "xyes"; then
|
[AC_SEARCH_LIBS([readline], [readline edit], [have_readline=yes])]
|
||||||
AC_MSG_ERROR([** Unable to find curses required by ipmishell.])
|
)
|
||||||
fi
|
|
||||||
if test "x$have_readline" != "xyes"; then
|
if test "x$have_readline" != "xyes"; then
|
||||||
AC_MSG_ERROR([** Unable to find readline required by ipmishell.])
|
AC_MSG_ERROR([** Unable to find readline required by ipmishell.])
|
||||||
|
xenable_ipmishell=no
|
||||||
fi
|
fi
|
||||||
AC_DEFINE(HAVE_READLINE, [1], [Define to 1 if readline present.])
|
AC_DEFINE(HAVE_READLINE, [1], [Define to 1 if readline present.])
|
||||||
fi
|
fi
|
||||||
@ -600,6 +693,50 @@ AC_TRY_COMPILE([],[
|
|||||||
[Define to 1 if you need to use #pragma pack instead of __attribute__ ((packed))])]
|
[Define to 1 if you need to use #pragma pack instead of __attribute__ ((packed))])]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
dnl if no environment variable is set, set the default value for the default intf
|
||||||
|
if test "${xenable_intf_open}" = "yes"; then
|
||||||
|
DEFAULT_INTF_NO_ENV=open
|
||||||
|
else dnl macOS does not build open interface, it defaults to lan
|
||||||
|
DEFAULT_INTF_NO_ENV=lan
|
||||||
|
fi
|
||||||
|
dnl allow for a default interface to be set on configure
|
||||||
|
AC_ARG_VAR(DEFAULT_INTF, [Set the default interface to use (default='open' if available, 'lan' otherwise)])
|
||||||
|
|
||||||
|
dnl set the default value for the default interface environment variable
|
||||||
|
if test "x${DEFAULT_INTF}" = "x"; then
|
||||||
|
echo "DEFAULT_INTF not found in environment; setting to ${DEFAULT_INTF_NO_ENV}"
|
||||||
|
DEFAULT_INTF=${DEFAULT_INTF_NO_ENV}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x"`eval "echo \\\${xenable_intf_${DEFAULT_INTF}}"` != "xyes"; then
|
||||||
|
AC_MSG_ERROR([** Cannot set ${DEFAULT_INTF} as default; intf-${DEFAULT_INTF} is not enabled.])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_VAR(IANADIR, [Configure the path to IANA PEN dictionary (default=DATAROOTDIR/misc)])
|
||||||
|
AC_ARG_VAR(IANAUSERDIR, [Configure the path to IANA PEN dictionary wihtin the user's HOME directory (default=.local/usr/share/misc)])
|
||||||
|
|
||||||
|
if test "x${IANADIR}" = "x"; then
|
||||||
|
IANADIR=`eval echo "${datarootdir}/misc"`
|
||||||
|
echo Set IANA PEN dictionary search path to ${IANADIR}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x${IANAUSERDIR}" = "x"; then
|
||||||
|
IANAUSERDIR=".local/usr/share/misc"
|
||||||
|
echo Set user\'s IANA PEN dictionary search path to ${IANAUSERDIR}
|
||||||
|
fi
|
||||||
|
|
||||||
|
AH_TEMPLATE([IANADIR],[The path to system IANA PEN dictionary])
|
||||||
|
AC_DEFINE_UNQUOTED(IANADIR, "`eval "echo ${IANADIR}"`", [])
|
||||||
|
|
||||||
|
AH_TEMPLATE([IANAUSERDIR],[The subpath to user IANA PEN dictionary within the user's HOME])
|
||||||
|
AC_DEFINE_UNQUOTED(IANAUSERDIR, "`eval "echo ${IANAUSERDIR}"`", [])
|
||||||
|
|
||||||
|
AH_TEMPLATE([PATH_SEPARATOR], [The path separator string])
|
||||||
|
#if defined _WIN32 || defined __CYGWIN__
|
||||||
|
AC_DEFINE(PATH_SEPARATOR, "\\")
|
||||||
|
#else
|
||||||
|
AC_DEFINE(PATH_SEPARATOR, "/")
|
||||||
|
#endif
|
||||||
|
|
||||||
dnl Generate files for build
|
dnl Generate files for build
|
||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
@ -608,7 +745,6 @@ AC_CONFIG_FILES([Makefile
|
|||||||
control/Makefile
|
control/Makefile
|
||||||
control/pkginfo
|
control/pkginfo
|
||||||
control/prototype
|
control/prototype
|
||||||
control/rpmmacros
|
|
||||||
control/ipmitool.spec
|
control/ipmitool.spec
|
||||||
lib/Makefile
|
lib/Makefile
|
||||||
include/Makefile
|
include/Makefile
|
||||||
@ -621,22 +757,28 @@ AC_CONFIG_FILES([Makefile
|
|||||||
src/plugins/free/Makefile
|
src/plugins/free/Makefile
|
||||||
src/plugins/imb/Makefile
|
src/plugins/imb/Makefile
|
||||||
src/plugins/bmc/Makefile
|
src/plugins/bmc/Makefile
|
||||||
|
src/plugins/dbus/Makefile
|
||||||
|
src/plugins/usb/Makefile
|
||||||
src/plugins/lipmi/Makefile
|
src/plugins/lipmi/Makefile
|
||||||
src/plugins/serial/Makefile
|
src/plugins/serial/Makefile
|
||||||
src/plugins/dummy/Makefile])
|
src/plugins/dummy/Makefile
|
||||||
|
doc/ipmitool.1
|
||||||
|
doc/ipmievd.8])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
AC_MSG_RESULT([])
|
AC_MSG_RESULT([])
|
||||||
AC_MSG_RESULT([ipmitool $VERSION])
|
AC_MSG_RESULT([ipmitool $VERSION])
|
||||||
AC_MSG_RESULT([])
|
AC_MSG_RESULT([])
|
||||||
AC_MSG_RESULT([Interfaces])
|
AC_MSG_RESULT([Interfaces (default=$DEFAULT_INTF)])
|
||||||
AC_MSG_RESULT([ lan : $xenable_intf_lan])
|
AC_MSG_RESULT([ lan : $xenable_intf_lan])
|
||||||
AC_MSG_RESULT([ lanplus : $xenable_intf_lanplus])
|
AC_MSG_RESULT([ lanplus : $xenable_intf_lanplus])
|
||||||
AC_MSG_RESULT([ open : $xenable_intf_open])
|
AC_MSG_RESULT([ open : $xenable_intf_open])
|
||||||
AC_MSG_RESULT([ free : $xenable_intf_free])
|
AC_MSG_RESULT([ free : $xenable_intf_free])
|
||||||
AC_MSG_RESULT([ imb : $xenable_intf_imb])
|
AC_MSG_RESULT([ imb : $xenable_intf_imb])
|
||||||
AC_MSG_RESULT([ bmc : $xenable_intf_bmc])
|
AC_MSG_RESULT([ bmc : $xenable_intf_bmc])
|
||||||
|
AC_MSG_RESULT([ dbus : $xenable_intf_dbus])
|
||||||
|
AC_MSG_RESULT([ usb : $xenable_intf_usb])
|
||||||
AC_MSG_RESULT([ lipmi : $xenable_intf_lipmi])
|
AC_MSG_RESULT([ lipmi : $xenable_intf_lipmi])
|
||||||
AC_MSG_RESULT([ serial : $xenable_intf_serial])
|
AC_MSG_RESULT([ serial : $xenable_intf_serial])
|
||||||
AC_MSG_RESULT([ dummy : $xenable_intf_dummy])
|
AC_MSG_RESULT([ dummy : $xenable_intf_dummy])
|
@ -35,7 +35,7 @@ dist_pkgdata_DATA = oem_ibm_sel_map
|
|||||||
EXTRA_DIST = README \
|
EXTRA_DIST = README \
|
||||||
bmclanconf ipmi.init.basic ipmi.init.redhat \
|
bmclanconf ipmi.init.basic ipmi.init.redhat \
|
||||||
exchange-bmc-os-info.init.redhat exchange-bmc-os-info.service.redhat \
|
exchange-bmc-os-info.init.redhat exchange-bmc-os-info.service.redhat \
|
||||||
exchange-bmc-os-info.sysconf \
|
exchange-bmc-os-info.sysconf log_bmc.sh\
|
||||||
ipmievd.init.redhat ipmievd.init.suse ipmievd.init.debian \
|
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
|
bmc-snmp-proxy bmc-snmp-proxy.service bmc-snmp-proxy.sysconf
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# bmc-snmp-proxy: Set SNMP proxy to BMC (Baseboard Management Controller)
|
# bmc-snmp-proxy: Set SNMP proxy to BMC (Baseboard Management Controller)
|
||||||
#
|
#
|
||||||
# version: 0.6
|
# version: 0.62
|
||||||
#
|
#
|
||||||
# Authors: Charles Rose <charles_rose@dell.com>
|
# Authors: Charles Rose <charles_rose@dell.com>
|
||||||
# Jordan Hargrave <jordan_hargrave@dell.com>
|
# Jordan Hargrave <jordan_hargrave@dell.com>
|
||||||
@ -20,16 +20,16 @@
|
|||||||
SYSCONF_DIR="/etc/sysconfig"
|
SYSCONF_DIR="/etc/sysconfig"
|
||||||
CONFIG="${SYSCONF_DIR}/bmc-snmp-proxy"
|
CONFIG="${SYSCONF_DIR}/bmc-snmp-proxy"
|
||||||
|
|
||||||
SNMPD_LOCAL_CONF_DIR="/etc/snmp/bmc"
|
SNMPD_BMC_CONF_DIR="/etc/snmp/bmc"
|
||||||
SNMPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmpd.local.conf"
|
SNMPD_BMC_CONF="${SNMPD_BMC_CONF_DIR}/snmpd.local.conf"
|
||||||
TRAPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmptrapd.local.conf"
|
TRAPD_BMC_CONF="${SNMPD_BMC_CONF_DIR}/snmptrapd.local.conf"
|
||||||
|
|
||||||
TRAPD_CONF="/etc/snmp/snmptrapd.conf"
|
TRAPD_CONF="/etc/snmp/snmptrapd.conf"
|
||||||
|
|
||||||
LOCKFILE="/var/lock/subsys/bmc-snmp-proxy"
|
LOCKFILE="/var/lock/subsys/bmc-snmp-proxy"
|
||||||
BMC_INFO="/var/run/bmc-info"
|
BMC_INFO="/run/bmc-info"
|
||||||
|
|
||||||
IPMITOOL=`which ipmitool`
|
IPMITOOL=$(which ipmitool)
|
||||||
|
|
||||||
#Default config
|
#Default config
|
||||||
BMC_COMMUNITY="public"
|
BMC_COMMUNITY="public"
|
||||||
@ -57,14 +57,16 @@ bmc_info_exists()
|
|||||||
else
|
else
|
||||||
RETVAL=2
|
RETVAL=2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
}
|
}
|
||||||
|
|
||||||
check_snmp()
|
check_snmp()
|
||||||
{
|
{
|
||||||
if [ ! -d /etc/snmp ] && [ ! -x /usr/sbin/snmpd ]; then
|
if [ ! -d /etc/snmp ] || [ ! -x /usr/sbin/snmpd ]; then
|
||||||
RETVAL=12
|
RETVAL=12
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,11 +79,12 @@ write_snmp_conf()
|
|||||||
printf "###############################################\n"
|
printf "###############################################\n"
|
||||||
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
||||||
printf "###############################################\n"
|
printf "###############################################\n"
|
||||||
printf "view bmcview included %s 80\n" "${BMC_OID}"
|
printf "#view bmcview included %s 80\n" "${BMC_OID}"
|
||||||
printf "com2sec -Cn bmc_ctx bmc_sec default bmc_cmty\n"
|
printf "#com2sec -Cn bmc_ctx bmc_sec default bmc_cmty\n"
|
||||||
printf "group bmc_grp v1 bmc_sec\n"
|
printf "#group bmc_grp v1 bmc_sec\n"
|
||||||
printf "access bmc_grp bmc_ctx any noauth exact bmcview none none\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 "#proxy -Cn bmc_ctx -v 1 %s\n" "${PROXY_TOKEN}"
|
||||||
|
printf "proxy -v 1 %s\n" "${PROXY_TOKEN}"
|
||||||
printf "###############################################\n"
|
printf "###############################################\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,6 +95,7 @@ valid_ip()
|
|||||||
|
|
||||||
printf -- "%s" "${1}"| grep -Eq \
|
printf -- "%s" "${1}"| grep -Eq \
|
||||||
"^${octet}\\.${octet}\\.${octet}\\.${octet}$"
|
"^${octet}\\.${octet}\\.${octet}\\.${octet}$"
|
||||||
|
|
||||||
return $?
|
return $?
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,37 +116,38 @@ set_snmp_proxy()
|
|||||||
if check_vars; then
|
if check_vars; then
|
||||||
PROXY_TOKEN="-c ${BMC_COMMUNITY} ${BMC_IPv4} ${BMC_OID}"
|
PROXY_TOKEN="-c ${BMC_COMMUNITY} ${BMC_IPv4} ${BMC_OID}"
|
||||||
|
|
||||||
if [ ! -d ${SNMPD_LOCAL_CONF_DIR} ] && \
|
if [ -d ${SNMPD_BMC_CONF_DIR} ]; then
|
||||||
mkdir ${SNMPD_LOCAL_CONF_DIR}; then
|
write_snmp_conf > ${SNMPD_BMC_CONF} || RETVAL=4
|
||||||
write_snmp_conf > ${SNMPD_LOCAL_CONF}
|
|
||||||
[ $? -ne 0 ] && RETVAL=4
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
RETVAL=3
|
RETVAL=3
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
set_snmpd_conf_path()
|
set_snmpd_conf_path()
|
||||||
{
|
{
|
||||||
for SYSCONF in ${SYSCONF_DIR}/snmp*d;
|
if [ ! -d ${SNMPD_BMC_CONF_DIR} ]; then
|
||||||
|
mkdir ${SNMPD_BMC_CONF_DIR} || RETVAL=7
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We need SNMPCONFPATH set for both snmpd and snmptrapd
|
||||||
|
for sysconf in ${SYSCONF_DIR}/snmp*d;
|
||||||
do
|
do
|
||||||
if grep -q "${SNMPD_LOCAL_CONF_DIR}" "${SYSCONF}" > \
|
if ! grep -q "^SNMPCONFPATH.*${SNMPD_BMC_CONF_DIR}" \
|
||||||
/dev/null 2>&1; then
|
"${sysconf}" > /dev/null 2>&1; then
|
||||||
continue
|
printf "SNMPCONFPATH=/etc/snmp:%s\n" \
|
||||||
else
|
"${SNMPD_BMC_CONF_DIR}" >> ${sysconf} || \
|
||||||
printf "SNMPCONFPATH=%s\n" "${SNMPD_LOCAL_CONF_DIR}" \
|
RETVAL=7
|
||||||
>> ${SYSCONF} || RETVAL=7
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
}
|
}
|
||||||
|
|
||||||
disable_snmp_proxy()
|
disable_snmp_proxy()
|
||||||
{
|
{
|
||||||
if [ -f ${SNMPD_LOCAL_CONF} ]; then
|
if [ -f ${SNMPD_BMC_CONF} ]; then
|
||||||
rm -f ${SNMPD_LOCAL_CONF}
|
rm -f ${SNMPD_BMC_CONF} || RETVAL=5
|
||||||
[ $? -ne 0 ] && RETVAL=5
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
#############################################################################
|
#############################################################################
|
||||||
@ -152,7 +157,8 @@ disable_snmp_proxy()
|
|||||||
pick_alert_dest()
|
pick_alert_dest()
|
||||||
{
|
{
|
||||||
test_ip="$1"
|
test_ip="$1"
|
||||||
for ALERT_DEST in `seq 1 4`
|
# We have 4 IPv4 and 4 IPv6 alert dest. We will set IPv4 for now.
|
||||||
|
for ALERT_DEST in $(seq 1 4)
|
||||||
do
|
do
|
||||||
temp_ip=$(${IPMITOOL} lan alert print ${CHANNEL} ${ALERT_DEST}\
|
temp_ip=$(${IPMITOOL} lan alert print ${CHANNEL} ${ALERT_DEST}\
|
||||||
2>/dev/null| sed -n "s#^Alert IP Address.*: ##p")
|
2>/dev/null| sed -n "s#^Alert IP Address.*: ##p")
|
||||||
@ -165,14 +171,14 @@ pick_alert_dest()
|
|||||||
set_alert_dest_ip()
|
set_alert_dest_ip()
|
||||||
{
|
{
|
||||||
${IPMITOOL} lan alert set ${CHANNEL} ${ALERT_DEST} ipaddr ${1} \
|
${IPMITOOL} lan alert set ${CHANNEL} ${ALERT_DEST} ipaddr ${1} \
|
||||||
retry 4 type pet >/dev/null 2>&1
|
retry 4 type pet >/dev/null 2>&1 || RETVAL=8
|
||||||
[ $? -ne 0 ] && RETVAL=8
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bmc_alert_dest()
|
config_bmc_alert_dest()
|
||||||
{
|
{
|
||||||
|
# call with enable|disable
|
||||||
# Pick the first active LAN channel
|
# Pick the first active LAN channel
|
||||||
for CHANNEL in `seq 1 14`
|
for CHANNEL in $(seq 1 14)
|
||||||
do
|
do
|
||||||
[ $(${IPMITOOL} -I open channel info ${CHANNEL} 2>/dev/null \
|
[ $(${IPMITOOL} -I open channel info ${CHANNEL} 2>/dev/null \
|
||||||
| grep -q "802\.3") ] || break
|
| grep -q "802\.3") ] || break
|
||||||
@ -180,12 +186,12 @@ bmc_alert_dest()
|
|||||||
|
|
||||||
# If TRAPD_IP is already set as an alert dest,
|
# If TRAPD_IP is already set as an alert dest,
|
||||||
if pick_alert_dest "${TRAPD_IP}"; then
|
if pick_alert_dest "${TRAPD_IP}"; then
|
||||||
# reset: reset it if we are called with reset
|
# disable: reset it if we are called with disable
|
||||||
[ "${1}" = "reset" ] && \
|
[ "${1}" = "disable" ] && \
|
||||||
set_alert_dest_ip "0.0.0.0"
|
set_alert_dest_ip "0.0.0.0"
|
||||||
# else, find the next free alert dest,
|
# else, find the next free alert dest,
|
||||||
elif pick_alert_dest "0.0.0.0"; then
|
elif pick_alert_dest "0.0.0.0"; then
|
||||||
[ "${1}" = "reset" ] && \
|
[ "${1}" = "disable" ] && \
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
# set: the TRAPD_IP
|
# set: the TRAPD_IP
|
||||||
set_alert_dest_ip "${TRAPD_IP}"
|
set_alert_dest_ip "${TRAPD_IP}"
|
||||||
@ -193,42 +199,54 @@ bmc_alert_dest()
|
|||||||
# No free alert destinations
|
# No free alert destinations
|
||||||
RETVAL=9
|
RETVAL=9
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return $RETVAL
|
return $RETVAL
|
||||||
}
|
}
|
||||||
|
|
||||||
set_ipmi_alert()
|
set_ipmi_pef()
|
||||||
{
|
{
|
||||||
${IPMITOOL} lan set ${CHANNEL} alert "${1}" >/dev/null 2>&1
|
# Needs ipmitool-1.8.13 + patches
|
||||||
[ $? -ne 0 ] && RETVAL=10
|
${IPMITOOL} pef policy set ${ALERT_DEST} "${1}" >/dev/null 2>&1 || \
|
||||||
|
RETVAL=10
|
||||||
}
|
}
|
||||||
|
|
||||||
get_host_ip()
|
get_host_ip()
|
||||||
{
|
{
|
||||||
# Get host's IP that the BMC can reach.
|
# Get host's IP that the BMC can reach. This is at best a hack.
|
||||||
IFACE=$(/usr/sbin/ip -o -f inet address |awk '!/: lo/ {print $2}')
|
IFACE=$(/usr/sbin/ip -o -f inet address |awk '!/: lo/ {print $2}')
|
||||||
|
|
||||||
for dev in ${IFACE}
|
for dev in ${IFACE}
|
||||||
do
|
do
|
||||||
ping -c 1 -I ${dev} ${BMC_IPv4} > /dev/null 2>&1
|
temp_ping=$(ping -c 1 -I ${dev} ${BMC_IPv4})
|
||||||
|
[ $? -ne 0 ] && continue
|
||||||
|
|
||||||
|
printf -- "%s" "$temp_ping"| awk 'NR==1{print $5}' && break
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
config_bmc_alert()
|
config_bmc_alert()
|
||||||
{
|
{
|
||||||
|
# Do two things
|
||||||
|
# Set/Reset TRAP IP in BMC
|
||||||
|
# Enable/Disable PEF alerting in BMC for TRAP
|
||||||
|
|
||||||
# Get Host's IP that the BMC can send traps to
|
# Get Host's IP that the BMC can send traps to
|
||||||
TRAPD_IP=$(get_host_ip)
|
TRAPD_IP=$(get_host_ip)
|
||||||
|
|
||||||
# Set Host's IP as the alert destination in the BMC
|
# Set Host's IP as the alert destination in the BMC
|
||||||
valid_ip ${TRAPD_IP} && bmc_alert_dest "${ACTION}"
|
valid_ip ${TRAPD_IP} && config_bmc_alert_dest "${ACTION}"
|
||||||
|
|
||||||
# Enable alerting on the LAN channel
|
# Enable/Disable alerting on the LAN channel
|
||||||
[ $RETVAL -eq 0 ] && set_ipmi_alert "${ACTION}"
|
[ $RETVAL -eq 0 ] && set_ipmi_pef "${ACTION}"
|
||||||
|
|
||||||
|
return $RETVAL
|
||||||
}
|
}
|
||||||
|
|
||||||
write_trapd_conf()
|
write_trapd_conf()
|
||||||
{
|
{
|
||||||
printf "###############################################\n"
|
printf "###############################################\n"
|
||||||
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
|
||||||
printf "forward %s %s\n" "${BMC_OID}*" "${FORWARD_HOST}"
|
printf "forward default %s\n" "${FORWARD_HOST}"
|
||||||
printf "###############################################\n"
|
printf "###############################################\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,10 +254,9 @@ config_trapd()
|
|||||||
{
|
{
|
||||||
# Proceed only if snmptrapd is available on the system
|
# Proceed only if snmptrapd is available on the system
|
||||||
if [ -f ${TRAPD_CONF} ]; then
|
if [ -f ${TRAPD_CONF} ]; then
|
||||||
write_trapd_conf > ${TRAPD_LOCAL_CONF}
|
write_trapd_conf > ${TRAPD_BMC_CONF} || RETVAL=11
|
||||||
[ $? -ne 0 ] && RETVAL=11
|
|
||||||
else
|
else
|
||||||
return 1
|
RETVAL=11
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,6 +266,7 @@ trap_sink_exists()
|
|||||||
# multiple
|
# multiple
|
||||||
FORWARD_HOST=$(awk '/^trap.*sink/{print $2}; /^informsink/{print $2}' \
|
FORWARD_HOST=$(awk '/^trap.*sink/{print $2}; /^informsink/{print $2}' \
|
||||||
/etc/snmp/snmpd*conf | head -1)
|
/etc/snmp/snmpd*conf | head -1)
|
||||||
|
|
||||||
if [ -z "${FORWARD_HOST}" ]; then
|
if [ -z "${FORWARD_HOST}" ]; then
|
||||||
# there is no trapsink setup.
|
# there is no trapsink setup.
|
||||||
return 1
|
return 1
|
||||||
@ -261,19 +279,20 @@ trap_sink_exists()
|
|||||||
trap_forward()
|
trap_forward()
|
||||||
{
|
{
|
||||||
NO_TRAP=0
|
NO_TRAP=0
|
||||||
ACTION=${1} # set or reset
|
ACTION=${1} # enable or disable
|
||||||
|
|
||||||
if [ "${ACTION}" = "set" ]; then
|
if [ "${ACTION}" = "enable" ]; then
|
||||||
# Get trapd config,
|
# Get trapd config,
|
||||||
if trap_sink_exists; then
|
if trap_sink_exists; then
|
||||||
config_trapd && config_bmc_alert
|
config_bmc_alert && config_trapd
|
||||||
else
|
else
|
||||||
# exit silently if there is no sink
|
# exit silently if there is no sink
|
||||||
NO_TRAP=1
|
NO_TRAP=1
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if [ -f ${TRAPD_LOCAL_CONF} ]; then
|
if [ -f ${TRAPD_BMC_CONF} ]; then
|
||||||
rm -f ${TRAPD_LOCAL_CONF} >/dev/null 2>&1
|
rm -f ${TRAPD_BMC_CONF} >/dev/null 2>&1
|
||||||
|
config_bmc_alert
|
||||||
else
|
else
|
||||||
NO_TRAP=1
|
NO_TRAP=1
|
||||||
fi
|
fi
|
||||||
@ -288,7 +307,6 @@ service_reload()
|
|||||||
service $1 reload
|
service $1 reload
|
||||||
[ $? -ne 0 ] && RETVAL=6
|
[ $? -ne 0 ] && RETVAL=6
|
||||||
fi
|
fi
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
@ -296,11 +314,12 @@ start()
|
|||||||
{
|
{
|
||||||
if bmc_info_exists && check_snmp; then
|
if bmc_info_exists && check_snmp; then
|
||||||
touch ${LOCKFILE}
|
touch ${LOCKFILE}
|
||||||
|
|
||||||
set_snmpd_conf_path && set_snmp_proxy
|
set_snmpd_conf_path && set_snmp_proxy
|
||||||
[ $RETVAL -eq 0 ] && service_reload snmpd
|
[ $RETVAL -eq 0 ] && service_reload snmpd
|
||||||
|
|
||||||
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
||||||
trap_forward "set"
|
trap_forward "enable"
|
||||||
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
||||||
service_reload snmptrapd
|
service_reload snmptrapd
|
||||||
fi
|
fi
|
||||||
@ -316,10 +335,11 @@ stop()
|
|||||||
[ $RETVAL -eq 0 ] && service_reload snmpd
|
[ $RETVAL -eq 0 ] && service_reload snmpd
|
||||||
|
|
||||||
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
if [ "${TRAP_FORWARD}" = "yes" ]; then
|
||||||
trap_forward "reset"
|
trap_forward "disable"
|
||||||
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
|
||||||
service_reload snmptrapd
|
service_reload snmptrapd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -f ${LOCKFILE}
|
rm -f ${LOCKFILE}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -329,12 +349,13 @@ status()
|
|||||||
{
|
{
|
||||||
eval_gettext "${SCRIPT_NAME}: snmp proxy to BMC is "
|
eval_gettext "${SCRIPT_NAME}: snmp proxy to BMC is "
|
||||||
# Checking for lockfile is better.
|
# Checking for lockfile is better.
|
||||||
#if grep -q "^proxy" "${SNMPD_LOCAL_CONF}" > /dev/null 2>&1 ; then
|
#if grep -q "^proxy" "${SNMPD_BMC_CONF}" > /dev/null 2>&1 ; then
|
||||||
if [ -f ${LOCKFILE} ]; then
|
if [ -f ${LOCKFILE} ]; then
|
||||||
eval_gettext "set"
|
eval_gettext "set"
|
||||||
else
|
else
|
||||||
eval_gettext "not set"
|
eval_gettext "not set"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
RETVAL=0
|
RETVAL=0
|
||||||
}
|
}
|
||||||
@ -360,10 +381,10 @@ case "$RETVAL" in
|
|||||||
0|1) ;;
|
0|1) ;;
|
||||||
2) eval_gettext "${SCRIPT_NAME}: failed to read ${BMC_INFO} " 1>&2 ;;
|
2) eval_gettext "${SCRIPT_NAME}: failed to read ${BMC_INFO} " 1>&2 ;;
|
||||||
3) eval_gettext "${SCRIPT_NAME}: failed to get proxy config." 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 ;;
|
4) eval_gettext "${SCRIPT_NAME}: failed to set ${SNMPD_BMC_CONF}." 1>&2 ;;
|
||||||
5) eval_gettext "${SCRIPT_NAME}: failed to disable snmp proxy." 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 ;;
|
6) eval_gettext "${SCRIPT_NAME}: failed to reload snmpd." 1>&2 ;;
|
||||||
7) eval_gettext "${SCRIPT_NAME}: failed to update ${SYSCONF}." 1>&2 ;;
|
7) eval_gettext "${SCRIPT_NAME}: failed to set snmpd config." 1>&2 ;;
|
||||||
8) eval_gettext "${SCRIPT_NAME}: failed to set IPMI alert dest." 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 ;;
|
9) eval_gettext "${SCRIPT_NAME}: no free IPMI alert dest." 1>&2 ;;
|
||||||
10) eval_gettext "${SCRIPT_NAME}: failed to set IPMI PEF." 1>&2 ;;
|
10) eval_gettext "${SCRIPT_NAME}: failed to set IPMI PEF." 1>&2 ;;
|
||||||
@ -375,6 +396,7 @@ esac
|
|||||||
if [ ${RETVAL} -gt 1 ]; then
|
if [ ${RETVAL} -gt 1 ]; then
|
||||||
eval_gettext " Return code: ${RETVAL}"; echo
|
eval_gettext " Return code: ${RETVAL}"; echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exit ${RETVAL}
|
exit ${RETVAL}
|
||||||
#############################################################################
|
#############################################################################
|
||||||
# end of file
|
# end of file
|
||||||
|
@ -5,7 +5,7 @@ After=exchange-bmc-os-info.service
|
|||||||
Requires=exchange-bmc-os-info.service
|
Requires=exchange-bmc-os-info.service
|
||||||
PartOf=exchange-bmc-os-info.service
|
PartOf=exchange-bmc-os-info.service
|
||||||
|
|
||||||
ConditionPathExists=/var/run/bmc-info
|
ConditionPathExists=/run/bmc-info
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
# Description: Script to set OS information in the BMC; fetch BMC IP/URL
|
# Description: Script to set OS information in the BMC; fetch BMC IP/URL
|
||||||
# and set in the OS for use by other scripts/user.
|
# and set in the OS for use by other scripts/user.
|
||||||
#
|
#
|
||||||
# BMC IP and URL are made available in /var/run/bmc-info
|
# BMC IP and URL are made available in /run/bmc-info
|
||||||
#
|
#
|
||||||
# Example to launch BMC web-interface:
|
# Example to launch BMC web-interface:
|
||||||
# # . /var/run/bmc-info
|
# # . /run/bmc-info
|
||||||
# # xdg-open $BMC_URL
|
# # xdg-open $BMC_URL
|
||||||
#
|
#
|
||||||
# See here for details:
|
# See here for details:
|
||||||
@ -42,7 +42,7 @@
|
|||||||
#############################################################################
|
#############################################################################
|
||||||
CONFIGFILE=/etc/sysconfig/exchange-bmc-os-info
|
CONFIGFILE=/etc/sysconfig/exchange-bmc-os-info
|
||||||
IPMI_TOOL=/usr/bin/ipmitool
|
IPMI_TOOL=/usr/bin/ipmitool
|
||||||
BMC_INFO=/var/run/bmc-info
|
BMC_INFO=/run/bmc-info
|
||||||
|
|
||||||
# BMC Manufacturer ID used in 'oem_set_os_version' and 'oem_get_bmc_url'
|
# BMC Manufacturer ID used in 'oem_set_os_version' and 'oem_get_bmc_url'
|
||||||
DELL="674"
|
DELL="674"
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=Exchange Information between BMC and OS
|
Description=Exchange Information between BMC and OS
|
||||||
After=ipmi.service network.target
|
After=network.target
|
||||||
Requires=ipmi.service
|
AssertFileIsExecutable=/usr/bin/ipmitool
|
||||||
|
AssertPathExistsGlob=/dev/ipmi*
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
|
@ -22,7 +22,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|||||||
DESC="IPMI event daemon"
|
DESC="IPMI event daemon"
|
||||||
NAME=ipmievd
|
NAME=ipmievd
|
||||||
DAEMON=/usr/sbin/$NAME
|
DAEMON=/usr/sbin/$NAME
|
||||||
PIDFILE=/var/run/$NAME.pid
|
PIDFILE=/run/$NAME.pid
|
||||||
SCRIPTNAME=/etc/init.d/$NAME
|
SCRIPTNAME=/etc/init.d/$NAME
|
||||||
|
|
||||||
# Gracefully exit if the package has been removed.
|
# Gracefully exit if the package has been removed.
|
||||||
|
88
contrib/log_bmc.sh
Normal file
88
contrib/log_bmc.sh
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#############################################################################
|
||||||
|
#
|
||||||
|
# log_bmc.sh: Add SEL entries to indicate OS Boot/Install status.
|
||||||
|
#
|
||||||
|
# version: 0.1
|
||||||
|
#
|
||||||
|
# Authors: Charles Rose <charles_rose@dell.com>
|
||||||
|
# Jordan Hargrave <jordan_hargrave@dell.com>
|
||||||
|
#
|
||||||
|
# Description: Script to log OS boot/install status to the BMC. Primarily
|
||||||
|
# meant for use in automated installs and start up scripts.
|
||||||
|
# Will provide administrators with OS boot/install status in
|
||||||
|
# BMC and aid with debugging.
|
||||||
|
#
|
||||||
|
# Example usage:
|
||||||
|
# # ./log_bmc.sh inst_start
|
||||||
|
# # ipmitool sel list
|
||||||
|
# b | 05/07/2014 | 12:07:32 | OS Boot | Installation started
|
||||||
|
#
|
||||||
|
# See here for details:
|
||||||
|
# https://fedoraproject.org/wiki/Features/AgentFreeManagement
|
||||||
|
#
|
||||||
|
#############################################################################
|
||||||
|
IPMI_CMD="/usr/bin/ipmitool"
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# SEL Event types from ipmi_sel.h
|
||||||
|
OS_STOP="0x20"
|
||||||
|
OS_BOOT="0x1f"
|
||||||
|
# SEL Event data from ipmi_sel.h
|
||||||
|
GRACEFUL_SHUTDOWN="0x03" # OS Stop/Shutdown: Installation started
|
||||||
|
BOOT_COMPLETED="0x01" # OS Boot: Installation started
|
||||||
|
INSTALL_STARTED="0x07" # OS Boot: Installation started
|
||||||
|
INSTALL_COMPLETED="0x08" # OS Boot: Installation completed
|
||||||
|
INSTALL_ABORTED="0x09" # OS Boot: Installation aborted
|
||||||
|
INSTALL_FAILED="0x0a" # OS Boot: Installation failed
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
# check for ipmi functionality.
|
||||||
|
check_ipmi()
|
||||||
|
{
|
||||||
|
# ensures presence of ipmitool and /dev/ipmi*
|
||||||
|
${IPMI_CMD} mc info > /dev/null 2>&1
|
||||||
|
[ $? -ne 0 ] && RETVAL=2
|
||||||
|
}
|
||||||
|
|
||||||
|
# Write out the events to SEL
|
||||||
|
ipmi_sel_add()
|
||||||
|
{
|
||||||
|
# Refer ipmitool(1) event for details on format.
|
||||||
|
printf "0x04 %s 0x00 0x6f %s 0x00 0x00" ${type} ${status} > \
|
||||||
|
${tmpfile} && \
|
||||||
|
${IPMI_CMD} sel add ${tmpfile} > /dev/null 2>&1
|
||||||
|
[ $? -ne 0 ] && RETVAL=3
|
||||||
|
}
|
||||||
|
|
||||||
|
### Main
|
||||||
|
# Most of the status is for this event type
|
||||||
|
tmpfile=$(/usr/bin/mktemp)
|
||||||
|
RETVAL=0
|
||||||
|
type=${OS_BOOT}
|
||||||
|
|
||||||
|
case ${1} in
|
||||||
|
os_shutdown) type=${OS_STOP}; status=${GRACEFUL_SHUTDOWN} ;;
|
||||||
|
os_boot) status=${BOOT_COMPLETED} ;;
|
||||||
|
inst_start) status=${INSTALL_STARTED} ;;
|
||||||
|
inst_complete) status=${INSTALL_COMPLETED} ;;
|
||||||
|
inst_abort) status=${INSTALL_ABORTED} ;;
|
||||||
|
inst_fail) status=${INSTALL_FAILED} ;;
|
||||||
|
*) RETVAL=1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ ${RETVAL} -eq 0 ] && check_ipmi
|
||||||
|
[ ${RETVAL} -eq 0 ] && ipmi_sel_add ${status}
|
||||||
|
|
||||||
|
case ${RETVAL} in
|
||||||
|
0) ;;
|
||||||
|
1) printf -- %s\\n "Usage: $0 <os_boot|os_shutdown|inst_start|inst_complete|inst_abort|inst_fail>" ;;
|
||||||
|
2) printf -- %s\\n "failed to communicate with BMC." ;;
|
||||||
|
3) printf -- %s\\n "error adding ipmi sel entry." ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
[ -f ${tmpfile} ] && rm -f ${tmpfile} > /dev/null 2>&1
|
||||||
|
|
||||||
|
exit ${RETVAL}
|
||||||
|
### End
|
@ -1,4 +1,4 @@
|
|||||||
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x01","0x00","Chassis Number","R","R","0x00","CPU shutdown - Potential cause "triple fault" a software address problem"
|
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x01","0x00","Chassis Number","R","R","0x00","CPU shutdown - Potential cause 'triple fault' a software address problem"
|
||||||
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x01","Chassis Number","Failed Memory Card","Spare Memory Card","0x00","Memory Mirrored Failover Occurred - System running from mirrored memory image"
|
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x01","Chassis Number","Failed Memory Card","Spare Memory Card","0x00","Memory Mirrored Failover Occurred - System running from mirrored memory image"
|
||||||
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x04","Chassis Number","Memory Card","Completion Code (0x00=Success)","0x00","Memory hot replace event"
|
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x04","Chassis Number","Memory Card","Completion Code (0x00=Success)","0x00","Memory hot replace event"
|
||||||
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x05","Chassis Number","Memory Card","Memory Size (in 512MB units)","0x00","Memory hot add event"
|
"0xC1","XX","XX","XX","XX","XX","XX","XX","0x02","0x05","Chassis Number","Memory Card","Memory Size (in 512MB units)","0x00","Memory hot add event"
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
EXTRA_DIST = pkginfo.in prototype.in \
|
EXTRA_DIST = pkginfo.in prototype.in \
|
||||||
ipmitool.spec.in rpmmacros.in rpmrc
|
ipmitool.spec.in
|
||||||
|
|
||||||
dist-hook: pkginfo prototype rpmmacros
|
dist-hook: pkginfo prototype
|
||||||
|
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
|
%define debug_package %{nil}
|
||||||
|
|
||||||
Name: ipmitool
|
Name: ipmitool
|
||||||
Summary: ipmitool - Utility for IPMI control
|
Summary: ipmitool - Utility for IPMI control
|
||||||
Version: @VERSION@
|
Version: @VERSION@
|
||||||
Release: @RPM_RELEASE@%{?_distro:.%{_distro}}
|
Release: @RPM_RELEASE@%{?_distro:.%{_distro}}
|
||||||
License: BSD
|
License: BSD
|
||||||
Group: Utilities
|
Group: Utilities
|
||||||
Packager: Jim Mankovich <jmank@hp.com>
|
#Packager: PackagerName <packager@example.com>
|
||||||
|
Distribution: GitHub Build
|
||||||
Source: %{name}-%{version}.tar.gz
|
Source: %{name}-%{version}.tar.gz
|
||||||
Buildroot: /var/tmp/ipmitool-root
|
Buildroot: /var/tmp/ipmitool-root
|
||||||
|
|
||||||
@ -31,7 +34,7 @@ fi
|
|||||||
%setup
|
%setup
|
||||||
|
|
||||||
%build
|
%build
|
||||||
./configure --with-kerneldir \
|
./configure \
|
||||||
--with-rpm-distro=@DISTRO@ \
|
--with-rpm-distro=@DISTRO@ \
|
||||||
--prefix=%{_prefix} \
|
--prefix=%{_prefix} \
|
||||||
--bindir=%{_bindir} \
|
--bindir=%{_bindir} \
|
||||||
@ -56,11 +59,632 @@ fi
|
|||||||
%attr(755,root,root) %{_bindir}/*
|
%attr(755,root,root) %{_bindir}/*
|
||||||
%attr(755,root,root) %{_sbindir}/*
|
%attr(755,root,root) %{_sbindir}/*
|
||||||
%{_datadir}/ipmitool/*
|
%{_datadir}/ipmitool/*
|
||||||
|
%{_datadir}/misc/*
|
||||||
%{_mandir}/man*/*
|
%{_mandir}/man*/*
|
||||||
%doc %{_datadir}/doc/ipmitool
|
%doc %{_datadir}/doc/ipmitool
|
||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sat Oct 8 2016 <gilles.buloz@kontron.com> 1.8.18-1
|
||||||
|
- Add mac2str() and str2mac() to print/parse MAC address
|
||||||
|
- Change formatting, remove commented-out code in
|
||||||
|
src/plugins/imb/imbapi.c
|
||||||
|
- Export find_lan_channel() as global
|
||||||
|
- Expose _ipmi_get_channel_info()
|
||||||
|
- Extend buf2str to allow separator
|
||||||
|
- Fix indentation of #define in src/plugins/imb/imbapi.c
|
||||||
|
- Fix missing `goto out_free;` when ipmi_parse_hex() returns (-1)
|
||||||
|
- Fix warning for buf2str argument
|
||||||
|
- ID 408 - fix sel list last X listing
|
||||||
|
- ID: 38 - Protocol violating SOL retries when talking to
|
||||||
|
SIMSO-HTC
|
||||||
|
- ID: 459 - Fix reading FRU on Artesyn (Emerson) shelf manager,
|
||||||
|
MF105.
|
||||||
|
- ID: 464 - ipmievd crash fix in log_event
|
||||||
|
- ID:230 - check return value of malloc() in lib/ipmi_ekanalyzer.c
|
||||||
|
- ID:261 - Fix err. output consistency for % ipmitool chassis
|
||||||
|
INV_PARAM;
|
||||||
|
- ID:287 - Fix print-out of DDR3 SDRAM Serial Number
|
||||||
|
- ID:287 - Remove trailing white-spaces from dimm_spd.c
|
||||||
|
- ID:289 - bmx-snmp-proxy: PEF alerting does not work for
|
||||||
|
multiple destinations
|
||||||
|
- ID:312 - BREAKING CHANGE - Re-design of PEF user interface
|
||||||
|
- ID:312 - Fix bitmask in _ipmi_set_pef_policy_entry()
|
||||||
|
- ID:335 - Check return value of fseek(), prevent segfault
|
||||||
|
- ID:335 - Check return value of fseek(), prevent segfault
|
||||||
|
- ID:355 - Comment out statement without effect in lib/ipmi_sel.c
|
||||||
|
- ID:355 - Fix 'missing initializer' in struct lan_param
|
||||||
|
- ID:355 - Fix ``warning: ISO C forbids zero-size array 'data'''
|
||||||
|
- ID:355 - Fix different pointer type in lib/ipmi_picmg.c
|
||||||
|
- ID:355 - Fix missing struct initializers in lib/ipmi_firewall.c
|
||||||
|
- ID:355 - Fix printf format in lib/ipmi_sunoem.c
|
||||||
|
- ID:355 - Fix printf() related warnings in lib/ipmi_delloem.c
|
||||||
|
- ID:355 - Fix signedness warnings in lib/ipmi_sdr.c
|
||||||
|
- ID:355 - Fix statements without effect in lib/ipmi_ekanalyzer.c
|
||||||
|
- ID:355 - Move section_id from ipmi_fru. to ipmi_fru.c
|
||||||
|
- ID:355 - Replace DEBUG() macro with lprintf(LOG_DEBUG, ...)
|
||||||
|
- ID:375 - Add lan6 subcommand to handle IPv6 LAN parameters
|
||||||
|
- ID:400 - Add support for VITA-specific sensor types and events.
|
||||||
|
- ID:441 - Add support for HMAC_MD5 and HMAC_SHA256
|
||||||
|
- ID:443 - Disable USB driver by default on non-Linux systems
|
||||||
|
- ID:444 - Cleanup of defaults in configure.ac
|
||||||
|
- ID:445 - Fix of compilation on FreeBSD
|
||||||
|
- ID:446 - Fix broken firewall reset iterator
|
||||||
|
- ID:447 - Fix access beyond array limits in serial_terminal
|
||||||
|
- ID:449 - ipmitool close console session for sol deactivate
|
||||||
|
command
|
||||||
|
- ID:451 - Modify the memory ecc error display of SEL for new
|
||||||
|
supermicro motherboards.
|
||||||
|
- ID:452 - Add PICMG extension 5.x for PICMG extension check
|
||||||
|
- ID:454 - Add support for PICMG 3.1 R2.0 Link Types and Link
|
||||||
|
Classes.
|
||||||
|
- ID:456 - Unable to disable the VLAN ID using ipmitool
|
||||||
|
- ID:457 - Display User ID enable/disable status
|
||||||
|
- ID:463 - Removal of Nokia Siemens Networks
|
||||||
|
- ID:465 - Supermicro memory ecc Modify the memory ecc error
|
||||||
|
display of SEL for new supermicro boards.
|
||||||
|
- Moved ipmi_parse_hex() to helper.c
|
||||||
|
- Re-work ipmi_mc_get_guid() and turn it into reusable code
|
||||||
|
- Revert "ID:335 - Check return value of fseek(), prevent segfault"
|
||||||
|
- Rewrite code with the notion that Kg is binary data, not string
|
||||||
|
|
||||||
|
* Sun May 1 2016 <gilles.buloz@kontron.com> 1.8.17-1
|
||||||
|
- Add INSTALL and NEWS, mandated by autoconf
|
||||||
|
- Added missing ipmi_sel_supermicro.h to template Makefile.am
|
||||||
|
- Check rsp->data_len in ipmi_sel_get_info()
|
||||||
|
- Fix "redirecting incorrect #include <sys/poll.h> to <poll.h>"
|
||||||
|
warning with musl libc
|
||||||
|
- Fix automake compatibility warnings
|
||||||
|
- Fix implicit declaration of function
|
||||||
|
'get_nic_selection_mode_12g' in lib/ipmi_delloem.c
|
||||||
|
- Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/imb/imb.c
|
||||||
|
- Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/lanplus/lanplus.c
|
||||||
|
- Fix implicit declaration of function 'ipmi_get_oem' in
|
||||||
|
src/plugins/open/open.c
|
||||||
|
- Fix implicit declarations of functions 'HpmfwupgPreUpgradeCheck'
|
||||||
|
and 'ipmi_intf_get_max_request_data_size' in lib/ipmi_hpmfwupg.c
|
||||||
|
- Fix implicit declarations of functions
|
||||||
|
'ipmi_intf_set_max_request_data_size' and
|
||||||
|
'ipmi_intf_set_max_response_data_size' in lib/hpm2.c
|
||||||
|
- Fix implicit function declaration of
|
||||||
|
ipmi_intf_get_max_response_data_size in lib/ipmi_sdr.c
|
||||||
|
- Fix several implicit declarations of functions in
|
||||||
|
lib/ipmi_main.c
|
||||||
|
- Fix several implicit function declarations in lib/ipmi_fru.c
|
||||||
|
- Fix warning: suggest parentheses around '+' inside '<<'
|
||||||
|
in lib/ipmi_main.c
|
||||||
|
- Fix warning: suggest parentheses around arithmetic in operand of
|
||||||
|
'|' in include/ipmitool/hpm2
|
||||||
|
- Get rid of old INCLUDES macro, use AM_CPPFLAGS instead.
|
||||||
|
- ID 440 - Fix 'unknown type name fd_set error.
|
||||||
|
- ID 440 - remove obsolete headers from lib/ipmi_sunoem.c
|
||||||
|
- ID:322 - let 'ekanalyzer frushow' run without a working
|
||||||
|
IPMI target
|
||||||
|
- ID:355 - Add #include <strings.h> to lib/ipmi_sel.c
|
||||||
|
- ID:355 - Add macros and #include and reduce number of warnings
|
||||||
|
- ID:355 - Change CFLAG -std=c99 to -std=gnu99
|
||||||
|
- ID:355 - Move Super Micro stuff into dedicated header file
|
||||||
|
- ID:355 - Remove declared, but not used variables
|
||||||
|
- ID:404 - Edit FRU information update problem
|
||||||
|
- ID:405 - Use meaningful Generator ID for "ipmitool sel add"
|
||||||
|
- ID:407 - Avoid assert on mismatched session ID
|
||||||
|
- ID:409 - Fix IPv6 socket creation on Windows/Cygwin.
|
||||||
|
- ID:410 - Disable USB interface for Windows/Cygwin by default.
|
||||||
|
- ID:410 - Enable/disable USB interface by "auto"
|
||||||
|
- ID:411 - Fix HPM.2 revision check for R1.1 and subsequent
|
||||||
|
specification revisions.
|
||||||
|
- ID:412 - Check errors when setting a user password.
|
||||||
|
- ID:413 - Print new line chne character when setting user
|
||||||
|
privilege.
|
||||||
|
- ID:414 - ekanalyzer frushow fails to show 'Product Info'
|
||||||
|
correctly
|
||||||
|
- ID:417 - Fix some typos
|
||||||
|
- ID:418 - Fix Compiling under Mac OS X
|
||||||
|
- ID:419 - List dummy.h in Makefile.am, so it gets included in
|
||||||
|
a release tarball
|
||||||
|
- ID:421 - Fix memleak for sol output
|
||||||
|
- ID:423 - Don't assume internal use area is present in ekanalyzer
|
||||||
|
- ID:424 - Update dimm_spd.c with data from the latest JEDEC List
|
||||||
|
- ID:425 - Disable USB interface for OS X/darwin
|
||||||
|
- ID:426 - Fallback to run-time detection of PAGESIZE if
|
||||||
|
compile-time detection is not supported
|
||||||
|
- ID:426 - Include sys/socket.h instead of asm/socket.h
|
||||||
|
- ID:426 - Include wchar.h instead of defining wchar_t ourselves
|
||||||
|
- ID:427 - Cleanup comment in ipmi_sdr_get_header()
|
||||||
|
- ID:427 - The first two bytes of dumped raw SDR data is wrong.
|
||||||
|
- ID:428 - Update IANA numbers / Product Name for IBM and ADLINK
|
||||||
|
- ID:430 - Change Nokia Siemens Networks to Nokia Solutions
|
||||||
|
and Networks
|
||||||
|
- ID:431 - Fix correct interpretation of led states
|
||||||
|
- ID:437 - sel: Fix "sel time set <time>"
|
||||||
|
- Make bootstrap script part of dist packages
|
||||||
|
- Remove #if 0 code aka not-compiled-in
|
||||||
|
- Remove trailing white-spaces in lib/log.c
|
||||||
|
- git-ignore autoconf-generated files
|
||||||
|
|
||||||
|
* Sun Nov 22 2015 <gilles.buloz@kontron.com> 1.8.16-1
|
||||||
|
- Add _ipmi_get_channel_access() and _ipmi_get_channel_info()
|
||||||
|
- Add _ipmi_get_user_access() and _ipmi_set_user_access()
|
||||||
|
- Add _ipmi_get_user_name()
|
||||||
|
- Add _ipmi_set_channel_access() function
|
||||||
|
- Add _ipmi_set_user_password() function
|
||||||
|
- Add limits check in get_cmdline_macaddr()
|
||||||
|
- Change expression in ipmi_pef_get_info() in order to silence Coverity
|
||||||
|
- Change expression in ipmi_pef_list_policies() in order to silence Coverity
|
||||||
|
- Code cleanup in ipmi_user_main()
|
||||||
|
- Create ask_password() and re-use code
|
||||||
|
- Delete dead code from ipmi_sunoem_echo() - CID#1261338
|
||||||
|
- Don't output pidfile before parsing command line arguments
|
||||||
|
- Don't use tmp variable since it's not necessary in ipmi_user_test()
|
||||||
|
- Fix 'user help' output
|
||||||
|
- Fix Assign instead of compare in KfwumGetDeviceInfo() - CID#1149034
|
||||||
|
- Fix Identical code for different branches in ipmi_tsol_main() -
|
||||||
|
CID#1261346
|
||||||
|
- Fix big parameter passed by value in ipmi_sel_oem_match() - CID#1261347
|
||||||
|
- Fix dead code in ipmi_firewall_reset() - CID#1261342
|
||||||
|
- Fix eval logic in ipmi_user_priv()
|
||||||
|
- Fix file descriptor leak in ipmi_exec_main() - CID#1149040
|
||||||
|
- Fix identical code for diff branches in DellOEM - CID#1261326
|
||||||
|
- Fix memory leak in get_supermicro_evt_desc()
|
||||||
|
- Fix memory leak in ipmi_ek_display_board_info_area() - CID#1149051
|
||||||
|
- Fix missing return in ipmi_kontronoem_main() - CID#1261317
|
||||||
|
- Fix of previous commit - memset() expects pointer
|
||||||
|
- Fix out-of-bound-reads in get_supermicro_evt_desc()
|
||||||
|
- Fix resource leak in fru_area_print_board() - CDI#1149048
|
||||||
|
- Fix resource leak in fru_area_print_chassis() - CID#1149047
|
||||||
|
- Fix resource leak in fru_area_print_product() - CID#1149046
|
||||||
|
- Fix resource leak in ipmi_kontron_set_serial_number() - CID#1149041
|
||||||
|
- Fix typo vlan->VLAN in ipmi_lan_set_vlan_id() and
|
||||||
|
ipmi_lan_set_vlan_priority()
|
||||||
|
- Fix uninitialized struct in ipmi_fru_upg_ekeying() - CID#1149065
|
||||||
|
- Fix user input validation in Channel and User sub-commands
|
||||||
|
- Fix wrong size argument in ipmi_sdr_list_cache_fromfile() - CID#1149056
|
||||||
|
- Fix/remove pointer cast in _ipmi_set_user_access()
|
||||||
|
- Hook functions in ipmi_user to _ipmi_set_user_password()
|
||||||
|
- Hook ipmi_get_channel_info() to _ipmi_get_*()
|
||||||
|
- Hook ipmi_get_channel_medium() to new _ipmi_get_*() functions
|
||||||
|
- Hook ipmi_lan_set_password() to _ipmi_set_user_password()
|
||||||
|
- Hook ipmi_print_user_list() and friends to _ipmi_* functions
|
||||||
|
- Hook ipmi_set_alert_enable() to _ipmi_*()
|
||||||
|
- Hook ipmi_set_user_access() to _ipmi_set_user_access()
|
||||||
|
- Hook ipmi_user_priv() to _ipmi_set_user_access()
|
||||||
|
- ID:307 - Intel I82751 super pass through mode fixup
|
||||||
|
- ID:355 - Fix compiler warnings for Dummy Interface
|
||||||
|
- ID:380 - raw commands override retry and timeout values
|
||||||
|
- ID:319 - Interface safe re-open
|
||||||
|
- ID:320 - Add VITA 46.11 support
|
||||||
|
- ID:333 - Set read timeout to 15s in OpenIPMI interface
|
||||||
|
- ID:336 - ipmitool does not fall back to IPv4 for IPMI v2 / RMCP+ sessions
|
||||||
|
- ID:343 - Print actual sensor thresholds in 'sensors' comand
|
||||||
|
- ID:343 - Remove AC_FUNC_MALLOC
|
||||||
|
- ID:344 - Fix HPM.2 long message support
|
||||||
|
- ID:345 - Do not do several close session retries when catching SIGINT
|
||||||
|
- ID:346 - lib/ipmi_sdradd.c ipmi_sdr_read_record has a file descriptor leak
|
||||||
|
- ID:347 - Incorrect reserved channel number
|
||||||
|
- ID:348 - Add support for the "System Firmware Version"
|
||||||
|
- ID:349 - user set password - add option to choose 16/20 byte password
|
||||||
|
- ID:354 - Replace obsolete u_int with uint32_t in dimm_spd.c
|
||||||
|
- ID:354 - Replace obsolete u_int[0-9]+_t with standardized types in Free
|
||||||
|
iface
|
||||||
|
- ID:354 - forcefully switch to C99 and more strict CFLAGS
|
||||||
|
- ID:354 - replace/drop caddr_t in IMB
|
||||||
|
- ID:354 - struct member h_addr has been replaced
|
||||||
|
- ID:354 - uint8_t >= 0 is always true, don't test it
|
||||||
|
- ID:355 - Fix Enumeration value not handled in ipmi_get_event_desc()
|
||||||
|
- ID:355 - Fix ``ISO C forbids omitting the middle term of a ?: expression''
|
||||||
|
- ID:355 - Fix ``obsolete use of designated initializer with ¿:¿'' warning
|
||||||
|
- ID:355 - Fix comparison of unsigned expression
|
||||||
|
- ID:355 - Fix compiler warnings
|
||||||
|
- ID:355 - Fix compiler warnings in dimm_spd.c
|
||||||
|
- ID:355 - Fix couple compiler warnings in ipmi_lanp.h
|
||||||
|
- ID:355 - Fix formatting warning in get_cmdline_ipaddr()
|
||||||
|
- ID:355 - Fix zero-length format string warning in
|
||||||
|
get_supermicro_evt_desc()
|
||||||
|
- ID:355 - Remove defined but unused variable in _set_command_enables()
|
||||||
|
- ID:355 - remove unused variables from ipmi_dcmi.c
|
||||||
|
- ID:357 - out-of-bound access in DDR4 code ID:356 - DIMM4 Die Count is
|
||||||
|
unreachable
|
||||||
|
- ID:357 - out-of-bound access in DDR4 code
|
||||||
|
- ID:358 - check data length in else branch of ipmi_spd_print()
|
||||||
|
- ID:361 - Add a OEM IANA information
|
||||||
|
- ID:363 - Node Manager feature patch.
|
||||||
|
- ID:363 - fix Coverity issues in NM implementation
|
||||||
|
- ID:364 - Fix for serial-basic interface bridging
|
||||||
|
- ID:365 - Fix for ipmitool crash when using serial-terminal interface
|
||||||
|
- ID:366 - Properly clean LAN and LAN+ interfaces on close
|
||||||
|
- ID:367 - Fix building of non-bridged LAN interface commands
|
||||||
|
- ID:368 - Fix handling of bridging-related parameters
|
||||||
|
- ID:369 - Fix lanplus interface bridging and response matching
|
||||||
|
- ID:370 - add anonymous union support in CFLAGS for older gcc
|
||||||
|
- ID:371 - add ericsson oem
|
||||||
|
- ID:373 - Fix compilation of IMB on Windows
|
||||||
|
- ID:374 - Check/set LED Duration correctly
|
||||||
|
- ID:376 - Add means to configure "Bad Password Threshold"
|
||||||
|
- ID:381 - Script to log installation status as SEL events
|
||||||
|
- ID:382 - Fix memcpy() params in HpmFwupgActionUploadFirmware()
|
||||||
|
- ID:383 - Fix compile-time error in src/plugins/lan/lan.c
|
||||||
|
- ID:384 - Fix compilation under cygwin64
|
||||||
|
- ID:388 - Fix Error message always printed if BMC does not support VITA
|
||||||
|
- ID:388 - Handle ccode 0xCC as well in VITA discovery
|
||||||
|
- ID:388 - Turn all messages into LOG_INFO in VITA discovery
|
||||||
|
- ID:389 - Add on of Advantech IANA number
|
||||||
|
- ID:390 - Support for new Communication Interface (USB Medium)
|
||||||
|
- ID:391 - changing data_len from 17 to 16 according to ipmi spec 22.29,
|
||||||
|
first byte is completion code
|
||||||
|
- ID:392 - _ipmi_get_user_name() work-around for some BMCs
|
||||||
|
- ID:393 - ipmitool man page addition for Node Manager support.
|
||||||
|
- ID:394 - close fp if isn't NULL and set it NULL afterwards in USB plugin
|
||||||
|
- ID:394 - plugins/usb: Fix probe for SCSI devices
|
||||||
|
- ID:395 - Fix fru string without resizing it
|
||||||
|
- ID:396 - Fixed invalid length check in picmg led cap command.
|
||||||
|
- ID:397 - Fixed picmg policy set command.
|
||||||
|
- ID:398 - Fixed channel setaccess command.
|
||||||
|
- ID:399 - Fixed channel getciphers command.
|
||||||
|
- ID:401 - Fixed 30 second delay when activating SOL on 'dumb' Intel MACs.
|
||||||
|
- ID:402 - Misguiding error print-out when using some 'lan' commands.
|
||||||
|
- Init user_access_t struct in ipmi_user_priv()
|
||||||
|
- Make user User Privilege Limit is within range
|
||||||
|
- Node Manager Feature, correct 1268194 missing break.
|
||||||
|
- Output pidfile only in verbose mode
|
||||||
|
- Print error message to STDERR in ipmi_channel.c
|
||||||
|
- Re-work 'channel getaccess' and 'channel setaccess'
|
||||||
|
- Re-work ccode eval in ipmi_get_channel_medium()
|
||||||
|
- Remove commented-out code in ipmi_picmg_clk_set() - CID#1261339
|
||||||
|
- Remove dead code - rsp can't be NULL at this point - CID#1149005
|
||||||
|
- Remove dead code in fru_area_print_board() - CID#1149001
|
||||||
|
- Remove dead code in fru_area_print_chassis() - CID#1149000
|
||||||
|
- Remove dead code in fru_area_print_product() - CID#1148999
|
||||||
|
- Remove dead(duplicate) code from ipmi_sol_main() - CID#1148996
|
||||||
|
- Remove get_channel_access_rsp and get_channel_info_rsp structs
|
||||||
|
- Remove ipmi_user_set_password()
|
||||||
|
- Remove length checks in get_supermicro_evt_desc()
|
||||||
|
- Remove redundant user-input conversion from ipmi_sel_delete()
|
||||||
|
- Remove trailing white-spaces in ipmi_user.c
|
||||||
|
- Remove trailing white-spaces in ipmi_user.c
|
||||||
|
- Remove trailing white-spaces in src/plugins/dummy/dummy.c
|
||||||
|
- Remove unused variable from ipmi_get_channel_cipher_suites()
|
||||||
|
- Replace deprecated bzero() with memset()
|
||||||
|
- Replace s6_addr16 with s6_addr since Mac OS X does not have it
|
||||||
|
- Rewrite ipmi_set_channel_access()
|
||||||
|
- Split ipmi_user_main() into smaller functions
|
||||||
|
- ipmi_print_user_summary() to utilize _ipmi_get_user_access()
|
||||||
|
- ipmitool delloem: ipmitool delloem extension always return success - fix
|
||||||
|
it
|
||||||
|
|
||||||
|
* Mon Nov 24 2014 <gilles.buloz@kontron.com> 1.8.15-1
|
||||||
|
- ID: 340 - ipmitool sol session improperly closes on packet retry
|
||||||
|
- ID: 277 - support for hostnames longer than 64 chars
|
||||||
|
- ID: 313 - ipmitool doesn't support hostname long than 64 symbols
|
||||||
|
- ID: 277 - Minor issue with ipmi_intf_session_set_hostname()
|
||||||
|
- ID: 247 - 'sensor thresh' help output is wrong
|
||||||
|
- ID: 324 - conflicting declaration write_fru_area()
|
||||||
|
- ID: 337 - Add support for 13G Dell PowerEdge
|
||||||
|
- ID: 325 - DDR4 DIMM Decoding Logic
|
||||||
|
- ID: 328 - HPM.2 fixes
|
||||||
|
- ID: 329 - hpm.1 upgrade fixes
|
||||||
|
- ID: 103 - picmg discover messages should be DEBUG, not INFO
|
||||||
|
- ID: 331 - Passwords provided in file (-f option) truncated on space
|
||||||
|
- ID: 318 - ipmi_tsol.c: fix buffer overflow
|
||||||
|
- ID: 306 - "fru print" command prints the FRU #0 twice
|
||||||
|
- ID: 305 - HPM.1 deferred activation support fixup
|
||||||
|
- ID: 317 - ipmi_fwum.c: fix typo
|
||||||
|
- ID: 315 - buildsystem: configure.in is deprecated
|
||||||
|
- ID: 316 - Directory debian is outdated
|
||||||
|
- ID: 103 - 'lib/ipmi_ekanalyzer.c' needs a re-work
|
||||||
|
- ID: 46 - SEL OEM record corner case
|
||||||
|
|
||||||
|
* Mon May 5 2014 <gilles.buloz@kontron.com> 1.8.14-1
|
||||||
|
- 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
|
||||||
|
|
||||||
|
* Mon Sep 9 2013 <gilles.buloz@kontron.com> 1.8.13-1
|
||||||
|
- 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
|
||||||
|
|
||||||
|
|
||||||
|
* Thu Aug 9 2012 <gilles.buloz@kontron.com> 1.8.12-1
|
||||||
|
- Added IPMB dual bridge support (no need for driver support)
|
||||||
|
- Enable compiler warnings and resolve all compiler warning so that
|
||||||
|
ipmitool compiles and links with no warning or error messages
|
||||||
|
- add ipmishell line to configure
|
||||||
|
- fail configure when no curses or readline is found
|
||||||
|
- support sensor bridging in free interface
|
||||||
|
- applied fix for issue #2865160 (AIX build)
|
||||||
|
- Document the ipmitool dcmi commands in the ipmitool man page
|
||||||
|
- Document that some commands are blocked by OpenIPMI. ID 2962306
|
||||||
|
- Document the -N and -R options per tracker ID 3489643
|
||||||
|
- fix manpage misdocumentation on cipher suite privilige configuration
|
||||||
|
- Add build support for Dell OEM commands
|
||||||
|
- Add new Dell OEM commands and update man page
|
||||||
|
- added hpm and fwum in man page
|
||||||
|
- man page update for fwum and hpm commands
|
||||||
|
- Added documentation for 'ime' operating mode, used to update Intel ME.
|
||||||
|
- add new -Y option to prompt user to enter kgkey
|
||||||
|
- Add DCMI module (Data Center Management Interface)
|
||||||
|
- fixed oem/iana data type to allow 24 bits definition
|
||||||
|
- Fixed AMC point-to-point record parsing in FRU
|
||||||
|
- Fixed detection of packing support in GCC
|
||||||
|
- Added packing support detection magic on all packed structures
|
||||||
|
in project
|
||||||
|
- Dell specific mac sub command is updated to support the latest 12G
|
||||||
|
Dell servers. Support for virtual mac is also implemented.
|
||||||
|
- Use consistent netfn/cmd for getsysinfo command
|
||||||
|
- Add Dell OEM network commands
|
||||||
|
- Resolve incorect Board Mfg Data due to incorrect date constant
|
||||||
|
- Update ipmi_fru.h to SMBIOS spec 2.6.1 - ID 2916398
|
||||||
|
- Support for analog readings in discrete sensors on HP platforms.
|
||||||
|
- Change device id mask (IPM_DEV_DEVICE_ID_REV_MASK) 0x07 for 0x0F.
|
||||||
|
As per in IPMI spec V2:
|
||||||
|
- Added PICMG clock e-keying and bused resource control identifiers
|
||||||
|
- Added PICMG major version (ATCA/AMC/uTCA) identifiers
|
||||||
|
- Correct Threshold/Discrete Sensor Display - Patch Tracker ID 3508759
|
||||||
|
- Sensor units now handle percentage units - ID 3014014
|
||||||
|
- Fixes ID 3421347 Sensor list command should use channel field from SDR
|
||||||
|
- Added packing directive for ARM cross compile with GCC 3.4.5,
|
||||||
|
otherwise the sdr structures gets padded and the pointer cast
|
||||||
|
result in incorrect alignement
|
||||||
|
- Added 'sdr fill sensors nosats' support to speed up SDR discovery
|
||||||
|
- Added SDR name display during discovery (with -v)
|
||||||
|
- Added support for sensor types - Processor related sensor
|
||||||
|
type 0x07, system incharectorization 0x20, Memory sensor type.
|
||||||
|
- Give more description for SEL which is generated for Uncorrectable
|
||||||
|
ECC and errors with respect to each Memory Bank,Card or DIMM.
|
||||||
|
The Sensor type supporting this are 0x0C and 0x10.
|
||||||
|
- Add more details about Version Change event (source of
|
||||||
|
firmware update)
|
||||||
|
- enhanced PICMG fru control
|
||||||
|
- Integrated Andy Wray's DDR3 SPD parser patch
|
||||||
|
- Adds function str2uint() to convert from string to uint32_t with
|
||||||
|
checks for valid input.
|
||||||
|
- Fix possible buffer overflow in buf2str()
|
||||||
|
- Fixes ID 3485004 - misuse of strtol()
|
||||||
|
- Replaces calls to strtol() with str2uchar() calls and adds error
|
||||||
|
messages if invalid input is given.
|
||||||
|
- Don't overwite the iflags bits prior to setting the boot parameters.
|
||||||
|
This fixes ipmitool so that
|
||||||
|
chassis bootdev bios clear-cmos=yes
|
||||||
|
will correctly clear the bios cmos.
|
||||||
|
- Clarify DCMI get limit activation (add if activate or not).
|
||||||
|
- Bug fixes for delloem lan command. This includes the support for 12G
|
||||||
|
Dell license and 12G LAN Specific command.
|
||||||
|
- delloem commands should not be executed before parsing command line.
|
||||||
|
- Fix stack overflow in delloem setled
|
||||||
|
- Fix delloem powermonitor on big-endian platforms.
|
||||||
|
- ipmitool delloem powermonitor command should convert data from
|
||||||
|
network-format to the native one, otherwise it shows garbage
|
||||||
|
on ppc/ppc64 platform.
|
||||||
|
- Add ipmi_getsysinfo command
|
||||||
|
- Add support for drive backplane SetLED functionality
|
||||||
|
- Fix for Platform Event Message incorrect Generator ID
|
||||||
|
- Fix fru print so that it will display FRU info from satellite
|
||||||
|
controllers.
|
||||||
|
- Add support for AMC type 17h record.
|
||||||
|
- Fix in fru edit. It is now possible to edit field 0 of sections
|
||||||
|
- New FRU get OEM record command
|
||||||
|
- fixed segfault for fru edit when "field id" is not supported and
|
||||||
|
added user feedback for string substitution(success or failure)
|
||||||
|
- Improvement to hpm upgrade during activation. This resolves issue
|
||||||
|
where activation seems to have failed because ipmitool received
|
||||||
|
an unsupported completion code.
|
||||||
|
- hpm Fixes for multi-platform support.
|
||||||
|
- hpm Fix for timeouts during firmware rollback. If completion code
|
||||||
|
is C3, wait till timeout has expired before reporting it.
|
||||||
|
- hpm During manual rollback, code now gets target capabilities
|
||||||
|
instead of using a default timeout of 60 seconds.
|
||||||
|
- Added firmware auxilliary bytes to hpm outputs
|
||||||
|
- hpm Add support for BIG Buffer (Use when -z option is used)
|
||||||
|
- Fix the case where ipmitool loses the iol connection during the upload
|
||||||
|
block process. Once IPMITool was successfully sent the first
|
||||||
|
byte, IPMITool will not resize the block size.
|
||||||
|
- Fix the problem when we try to upgrade specific component and the
|
||||||
|
component is already updated,
|
||||||
|
- updated HPM firmware agent to version 1.04
|
||||||
|
- Fix exit code to return zero on '-o list' or '-o help' option
|
||||||
|
- limit length of user name and password that can be supplied by user.
|
||||||
|
Password is limited to 16 bytes, resp. 20 bytes, for LAN, resp.
|
||||||
|
LAN+, interface. User name is limited to 16 bytes, no interface
|
||||||
|
limitations. ID 3184687, ID 3001519
|
||||||
|
- Add retry / timeout options for LAN
|
||||||
|
- Changed default cipher suite to 1 instead of 3 for iol20
|
||||||
|
- added fix for tracker ID 2849300 "Incorrect Firmware Revision"
|
||||||
|
- avoid reopening the interface when already opened
|
||||||
|
- Remove message for unsupported PEF capabilities that return valid
|
||||||
|
CC (80h)
|
||||||
|
- Added OEM byte (47) to verbose output
|
||||||
|
- Add option to provide a list when filling sdr repository
|
||||||
|
- SDR discovery speedups
|
||||||
|
- Added support for Dell specific sensors
|
||||||
|
- Fix segmentation fault on unrecognize OEM events.
|
||||||
|
- changed SEL timestamp formatting for 'preinit' SEL entries, allowing
|
||||||
|
the number of seconds to be displayed.
|
||||||
|
- Added sensor raw data in verbose mode. Useful for OEM sensor type.
|
||||||
|
- Add sensor hysteresis (positive & negative) to the following command
|
||||||
|
ipmitool sensor -v
|
||||||
|
- Fixes bug ID 3484936 - missing user input validation
|
||||||
|
- Add missing RMCP+ auth type strings
|
||||||
|
- Add new Kontron Product in ipmi_strings for product ID. Kontron
|
||||||
|
KTC5520/EATX Server Motherboard with integrated iBMC/KVM/VM
|
||||||
|
added identification support for Kontron AT8050 ATCA board
|
||||||
|
- Constrain setting of the username to no greater than 16 characters
|
||||||
|
per the IPMI specification. ID 3001519
|
||||||
|
- Constrain User ID between 1 and 63. ID 3519225
|
||||||
|
- Fixes ID 3485340 - user input not handled in 'lib/ipmi_user.c'
|
||||||
|
- Fixes ignorance of existing daemon PID file which results in PID being
|
||||||
|
overwritten. Adds proper umask() before writing PID file.
|
||||||
|
- applied fix for ID 2865111 (AIX build)
|
||||||
|
- Fix a proplem when using bridged IPMI commands on the lanplus
|
||||||
|
interface (-I lanplus with -b -t or -m switches) resulting in
|
||||||
|
"Close Session command failure".
|
||||||
|
- Add fix with usage of CFh (duplicate request). Usefull for
|
||||||
|
slow commands
|
||||||
|
- Fix issue with sequence number. (Speed up transfer)
|
||||||
|
|
||||||
* Wed Feb 25 2009 <pere@hungry.com> 1.8.11-1
|
* Wed Feb 25 2009 <pere@hungry.com> 1.8.11-1
|
||||||
- Fix new GCC compilation issues in regards to Packing
|
- Fix new GCC compilation issues in regards to Packing
|
||||||
- Fix Tracker bug #1642710 - ipmi_kcs_drv being loaded/unloaded
|
- Fix Tracker bug #1642710 - ipmi_kcs_drv being loaded/unloaded
|
||||||
@ -257,7 +881,7 @@ fi
|
|||||||
- Make ipmievd generate pidfile
|
- Make ipmievd generate pidfile
|
||||||
- Add initscripts for ipmievd
|
- Add initscripts for ipmievd
|
||||||
|
|
||||||
* Mon Jan 17 2006 <duncan@iceblink.org> 1.8.6-1
|
* Tue Jan 17 2006 <duncan@iceblink.org> 1.8.6-1
|
||||||
- Fix memory corruption when sending encrypted SOL traffic
|
- Fix memory corruption when sending encrypted SOL traffic
|
||||||
- Add keepalive timer to IPMIv2 SOL sessions
|
- Add keepalive timer to IPMIv2 SOL sessions
|
||||||
|
|
||||||
@ -325,7 +949,7 @@ fi
|
|||||||
- new "shell" and "exec" commands
|
- new "shell" and "exec" commands
|
||||||
- lots of other contributed patches
|
- lots of other contributed patches
|
||||||
|
|
||||||
* Sat May 27 2004 <duncan@iceblink.org> 1.5.9-1
|
* Thu May 27 2004 <duncan@iceblink.org> 1.5.9-1
|
||||||
- Add ability to get a particular sensor by name
|
- Add ability to get a particular sensor by name
|
||||||
- Add ability to set a particular sensor threshold
|
- Add ability to set a particular sensor threshold
|
||||||
- Add support for displaying V2 channel authentication levels
|
- Add support for displaying V2 channel authentication levels
|
||||||
@ -359,7 +983,7 @@ fi
|
|||||||
- Fix SEL event decoding for generic events
|
- Fix SEL event decoding for generic events
|
||||||
- Handle empty SEL gracefully when doing "sel list"
|
- Handle empty SEL gracefully when doing "sel list"
|
||||||
- Fix sdr handling of sensors that do not return a reading
|
- Fix sdr handling of sensors that do not return a reading
|
||||||
- Fix for CSV display of sensor readings/units from Fredrik Öhrn
|
- Fix for CSV display of sensor readings/units from Fredrik Öhrn
|
||||||
|
|
||||||
* Tue Nov 25 2003 <duncan@iceblink.org> 1.5.5-1
|
* Tue Nov 25 2003 <duncan@iceblink.org> 1.5.5-1
|
||||||
- Add -U option for setting LAN username
|
- Add -U option for setting LAN username
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
%_topdir %(echo $BUILDDIR)
|
|
||||||
%_sourcedir %{_topdir}/..
|
|
||||||
%_specdir %{_sourcedir}
|
|
||||||
%_tmppath %{_topdir}/tmp
|
|
||||||
%_builddir %{_topdir}/BUILD
|
|
||||||
%_buildroot %{_topdir}/%{_tmppath}/%{name}-%{version}-root
|
|
||||||
%_rpmdir %{_topdir}/RPMS
|
|
||||||
%_srcrpmdir %{_topdir}/SRPMS
|
|
||||||
%_distro @DISTRO@
|
|
||||||
%_rpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm
|
|
||||||
%packager jmank@hp.com
|
|
||||||
%distribution Sourceforge Build
|
|
@ -1,8 +0,0 @@
|
|||||||
macrofiles: /usr/lib/rpm/macros:/usr/lib/rpm/%{_target}/macros:/etc/rpm/macros.specspo:/etc/rpm/macros:/etc/rpm/%{_target}/macros:%(echo $CONFIGDIR)/rpmmacros
|
|
||||||
|
|
||||||
buildarchtranslate: athlon: i386
|
|
||||||
buildarchtranslate: i686: i386
|
|
||||||
buildarchtranslate: i586: i386
|
|
||||||
buildarchtranslate: i486: i386
|
|
||||||
buildarchtranslate: i386: i386
|
|
||||||
|
|
10
csv-revision
Executable file
10
csv-revision
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
git describe --first-parent --tags 2>/dev/null | (
|
||||||
|
IFS=- read tag rev hash
|
||||||
|
if [ $? ] && [ -n "$rev" ]; then
|
||||||
|
echo .$rev.$hash
|
||||||
|
elif [ -d .git ]; then
|
||||||
|
echo .0.gsnapshot
|
||||||
|
fi
|
||||||
|
)
|
5
debian/README.Debian
vendored
5
debian/README.Debian
vendored
@ -1,5 +0,0 @@
|
|||||||
For more information about setting up your Debian system with IPMI
|
|
||||||
please see the excellent howto by Tim Small:
|
|
||||||
|
|
||||||
http://buttersideup.com/docs/howto/IPMI_on_Debian.html
|
|
||||||
|
|
324
debian/changelog
vendored
324
debian/changelog
vendored
@ -1,324 +0,0 @@
|
|||||||
version (1.8.11) unstable; urgency=low
|
|
||||||
* Fix new GCC compilation issues in regards to Packing
|
|
||||||
* Fix Tracker bug #1642710 - ipmi_kcs_drv being loaded/unloaded
|
|
||||||
for 2.4 kernel instead of ipmi_si_drv driver module
|
|
||||||
* New -y option added to allow specification of kg keys with
|
|
||||||
non-printable characters
|
|
||||||
* New -K option added to allow kgkey settings via environmental
|
|
||||||
variable IPMI_KGKEY
|
|
||||||
* Generic device support added for EEPROM with SDR Type 10h (gendev)
|
|
||||||
* Fix to lan-bridging for a double-bridging crash and to fix
|
|
||||||
an issue with bridging multiple concurrent requests and
|
|
||||||
erroneous handling of raw Send Message
|
|
||||||
* Lanplus fix for commands like 'sensor list' without the -t option
|
|
||||||
causing wrong double bridged requests of a sensor is located
|
|
||||||
on another satellite controller
|
|
||||||
* Fix lan and lanplus request list entry removal bugs
|
|
||||||
* Fix non-working issue when trying to send a bridge message with
|
|
||||||
Cipher 3
|
|
||||||
* Change bridge message handling to reuse command ipmi_lan_poll_recv
|
|
||||||
* Added PICMG 2.0 and 2.3 support
|
|
||||||
* Fix PICMG (ATCA) extension verification and reversal of BCD encoded
|
|
||||||
values for "major" and "minor" fields
|
|
||||||
* Add IANA support for Pigeon Point
|
|
||||||
* Add OEM SW/FW Record identification
|
|
||||||
* Fix to include I2C and LUN addresses so sensors are correctly managed
|
|
||||||
* Patch ID 1990560 to get readings from non-linear analog sensors
|
|
||||||
* Add support for SOL payload status command
|
|
||||||
* SOL set parameter range checking added
|
|
||||||
* Fixed SOL activate options usage
|
|
||||||
* Fixed crashes when parsing 'sol payload' and 'tsol' cmds (#216967)
|
|
||||||
* Added retries to SOL keepalive
|
|
||||||
* Fixed wrong mask values for Front Panel disable/enable status
|
|
||||||
* Add support to access fru internal use area
|
|
||||||
* Add support for new PICMG 3.0 R3.0 (March 24, 2008) to allow
|
|
||||||
blocks of data within the FRU storage area to be write
|
|
||||||
protected.
|
|
||||||
* Fix node reporting in GUID; Tracker bug #2339675
|
|
||||||
* Fix watchdog use/action print strings
|
|
||||||
* Fix endian bug in SDR add from file; Tracker bug #2075258
|
|
||||||
* Fix crash when dumping SDRs in a file and there's an error
|
|
||||||
getting an SDR; improve algorithm for optimal packet size
|
|
||||||
* Fix occasional SDR dump segfault; #1793076
|
|
||||||
* Allow ipmitool sel delete to accept hex list entry numbers
|
|
||||||
* Fix SEL total space reporting.
|
|
||||||
* Fix for garbage sensor threshold values reported when none
|
|
||||||
returned. Tracker Bug #863748
|
|
||||||
* ipmievd change to Monitor %used in SEL buffer and log warnings when
|
|
||||||
the buffer is 80% and 100% full
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Wed, 25 Feb 2009 09:44:31 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.10) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream version.
|
|
||||||
* Patch to allow Debian package builds from cvs.
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Fri, 8 Aug 2008 09:44:31 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.7-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix typo in init.d/ipmievd. (Closes: #361309)
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sat, 8 Apr 2006 06:44:31 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.7-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream version.
|
|
||||||
- Dropped nuclear clause from the copyright. Updated debian/copyright
|
|
||||||
to reflect this.
|
|
||||||
- ipmievd now store pid in /var/run/ipmievd.pid. Adjust init.d
|
|
||||||
script to use it.
|
|
||||||
* Rename /etc/default/ipmievd variable IPMIEVD_OPTS is renamed to
|
|
||||||
IPMIEVD_OPTIONS to stay compatible with upstream and other
|
|
||||||
distributions. Add backwards compatibility code with a warning to
|
|
||||||
the users of the old variable.
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sun, 26 Mar 2006 21:11:08 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.6-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add ia64 as an supported arch. (Closes: #355930)
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Fri, 10 Mar 2006 23:34:50 +0100
|
|
||||||
|
|
||||||
ipmitool (1.8.6-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream version.
|
|
||||||
- Avoid crashing when setting lan IP address. (Closes: #351205)
|
|
||||||
* Avoid changing history by reverding upstream change
|
|
||||||
to email addresses in debian/changelog.
|
|
||||||
* Correct typo in control file: Suggest -> Suggests. Thanks
|
|
||||||
to Philipp Matthias Hahn for the report.
|
|
||||||
* Add init.d/ipmievd script. Based on script from Elmar Hoffmann,
|
|
||||||
slightly modified to use lsb-base functions. Added dependency on
|
|
||||||
lsb-base. (Closes: #345994)
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sun, 26 Feb 2006 10:31:14 +0100
|
|
||||||
|
|
||||||
ipmitool (1.8.2-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add build-dependency on 'libreadline5-dev | libreadline-dev' to make
|
|
||||||
sure all archs get readline support. (Closes: #326341)
|
|
||||||
* Add build-dependency on libssl-dev to enable SSL support on
|
|
||||||
all archs.
|
|
||||||
* Updated Standards-Version to 3.6.2.1. (No updates required)
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sat, 3 Sep 2005 19:18:51 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.2-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
- Fix FRU reading for large (>255 bytes) areas.
|
|
||||||
- Overhaul to ipmievd to support SEL polling in addition to OpenIPMI.
|
|
||||||
- Fix LAN parameter segfault when no Ciphers supported by
|
|
||||||
BMC. (Closes: #306806)
|
|
||||||
- Fix IPMIv2 support on Intel v2 BMCs (use -o intelplus).
|
|
||||||
- Separate option parsing code from main ipmitool source file.
|
|
||||||
- Add raw I2C support with IPMI Master Read-Write command.
|
|
||||||
- Add support for new 'sdr elist' extended output format.
|
|
||||||
- Add support for listing sensors by type with 'sdr type' command.
|
|
||||||
- Add support for new 'sel elist' extended output format that
|
|
||||||
cross-references events with sensors.
|
|
||||||
- Add support for sending dynamically generated platform events
|
|
||||||
based on existing sensor information.
|
|
||||||
- New '-S' argument to read local SDR cache created with 'sdr dump'.
|
|
||||||
- Updated manpage for ipmitool and ipmievd. (Closes: #306894)
|
|
||||||
* Correct the upstream URL in debian/changelog to the current one.
|
|
||||||
* Suggest package openipmi. (Closes: #305629)
|
|
||||||
* Add debian/watch file to detect new source versions.
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sun, 5 Jun 2005 10:29:18 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
* Install ipmievd into /usr/sbin/.
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Thu, 7 Apr 2005 01:18:44 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.0-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial upload into Debian, based on the upstream build
|
|
||||||
rules. (Closes: #299924)
|
|
||||||
* Convert debian/changelog to UTF-8.
|
|
||||||
* Change section from 'contrib' to 'utils'.
|
|
||||||
* Build-depend on debhelper (>> 4.0.0) to match the rules file.
|
|
||||||
* Set Standards-version to 3.6.1.
|
|
||||||
* Make sure binary dependency is properly generated.
|
|
||||||
* Add long description, copied from the project README.
|
|
||||||
* Drop useless provides 'ipmitool', as the package is called 'ipmitool'.
|
|
||||||
* Don't install the COPYING file, as the license text already is
|
|
||||||
included in debian/copyright.
|
|
||||||
* Remove unused parts of the rules file.
|
|
||||||
* Correct clean target in rules file, to use 'distclean' and remove
|
|
||||||
configure-stamp not bogus config-stamp.
|
|
||||||
|
|
||||||
-- Petter Reinholdtsen <pere@debian.org> Sun, 3 Apr 2005 20:52:02 +0200
|
|
||||||
|
|
||||||
ipmitool (1.8.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix IPMIv2.0 issues
|
|
||||||
* Fix chassis boot parameter support
|
|
||||||
* Add support for linear sensors
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Wed, Mar 16 2005 17:08:12 -0700
|
|
||||||
|
|
||||||
ipmitool (1.7.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Update bmc plugin to work with new Solaris bmc driver (new ioctl
|
|
||||||
for interface detection and new STREAMS message-based interface).
|
|
||||||
|
|
||||||
-- Seth Goldberg <sethmeisterg@hotmail.com> Mon, Mar 7 2005 18:03:00 -0800
|
|
||||||
|
|
||||||
ipmitool (1.7.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* Propogate errors correctly so exit status will be useful
|
|
||||||
* More consistent display of errors including completion code text
|
|
||||||
* Errors and debug is send to stderr now
|
|
||||||
* New "sel get" command that will print details about SEL entry
|
|
||||||
and corresponding SDR records as well as FRUs via entity association
|
|
||||||
* Improved event generator, now supports reading events from text file
|
|
||||||
* New "-o oemtype" option for specifying OEM boards
|
|
||||||
exsting types are "supermicro" and "intelwv2"
|
|
||||||
* New PEF subsystem
|
|
||||||
* New "bmc" plugin for Solaris 10 x86
|
|
||||||
* Many bugfixes and contributed patches
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Fri, Jan 7 2005 19:58:22 -0700
|
|
||||||
|
|
||||||
ipmitool (1.6.2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Support for Supermicro BMC OEM authentication method
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Mon, 16 Nov 2004 08:20:01 -0700
|
|
||||||
|
|
||||||
ipmitool (1.6.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix minor problem with LAN parameter setting
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Wed, 29 Sep 2004 11:19:17 -0700
|
|
||||||
|
|
||||||
ipmitool (1.6.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add a README
|
|
||||||
* Add support for IPMIv2 and Serial-over-LAN from Newisys
|
|
||||||
* Add Solaris x86 lipmi interface
|
|
||||||
* Add support for building Solaris packages
|
|
||||||
* Add support for building RPMs as non-root user
|
|
||||||
* Fix segfault when doing "sel list" (from Matthew Braithwaite)
|
|
||||||
* Fix "chassis identify" on some BMCs (from ebrower@sourceforge)
|
|
||||||
* Add "bmc info" and related output (from ebrower@sourceforge)
|
|
||||||
* new "shell" and "exec" commands
|
|
||||||
* lots of other contributed patches
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Thu, 9 Sep 2004 21:39:37 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.9) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add ability to get a particular sensor by name
|
|
||||||
* Add ability to set a particular sensor threshold
|
|
||||||
* Add support for displaying V2 channel authentication levels
|
|
||||||
* Add README for rrdtool scripts in contrib directory
|
|
||||||
* Improve lan interface retry handling
|
|
||||||
* Support prompting for password or reading from environment
|
|
||||||
* Move chaninfo command into channel subcommand
|
|
||||||
* Fix reservation ID handling when two sessions open to BMC
|
|
||||||
* Fix reading of large FRU data
|
|
||||||
* Add configure option for changing binary to ipmiadm for Solaris
|
|
||||||
* Fix compile problem on Solaris 8
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Sat, 27 Mar 2004 00:11:37 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.8) unstable; urgency=low
|
|
||||||
|
|
||||||
* Enable static compilation of interfaces
|
|
||||||
* Fix types to be 64-bit safe
|
|
||||||
* Fix compilation problems on Solaris
|
|
||||||
* Fix multiple big-endian problems for Solaris/SPARC
|
|
||||||
* Fix channel access to save settings to NVRAM
|
|
||||||
* Set channel privilege limit to ADMIN during "access on"
|
|
||||||
* Enable gratuitous ARP in bmcautoconf.sh
|
|
||||||
* Add support for Linux kernel panic messages in SEL output
|
|
||||||
* Add support for type 3 SDR records
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Tue, 27 Jan 2004 16:23:25 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.7) unstable; urgency=low
|
|
||||||
|
|
||||||
* add IPMIv1.5 eratta fixes
|
|
||||||
* additions to FRU printing and FRU multirecords
|
|
||||||
* better handling of SDR printing
|
|
||||||
* contrib scripts for creating rrdtool graphs
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Mon, 5 Jan 2004 17:29:50 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.6) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fix SEL event decoding for generic events
|
|
||||||
* Handle empty SEL gracefully when doing "sel list"
|
|
||||||
* Fix sdr handling of sensors that do not return a reading
|
|
||||||
* Fix for CSV display of sensor readings/units from Fredrik Öhrn
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Thu, 4 Dec 2003 14:47:19 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.5) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add -U option for setting LAN username
|
|
||||||
* Fix -v usage for plugin interfaces
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Tue, 25 Nov 2003 15:10:48 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.4) unstable; urgency=low
|
|
||||||
|
|
||||||
* Put interface plugin API into library
|
|
||||||
* Fix ipmievd
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Fri, 14 Nov 2003 15:16:34 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.3) unstable; urgency=low
|
|
||||||
|
|
||||||
* Add -g option to work with grizzly bmc
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Mon, 3 Nov 2003 18:04:07 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.2) unstable; urgency=low
|
|
||||||
|
|
||||||
* add support for setting gratuitous arp interval
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Fri, 24 Oct 2003 11:00:00 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.1) unstable; urgency=low
|
|
||||||
|
|
||||||
* better SEL support
|
|
||||||
* fix display bug in SDR list
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Wed, 8 Oct 2003 17:28:51 -0700
|
|
||||||
|
|
||||||
ipmitool (1.5.0) unstable; urgency=low
|
|
||||||
|
|
||||||
* more robust UDP packet handling
|
|
||||||
* add Intel IMB driver support
|
|
||||||
* use autoconf/automake/libtool
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Fri, 5 Sep 2003 11:57:32 -0700
|
|
||||||
|
|
||||||
ipmitool (1.2-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New command line option parsing
|
|
||||||
* More chassis commands supported
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Wed, 2 Apr 2003 17:44:17 -0700
|
|
||||||
|
|
||||||
ipmitool (1.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Minor fixes.
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Tue, 1 Apr 2003 14:31:10 -0700
|
|
||||||
|
|
||||||
ipmitool (1.0-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial Release.
|
|
||||||
|
|
||||||
-- Duncan Laurie <duncan@iceblink.org> Sun, 30 Mar 2003 21:30:46 -0700
|
|
||||||
|
|
28
debian/control
vendored
28
debian/control
vendored
@ -1,28 +0,0 @@
|
|||||||
Source: ipmitool
|
|
||||||
Section: utils
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Petter Reinholdtsen <pere@debian.org>
|
|
||||||
Uploaders: Duncan Laurie <duncan@iceblink.org>
|
|
||||||
Build-Depends: debhelper (>> 4.0.0), libreadline5-dev | libreadline-dev, libssl-dev, autoconf, automake1.9 | automake, autotools-dev, libtool
|
|
||||||
Standards-Version: 3.6.2.1
|
|
||||||
|
|
||||||
Package: ipmitool
|
|
||||||
Architecture: i386 amd64 ia64
|
|
||||||
Depends: ${shlibs:Depends}, lsb-base
|
|
||||||
Suggests: openipmi
|
|
||||||
Description: utility for IPMI control with kernel driver or LAN interface
|
|
||||||
A utility for managing and configuring devices that support the
|
|
||||||
Intelligent Platform Management Interface. IPMI is an open standard
|
|
||||||
for monitoring, logging, recovery, inventory, and control of hardware
|
|
||||||
that is implemented independent of the main CPU, BIOS, and OS. The
|
|
||||||
service processor (or Baseboard Management Controller, BMC) is the
|
|
||||||
brain behind platform management and its primary purpose is to handle
|
|
||||||
the autonomous sensor monitoring and event logging features.
|
|
||||||
.
|
|
||||||
The ipmitool program provides a simple command-line interface to this
|
|
||||||
BMC. It features the ability to read the sensor data repository
|
|
||||||
(SDR) and print sensor values, display the contents of the System
|
|
||||||
Event Log (SEL), print Field Replaceable Unit (FRU) inventory
|
|
||||||
information, read and set LAN configuration parameters, and perform
|
|
||||||
remote chassis power control.
|
|
||||||
|
|
36
debian/copyright
vendored
36
debian/copyright
vendored
@ -1,36 +0,0 @@
|
|||||||
This package was debianized by Duncan Laurie before
|
|
||||||
2003-11-18 17:55:21 +0100.
|
|
||||||
|
|
||||||
It was downloaded from <URL:http://ipmitool.sourceforge.net/>
|
|
||||||
|
|
||||||
Upstream Author: Duncan Laurie <duncan@iceblink.org>
|
|
||||||
|
|
||||||
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.
|
|
4
debian/dirs
vendored
4
debian/dirs
vendored
@ -1,4 +0,0 @@
|
|||||||
usr/bin
|
|
||||||
usr/sbin
|
|
||||||
usr/share/ipmitool
|
|
||||||
usr/share/doc/ipmitool
|
|
2
debian/docs
vendored
2
debian/docs
vendored
@ -1,2 +0,0 @@
|
|||||||
README
|
|
||||||
AUTHORS
|
|
99
debian/ipmitool.ipmievd.init
vendored
99
debian/ipmitool.ipmievd.init
vendored
@ -1,99 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: ipmievd
|
|
||||||
# Required-Start: $local_fs $remote_fs $syslog
|
|
||||||
# Required-Stop: $local_fs $remote_fs $syslog
|
|
||||||
# Default-Start: 2 3 4 5
|
|
||||||
# Default-Stop: S 0 1 6
|
|
||||||
# Short-Description: IPMI event daemon
|
|
||||||
# Description: ipmievd is a daemon which will listen for events
|
|
||||||
# from the BMC that are being sent to the SEL and
|
|
||||||
# also log those messages to syslog.
|
|
||||||
### END INIT INFO
|
|
||||||
#
|
|
||||||
# Author: Elmar Hoffmann <elho@elho.net>
|
|
||||||
# Licence: This script is public domain using the same
|
|
||||||
# licence as ipmitool itself.
|
|
||||||
# Modified by: Petter Reinholdtsen
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|
||||||
DESC="IPMI event daemon"
|
|
||||||
NAME=ipmievd
|
|
||||||
DAEMON=/usr/sbin/$NAME
|
|
||||||
PIDFILE=/var/run/$NAME.pid
|
|
||||||
SCRIPTNAME=/etc/init.d/$NAME
|
|
||||||
|
|
||||||
# Gracefully exit if the package has been removed.
|
|
||||||
test -x $DAEMON || exit 0
|
|
||||||
|
|
||||||
. /lib/lsb/init-functions
|
|
||||||
. /etc/default/rcS
|
|
||||||
|
|
||||||
# Options used by ipmievd.
|
|
||||||
#
|
|
||||||
# "open" uses the asynchronous event notification from the OpenIPMI
|
|
||||||
# kernel driver, "sel" uses active polling of the contents of the SEL
|
|
||||||
# for new events.
|
|
||||||
#
|
|
||||||
# Need to force 'daemon' mode, to make sure messages are sent to
|
|
||||||
# syslog and the program forks into the background.
|
|
||||||
#
|
|
||||||
# Se ipmievd(8) for more info.
|
|
||||||
IPMIEVD_OPTIONS="open daemon"
|
|
||||||
|
|
||||||
# Read config file if it is present.
|
|
||||||
[ -f /etc/default/$NAME ] && . /etc/default/$NAME
|
|
||||||
|
|
||||||
# Backwards compatibility with version 1.8.6-2 and 1.8.6-1. The
|
|
||||||
# variable was renamed to be compatible with upstream, SuSe and RedHat.
|
|
||||||
if [ -n "$IPMIEVD_OPTS" ]; then
|
|
||||||
echo "warning: /etc/default/$NAME variable IPMIEVD_OPTS should be renamed to IPMIEVD_OPTIONS"
|
|
||||||
IPMIEVD_OPTIONS="$IPMIEVD_OPTS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
|
||||||
# Function that starts the daemon/service.
|
|
||||||
#
|
|
||||||
d_start() {
|
|
||||||
start-stop-daemon --start --quiet --exec $DAEMON -- $IPMIEVD_OPTIONS
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Function that stops the daemon/service.
|
|
||||||
#
|
|
||||||
d_stop() {
|
|
||||||
start-stop-daemon --stop --quiet --name $NAME --exec $DAEMON
|
|
||||||
}
|
|
||||||
|
|
||||||
CODE=0
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
[ "$VERBOSE" != no ] && log_begin_msg "Starting $DESC" "$NAME"
|
|
||||||
d_start || CODE=$?
|
|
||||||
[ "$VERBOSE" != no ] && log_end_msg $CODE
|
|
||||||
exit $CODE
|
|
||||||
;;
|
|
||||||
stop)
|
|
||||||
log_begin_msg "Stopping $DESC" "$NAME"
|
|
||||||
d_stop || CODE=$?
|
|
||||||
log_end_msg $CODE
|
|
||||||
exit $CODE
|
|
||||||
;;
|
|
||||||
restart|force-reload)
|
|
||||||
log_begin_msg "Restarting $DESC" "$NAME"
|
|
||||||
d_stop || true
|
|
||||||
sleep 1
|
|
||||||
d_start || CODE=$?
|
|
||||||
log_end_msg $CODE
|
|
||||||
exit $CODE
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
118
debian/rules
vendored
118
debian/rules
vendored
@ -1,118 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
export DH_COMPAT=4
|
|
||||||
export DH_OPTIONS
|
|
||||||
|
|
||||||
CFLAGS = -Wall -g
|
|
||||||
|
|
||||||
ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
|
|
||||||
CFLAGS += -O0
|
|
||||||
else
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
|
|
||||||
INSTALL_PROGRAM += -s
|
|
||||||
endif
|
|
||||||
|
|
||||||
configure: configure-stamp
|
|
||||||
configure-stamp:
|
|
||||||
dh_testdir
|
|
||||||
|
|
||||||
./bootstrap
|
|
||||||
|
|
||||||
./configure --prefix=/usr \
|
|
||||||
--with-kerneldir \
|
|
||||||
--mandir=/usr/share/man
|
|
||||||
touch configure-stamp
|
|
||||||
|
|
||||||
#Architecture
|
|
||||||
build: build-arch build-indep
|
|
||||||
|
|
||||||
build-arch: build-arch-stamp
|
|
||||||
build-arch-stamp: configure-stamp
|
|
||||||
|
|
||||||
# Add here commands to compile the arch part of the package.
|
|
||||||
$(MAKE)
|
|
||||||
|
|
||||||
build-indep: build-indep-stamp
|
|
||||||
build-indep-stamp: configure-stamp
|
|
||||||
|
|
||||||
# Add here commands to compile the indep part of the package.
|
|
||||||
#$(MAKE) doc
|
|
||||||
|
|
||||||
clean:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
rm -f build-arch-stamp build-indep-stamp configure-stamp
|
|
||||||
|
|
||||||
# Add here commands to clean up after the build process.
|
|
||||||
-$(MAKE) distclean
|
|
||||||
|
|
||||||
dh_clean
|
|
||||||
|
|
||||||
install: install-arch #install-indep
|
|
||||||
install-indep:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k -i
|
|
||||||
dh_installdirs -i
|
|
||||||
|
|
||||||
# Add here commands to install the indep part of the package into
|
|
||||||
# debian/<package>-doc.
|
|
||||||
#INSTALLDOC#
|
|
||||||
# $(MAKE) install-doc DESTDIR=$(CURDIR)/debian/tmp/ipmitool-doc
|
|
||||||
# dh_movefiles -i
|
|
||||||
|
|
||||||
install-arch:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k -a
|
|
||||||
dh_installdirs -a
|
|
||||||
|
|
||||||
# Add here commands to install the arch part of the package into
|
|
||||||
# debian/tmp.
|
|
||||||
$(MAKE) install DESTDIR=$(CURDIR)/debian/ipmitool
|
|
||||||
|
|
||||||
# No need to have two copies of the license text in the package.
|
|
||||||
$(RM) $(CURDIR)/debian/ipmitool/usr/share/doc/ipmitool/COPYING
|
|
||||||
|
|
||||||
# Move upstream changelog to correct filename.
|
|
||||||
mv $(CURDIR)/debian/ipmitool/usr/share/doc/ipmitool/ChangeLog \
|
|
||||||
$(CURDIR)/debian/ipmitool/usr/share/doc/ipmitool/changelog
|
|
||||||
|
|
||||||
# Compress to avoid lintian warning. Not sure why dh_compress
|
|
||||||
# isn't fixing this.
|
|
||||||
gzip -9 $(CURDIR)/debian/ipmitool/usr/share/doc/ipmitool/changelog
|
|
||||||
|
|
||||||
# dh_movefiles -a
|
|
||||||
# Must not depend on anything. This is to be called by
|
|
||||||
# binary-arch/binary-multi
|
|
||||||
# in another 'make' thread.
|
|
||||||
binary-common:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_installdocs
|
|
||||||
dh_installchangelogs
|
|
||||||
dh_installinit --name ipmievd
|
|
||||||
dh_link
|
|
||||||
dh_strip
|
|
||||||
dh_compress
|
|
||||||
dh_fixperms
|
|
||||||
dh_makeshlibs
|
|
||||||
dh_shlibdeps
|
|
||||||
dh_installdeb
|
|
||||||
dh_gencontrol
|
|
||||||
dh_md5sums
|
|
||||||
dh_builddeb
|
|
||||||
# Build architecture independant packages using the common target.
|
|
||||||
binary-indep: build-indep install-indep
|
|
||||||
$(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
|
|
||||||
|
|
||||||
# Build architecture dependant packages using the common target.
|
|
||||||
binary-arch: build-arch install-arch
|
|
||||||
$(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
|
|
||||||
|
|
||||||
binary: binary-arch #binary-indep
|
|
||||||
.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch configure
|
|
||||||
|
|
6
debian/watch
vendored
6
debian/watch
vendored
@ -1,6 +0,0 @@
|
|||||||
# Rename this file to "watch" and then you can run the "uscan" command
|
|
||||||
# to check for upstream updates and more.
|
|
||||||
# Site Directory Pattern Version Script
|
|
||||||
version=2
|
|
||||||
http://heanet.dl.sourceforge.net/sourceforge/ipmitool/ipmitool-(.*).tar.bz2
|
|
||||||
# debian uupdate
|
|
@ -145,7 +145,7 @@ placed at the end of commands to get option usage help.
|
|||||||
> ipmievd help
|
> ipmievd help
|
||||||
.br
|
.br
|
||||||
Commands:
|
Commands:
|
||||||
open Use OpenIPMI for asyncronous notification of events
|
open Use OpenIPMI for asynchronous notification of events
|
||||||
sel Poll SEL for notification of events
|
sel Poll SEL for notification of events
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
@ -174,7 +174,7 @@ Do NOT become a daemon, instead log all messages to stderr.
|
|||||||
.TP
|
.TP
|
||||||
\fIpidfile\fP=<\fBfilename\fR>
|
\fIpidfile\fP=<\fBfilename\fR>
|
||||||
Save process ID to this file when in daemon mode. Defaults to
|
Save process ID to this file when in daemon mode. Defaults to
|
||||||
/var/run/ipmievd.pid\fIN\fP (where \fIN\fP is the ipmi device
|
/run/ipmievd.pid\fIN\fP (where \fIN\fP is the ipmi device
|
||||||
number -- defaults to 0).
|
number -- defaults to 0).
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ Do NOT become a daemon, instead log all messages to stderr.
|
|||||||
.TP
|
.TP
|
||||||
\fIpidfile\fP=<\fBfilename\fR>
|
\fIpidfile\fP=<\fBfilename\fR>
|
||||||
Save process ID to this file when in daemon mode. Defaults to
|
Save process ID to this file when in daemon mode. Defaults to
|
||||||
/var/run/ipmievd.pid\fIN\fP (where \fIN\fP is the ipmi device
|
/run/ipmievd.pid\fIN\fP (where \fIN\fP is the ipmi device
|
||||||
number -- defaults to 0).
|
number -- defaults to 0).
|
||||||
.TP
|
.TP
|
||||||
\fItimeout\fP=<\fBseconds\fR>
|
\fItimeout\fP=<\fBseconds\fR>
|
||||||
@ -217,6 +217,16 @@ Reading Sensors...
|
|||||||
.br
|
.br
|
||||||
Waiting for Events...
|
Waiting for Events...
|
||||||
.br
|
.br
|
||||||
|
|
||||||
|
.SH FILES
|
||||||
|
.TP
|
||||||
|
.B @IANADIR@/enterprise-numbers
|
||||||
|
system IANA PEN registry taken from http://www.iana.org/assignments/enterprise-numbers
|
||||||
|
.TP
|
||||||
|
.B ~/@IANAUSERDIR@/enterprise-numbers
|
||||||
|
user's override for the system IANA PEN registry, this file if it exists is loaded instead
|
||||||
|
of the system registry (see above).
|
||||||
|
|
||||||
.SH "AUTHOR"
|
.SH "AUTHOR"
|
||||||
Duncan Laurie <duncan@iceblink.org>
|
Duncan Laurie <duncan@iceblink.org>
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
File diff suppressed because it is too large
Load Diff
@ -38,5 +38,6 @@ noinst_HEADERS = log.h bswap.h hpm2.h helper.h ipmi.h ipmi_cc.h ipmi_intf.h \
|
|||||||
ipmi_oem.h ipmi_sdradd.h ipmi_isol.h ipmi_sunoem.h ipmi_picmg.h \
|
ipmi_oem.h ipmi_sdradd.h ipmi_isol.h ipmi_sunoem.h ipmi_picmg.h \
|
||||||
ipmi_fwum.h ipmi_main.h ipmi_tsol.h ipmi_firewall.h \
|
ipmi_fwum.h ipmi_main.h ipmi_tsol.h ipmi_firewall.h \
|
||||||
ipmi_kontronoem.h ipmi_ekanalyzer.h ipmi_gendev.h ipmi_ime.h \
|
ipmi_kontronoem.h ipmi_ekanalyzer.h ipmi_gendev.h ipmi_ime.h \
|
||||||
ipmi_delloem.h ipmi_dcmi.h
|
ipmi_delloem.h ipmi_dcmi.h ipmi_vita.h ipmi_sel_supermicro.h \
|
||||||
|
ipmi_cfgp.h ipmi_lanp6.h ipmi_quantaoem.h ipmi_time.h
|
||||||
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_BSWAP_H
|
#pragma once
|
||||||
#define IPMI_BSWAP_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -49,5 +48,3 @@
|
|||||||
# define BSWAP_32(x) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) |\
|
# define BSWAP_32(x) ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) |\
|
||||||
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* IPMI_BSWAP_H */
|
|
||||||
|
@ -30,13 +30,16 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_HELPER_H
|
#pragma once
|
||||||
#define IPMI_HELPER_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h> /* For free() */
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
|
||||||
|
|
||||||
#ifndef TRUE
|
#ifndef TRUE
|
||||||
#define TRUE 1
|
#define TRUE 1
|
||||||
@ -50,6 +53,12 @@
|
|||||||
#define tboolean int
|
#define tboolean int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define __UNUSED__(x) x __attribute__((unused))
|
||||||
|
#else
|
||||||
|
#define __UNUSED__(x) x
|
||||||
|
#endif
|
||||||
|
|
||||||
/* IPMI spec. - UID 0 reserved, 63 maximum UID which can be used */
|
/* IPMI spec. - UID 0 reserved, 63 maximum UID which can be used */
|
||||||
#ifndef IPMI_UID_MIN
|
#ifndef IPMI_UID_MIN
|
||||||
# define IPMI_UID_MIN 1
|
# define IPMI_UID_MIN 1
|
||||||
@ -61,7 +70,7 @@
|
|||||||
struct ipmi_intf;
|
struct ipmi_intf;
|
||||||
|
|
||||||
struct valstr {
|
struct valstr {
|
||||||
uint16_t val;
|
uint32_t val;
|
||||||
const char * str;
|
const char * str;
|
||||||
};
|
};
|
||||||
struct oemvalstr {
|
struct oemvalstr {
|
||||||
@ -70,8 +79,12 @@ struct oemvalstr {
|
|||||||
const char * str;
|
const char * str;
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * val2str(uint16_t val, const struct valstr * vs);
|
const char *
|
||||||
const char * oemval2str(uint32_t oem,uint16_t val, const struct oemvalstr * vs);
|
specific_val2str(uint32_t val,
|
||||||
|
const struct valstr *specific,
|
||||||
|
const struct valstr *generic);
|
||||||
|
const char *val2str(uint32_t val, const struct valstr * vs);
|
||||||
|
const char *oemval2str(uint32_t oem, uint32_t val, const struct oemvalstr * vs);
|
||||||
|
|
||||||
int str2double(const char * str, double * double_ptr);
|
int str2double(const char * str, double * double_ptr);
|
||||||
int str2long(const char * str, int64_t * lng_ptr);
|
int str2long(const char * str, int64_t * lng_ptr);
|
||||||
@ -83,24 +96,118 @@ int str2ushort(const char * str, uint16_t * ushrt_ptr);
|
|||||||
int str2char(const char * str, int8_t * chr_ptr);
|
int str2char(const char * str, int8_t * chr_ptr);
|
||||||
int str2uchar(const char * str, uint8_t * uchr_ptr);
|
int str2uchar(const char * str, uint8_t * uchr_ptr);
|
||||||
|
|
||||||
|
bool args2buf(int argc, char *argv[], uint8_t *out, size_t len);
|
||||||
|
|
||||||
|
int eval_ccode(const int ccode);
|
||||||
|
|
||||||
int is_fru_id(const char *argv_ptr, uint8_t *fru_id_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_channel_num(const char *argv_ptr, uint8_t *channel_ptr);
|
||||||
int is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr);
|
int is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr);
|
||||||
|
int is_ipmi_user_priv_limit(const char *argv_ptr, uint8_t *ipmi_priv_limit_ptr);
|
||||||
|
|
||||||
uint16_t str2val(const char * str, const struct valstr * vs);
|
uint32_t str2val32(const char *str, const struct valstr *vs);
|
||||||
|
static inline uint16_t str2val(const char *str, const struct valstr *vs)
|
||||||
|
{
|
||||||
|
return (uint16_t)str2val32(str, vs);
|
||||||
|
}
|
||||||
void print_valstr(const struct valstr * vs, const char * title, int loglevel);
|
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);
|
void print_valstr_2col(const struct valstr * vs, const char * title, int loglevel);
|
||||||
|
|
||||||
|
|
||||||
uint16_t buf2short(uint8_t * buf);
|
uint16_t buf2short(uint8_t * buf);
|
||||||
uint32_t buf2long(uint8_t * buf);
|
uint32_t buf2long(uint8_t * buf);
|
||||||
const char * buf2str(uint8_t * buf, int len);
|
#define BUF2STR_MAXIMUM_OUTPUT_SIZE (3*1024 + 1)
|
||||||
|
const char * buf2str_extended(const uint8_t *buf, int len, const char *sep);
|
||||||
|
const char * buf2str(const uint8_t *buf, int len);
|
||||||
|
int str2mac(const char *arg, uint8_t *buf);
|
||||||
|
const char * mac2str(const uint8_t *buf);
|
||||||
|
int ipmi_parse_hex(const char *str, uint8_t *out, int size);
|
||||||
void printbuf(const uint8_t * buf, int len, const char * desc);
|
void printbuf(const uint8_t * buf, int len, const char * desc);
|
||||||
uint8_t ipmi_csum(uint8_t * d, int s);
|
uint8_t ipmi_csum(uint8_t * d, int s);
|
||||||
FILE * ipmi_open_file(const char * file, int rw);
|
FILE * ipmi_open_file(const char * file, int rw);
|
||||||
void ipmi_start_daemon(struct ipmi_intf *intf);
|
void ipmi_start_daemon(struct ipmi_intf *intf);
|
||||||
uint16_t ipmi_get_oem_id(struct ipmi_intf *intf);
|
uint16_t ipmi_get_oem_id(struct ipmi_intf *intf);
|
||||||
|
|
||||||
|
#define IS_SET(v, b) ((v) & (1 << (b)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free the memory and clear the pointer.
|
||||||
|
* @param[in] ptr - a pointer to your pointer to free.
|
||||||
|
*/
|
||||||
|
static inline void free_n(void *ptr) {
|
||||||
|
void **pptr = (void **)ptr;
|
||||||
|
|
||||||
|
if (pptr && *pptr) {
|
||||||
|
free(*pptr);
|
||||||
|
*pptr = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* le16toh(), hto16le(), et. al. don't exist for Windows or Apple */
|
||||||
|
/* For portability, let's simply define our own versions here */
|
||||||
|
|
||||||
|
/* IPMI is always little-endian */
|
||||||
|
static inline uint16_t ipmi16toh(void *ipmi16)
|
||||||
|
{
|
||||||
|
uint8_t *ipmi = (uint8_t *)ipmi16;
|
||||||
|
uint16_t h;
|
||||||
|
|
||||||
|
h = (uint16_t)ipmi[1] << 8; /* MSB */
|
||||||
|
h |= ipmi[0]; /* LSB */
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void htoipmi16(uint16_t h, uint8_t *ipmi)
|
||||||
|
{
|
||||||
|
ipmi[0] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[1] = h >> 8; /* MSB */
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t ipmi24toh(void *ipmi24)
|
||||||
|
{
|
||||||
|
uint8_t *ipmi = (uint8_t *)ipmi24;
|
||||||
|
uint32_t h = 0;
|
||||||
|
|
||||||
|
h = (uint32_t)ipmi[2] << 16; /* MSB */
|
||||||
|
h |= ipmi[1] << 8;
|
||||||
|
h |= ipmi[0]; /* LSB */
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void htoipmi24(uint32_t h, uint8_t *ipmi)
|
||||||
|
{
|
||||||
|
ipmi[0] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[1] = (h >> 8) & 0xFF;
|
||||||
|
ipmi[2] = (h >> 16) & 0xFF; /* MSB */
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t ipmi32toh(void *ipmi32)
|
||||||
|
{
|
||||||
|
uint8_t *ipmi = ipmi32;
|
||||||
|
uint32_t h;
|
||||||
|
|
||||||
|
h = (uint32_t)ipmi[3] << 24; /* MSB */
|
||||||
|
h |= ipmi[2] << 16;
|
||||||
|
h |= ipmi[1] << 8;
|
||||||
|
h |= ipmi[0]; /* LSB */
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void htoipmi32(uint32_t h, uint8_t *ipmi)
|
||||||
|
{
|
||||||
|
ipmi[0] = h & 0xFF; /* LSB */
|
||||||
|
ipmi[1] = (h >> 8) & 0xFF;
|
||||||
|
ipmi[2] = (h >> 16) & 0xFF;
|
||||||
|
ipmi[3] = (h >> 24) & 0xFF; /* MSB */
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *array_byteswap(uint8_t *buffer, size_t length);
|
||||||
|
uint8_t *array_ntoh(uint8_t *buffer, size_t length);
|
||||||
|
uint8_t *array_letoh(uint8_t *buffer, size_t length);
|
||||||
|
|
||||||
#define ipmi_open_file_read(file) ipmi_open_file(file, 0)
|
#define ipmi_open_file_read(file) ipmi_open_file(file, 0)
|
||||||
#define ipmi_open_file_write(file) ipmi_open_file(file, 1)
|
#define ipmi_open_file_write(file) ipmi_open_file(file, 1)
|
||||||
|
|
||||||
@ -119,5 +226,3 @@ uint16_t ipmi_get_oem_id(struct ipmi_intf *intf);
|
|||||||
#ifndef __maxlen
|
#ifndef __maxlen
|
||||||
# define __maxlen(a, b) ({ int x=strlen(a); int y=strlen(b); (x > y) ? x : y;})
|
# define __maxlen(a, b) ({ int x=strlen(a); int y=strlen(b); (x > y) ? x : y;})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* IPMI_HELPER_H */
|
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <ipmitool/ipmi_intf.h>
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
|
||||||
@ -39,6 +41,11 @@
|
|||||||
#define HPM2_LAN_PARAMS_REV 0x01
|
#define HPM2_LAN_PARAMS_REV 0x01
|
||||||
#define HPM2_SOL_PARAMS_REV 0x01
|
#define HPM2_SOL_PARAMS_REV 0x01
|
||||||
#define HPM3_LAN_PARAMS_REV 0x01
|
#define HPM3_LAN_PARAMS_REV 0x01
|
||||||
|
/* IPMI defines parameter revision as
|
||||||
|
* MSN = present revision,
|
||||||
|
* LSN = oldest revision parameter is
|
||||||
|
* backward compatible with. */
|
||||||
|
#define LAN_PARAM_REV(x, y) (((x) << 4) | ((y) & 0xF))
|
||||||
|
|
||||||
/* HPM.2 capabilities */
|
/* HPM.2 capabilities */
|
||||||
#define HPM2_CAPS_SOL_EXTENSION 0x01
|
#define HPM2_CAPS_SOL_EXTENSION 0x01
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_H
|
#pragma once
|
||||||
#define IPMI_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -46,6 +45,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IPMI_BUF_SIZE 1024
|
#define IPMI_BUF_SIZE 1024
|
||||||
|
#define IPMI_MAX_MD_SIZE 0x20
|
||||||
|
|
||||||
#if HAVE_PRAGMA_PACK
|
#if HAVE_PRAGMA_PACK
|
||||||
#define ATTRIBUTE_PACKING
|
#define ATTRIBUTE_PACKING
|
||||||
@ -211,13 +211,13 @@ struct ipmi_rs {
|
|||||||
uint32_t console_id;
|
uint32_t console_id;
|
||||||
uint8_t bmc_rand[16]; /* Random number generated by the BMC */
|
uint8_t bmc_rand[16]; /* Random number generated by the BMC */
|
||||||
uint8_t bmc_guid[16];
|
uint8_t bmc_guid[16];
|
||||||
uint8_t key_exchange_auth_code[20];
|
uint8_t key_exchange_auth_code[IPMI_MAX_MD_SIZE];
|
||||||
} rakp2_message;
|
} rakp2_message;
|
||||||
struct {
|
struct {
|
||||||
uint8_t message_tag;
|
uint8_t message_tag;
|
||||||
uint8_t rakp_return_code;
|
uint8_t rakp_return_code;
|
||||||
uint32_t console_id;
|
uint32_t console_id;
|
||||||
uint8_t integrity_check_value[20];
|
uint8_t integrity_check_value[IPMI_MAX_MD_SIZE];
|
||||||
} rakp4_message;
|
} rakp4_message;
|
||||||
struct {
|
struct {
|
||||||
uint8_t packet_sequence_number;
|
uint8_t packet_sequence_number;
|
||||||
@ -251,8 +251,17 @@ struct ipmi_rs {
|
|||||||
|
|
||||||
|
|
||||||
/* These values are IANA numbers */
|
/* These values are IANA numbers */
|
||||||
|
/************************************************************************
|
||||||
|
* Add ID String for IANA Enterprise Number of IBM & ADLINK
|
||||||
|
* https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
typedef enum IPMI_OEM {
|
typedef enum IPMI_OEM {
|
||||||
IPMI_OEM_UNKNOWN = 0,
|
IPMI_OEM_UNKNOWN = 0,
|
||||||
|
IPMI_OEM_DEBUG = 0xFFFFFE, /* Hoping IANA won't hit this soon */
|
||||||
|
IPMI_OEM_RESERVED = 0x0FFFFF, /* As per IPMI 2.0 specification */
|
||||||
|
/* 2 for [IBM] */
|
||||||
|
IPMI_OEM_IBM_2 = 2,
|
||||||
IPMI_OEM_HP = 11,
|
IPMI_OEM_HP = 11,
|
||||||
IPMI_OEM_SUN = 42,
|
IPMI_OEM_SUN = 42,
|
||||||
IPMI_OEM_NOKIA = 94,
|
IPMI_OEM_NOKIA = 94,
|
||||||
@ -260,6 +269,7 @@ typedef enum IPMI_OEM {
|
|||||||
IPMI_OEM_HITACHI_116 = 116,
|
IPMI_OEM_HITACHI_116 = 116,
|
||||||
IPMI_OEM_NEC = 119,
|
IPMI_OEM_NEC = 119,
|
||||||
IPMI_OEM_TOSHIBA = 186,
|
IPMI_OEM_TOSHIBA = 186,
|
||||||
|
IPMI_OEM_ERICSSON = 193,
|
||||||
IPMI_OEM_INTEL = 343,
|
IPMI_OEM_INTEL = 343,
|
||||||
IPMI_OEM_TATUNG = 373,
|
IPMI_OEM_TATUNG = 373,
|
||||||
IPMI_OEM_HITACHI_399 = 399,
|
IPMI_OEM_HITACHI_399 = 399,
|
||||||
@ -267,9 +277,13 @@ typedef enum IPMI_OEM {
|
|||||||
IPMI_OEM_LMC = 2168,
|
IPMI_OEM_LMC = 2168,
|
||||||
IPMI_OEM_RADISYS = 4337,
|
IPMI_OEM_RADISYS = 4337,
|
||||||
IPMI_OEM_BROADCOM = 4413,
|
IPMI_OEM_BROADCOM = 4413,
|
||||||
|
/* 4769 for [IBM Corporation] */
|
||||||
|
IPMI_OEM_IBM_4769 = 4769,
|
||||||
IPMI_OEM_MAGNUM = 5593,
|
IPMI_OEM_MAGNUM = 5593,
|
||||||
IPMI_OEM_TYAN = 6653,
|
IPMI_OEM_TYAN = 6653,
|
||||||
IPMI_OEM_NEWISYS = 9237,
|
IPMI_OEM_QUANTA = 7244,
|
||||||
|
IPMI_OEM_VIKING = 9237,
|
||||||
|
IPMI_OEM_ADVANTECH = 10297,
|
||||||
IPMI_OEM_FUJITSU_SIEMENS = 10368,
|
IPMI_OEM_FUJITSU_SIEMENS = 10368,
|
||||||
IPMI_OEM_AVOCENT = 10418,
|
IPMI_OEM_AVOCENT = 10418,
|
||||||
IPMI_OEM_PEPPERCON = 10437,
|
IPMI_OEM_PEPPERCON = 10437,
|
||||||
@ -280,11 +294,15 @@ typedef enum IPMI_OEM {
|
|||||||
IPMI_OEM_RARITAN = 13742,
|
IPMI_OEM_RARITAN = 13742,
|
||||||
IPMI_OEM_KONTRON = 15000,
|
IPMI_OEM_KONTRON = 15000,
|
||||||
IPMI_OEM_PPS = 16394,
|
IPMI_OEM_PPS = 16394,
|
||||||
|
/* 20301 for [IBM eServer X] */
|
||||||
|
IPMI_OEM_IBM_20301 = 20301,
|
||||||
IPMI_OEM_AMI = 20974,
|
IPMI_OEM_AMI = 20974,
|
||||||
IPMI_OEM_NOKIA_SIEMENS_NETWORKS = 28458,
|
/* 24339 for [ADLINK TECHNOLOGY INC.] */
|
||||||
IPMI_OEM_SUPERMICRO_47488 = 47488
|
IPMI_OEM_ADLINK_24339 = 24339,
|
||||||
|
IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS = 28458,
|
||||||
|
IPMI_OEM_VITA = 33196,
|
||||||
|
IPMI_OEM_SUPERMICRO_47488 = 47488,
|
||||||
|
IPMI_OEM_YADRO = 49769,
|
||||||
} IPMI_OEM;
|
} IPMI_OEM;
|
||||||
|
|
||||||
extern const struct valstr completion_code_vals[];
|
extern const struct valstr completion_code_vals[];
|
||||||
|
|
||||||
#endif /* IPMI_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_CC_H
|
#pragma once
|
||||||
#define IPMI_CC_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Thu Jan 11 09:32:41 2007
|
Thu Jan 11 09:32:41 2007
|
||||||
@ -71,6 +70,3 @@
|
|||||||
#define IPMI_CC_NOT_SUPPORTED_PRESENT_STATE 0xd5
|
#define IPMI_CC_NOT_SUPPORTED_PRESENT_STATE 0xd5
|
||||||
#define IPMI_CC_ILLEGAL_COMMAND_DISABLED 0xd6
|
#define IPMI_CC_ILLEGAL_COMMAND_DISABLED 0xd6
|
||||||
#define IPMI_CC_UNSPECIFIED_ERROR 0xff
|
#define IPMI_CC_UNSPECIFIED_ERROR 0xff
|
||||||
|
|
||||||
|
|
||||||
#endif /*IPMI_CC_H*/
|
|
||||||
|
195
include/ipmitool/ipmi_cfgp.h
Normal file
195
include/ipmitool/ipmi_cfgp.h
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 Pentair Technical Products. All right reserved
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Pentair Technical Products or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Forward declarations. */
|
||||||
|
struct ipmi_cfgp;
|
||||||
|
struct ipmi_cfgp_ctx;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Action types.
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
/* parse dumped parameter data */
|
||||||
|
CFGP_PARSE,
|
||||||
|
/* get parameter from BMC */
|
||||||
|
CFGP_GET,
|
||||||
|
/* set parameter to BMC */
|
||||||
|
CFGP_SET,
|
||||||
|
/* output parameter data in form that can be parsed back */
|
||||||
|
CFGP_SAVE,
|
||||||
|
/* print parameter in user-friendly format */
|
||||||
|
CFGP_PRINT
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Action-specific information.
|
||||||
|
*/
|
||||||
|
struct ipmi_cfgp_action {
|
||||||
|
/* Action type. */
|
||||||
|
int type;
|
||||||
|
|
||||||
|
/* Set selector. */
|
||||||
|
int set;
|
||||||
|
|
||||||
|
/* Block selector. */
|
||||||
|
int block;
|
||||||
|
|
||||||
|
/* No error output needed. */
|
||||||
|
int quiet;
|
||||||
|
|
||||||
|
/* Number of command line arguments (only for parse action). */
|
||||||
|
int argc;
|
||||||
|
|
||||||
|
/* Command line arguments (only for parse action). */
|
||||||
|
const char **argv;
|
||||||
|
|
||||||
|
/* Output file (only for dump/print actions). */
|
||||||
|
FILE *file;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Access types.
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
CFGP_RDWR,
|
||||||
|
CFGP_RDONLY,
|
||||||
|
CFGP_WRONLY,
|
||||||
|
CFGP_RESERVED
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration parameter descriptor.
|
||||||
|
*/
|
||||||
|
struct ipmi_cfgp {
|
||||||
|
/* Parameter name. */
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
/* Parameter format description. */
|
||||||
|
const char *format;
|
||||||
|
|
||||||
|
/* Various parameter traits. */
|
||||||
|
unsigned int size; /* block size */
|
||||||
|
unsigned int access:2; /* read-write/read-only/write-only */
|
||||||
|
unsigned int is_set:1; /* takes non-zero set selectors */
|
||||||
|
unsigned int first_set:1; /* 1 = 1-based set selector */
|
||||||
|
unsigned int has_blocks:1; /* takes non-zero block selectors */
|
||||||
|
unsigned int first_block:1; /* 1 = 1-based block selector */
|
||||||
|
|
||||||
|
/* Parameter-specific data. */
|
||||||
|
int specific;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Parameter callback. */
|
||||||
|
typedef int (*ipmi_cfgp_handler_t)(void *priv,
|
||||||
|
const struct ipmi_cfgp *p, const struct ipmi_cfgp_action *action,
|
||||||
|
unsigned char *data);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parameter selector.
|
||||||
|
*/
|
||||||
|
struct ipmi_cfgp_sel {
|
||||||
|
int param;
|
||||||
|
int set;
|
||||||
|
int block;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration parameter data.
|
||||||
|
*/
|
||||||
|
struct ipmi_cfgp_data {
|
||||||
|
struct ipmi_cfgp_data *next;
|
||||||
|
struct ipmi_cfgp_sel sel;
|
||||||
|
unsigned char data[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configuration parameter operation context.
|
||||||
|
*/
|
||||||
|
struct ipmi_cfgp_ctx {
|
||||||
|
/* Set of parameters. */
|
||||||
|
const struct ipmi_cfgp *set;
|
||||||
|
|
||||||
|
/* Descriptor count. */
|
||||||
|
int count;
|
||||||
|
|
||||||
|
/* Parameter action handler. */
|
||||||
|
ipmi_cfgp_handler_t handler;
|
||||||
|
|
||||||
|
/* ipmitool cmd name */
|
||||||
|
const char *cmdname;
|
||||||
|
|
||||||
|
/* List of parameter values. */
|
||||||
|
struct ipmi_cfgp_data *v;
|
||||||
|
|
||||||
|
/* Private data. */
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Initialize configuration context. */
|
||||||
|
extern int ipmi_cfgp_init(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp *set, unsigned int count,
|
||||||
|
const char *cmdname,
|
||||||
|
ipmi_cfgp_handler_t handler, void *priv);
|
||||||
|
|
||||||
|
/* Uninitialize context, free allocated memory. */
|
||||||
|
extern int ipmi_cfgp_uninit(struct ipmi_cfgp_ctx *ctx);
|
||||||
|
|
||||||
|
/* Print parameter usage. */
|
||||||
|
void ipmi_cfgp_usage(const struct ipmi_cfgp *set, int count, int write);
|
||||||
|
|
||||||
|
/* Parse parameter selector from command line. */
|
||||||
|
extern int ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
int argc, const char **argv, struct ipmi_cfgp_sel *sel);
|
||||||
|
|
||||||
|
/* Parse parameter data from command line. */
|
||||||
|
extern int ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, int argc, const char **argv);
|
||||||
|
|
||||||
|
/* Get parameter data from BMC. */
|
||||||
|
extern int ipmi_cfgp_get(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel);
|
||||||
|
|
||||||
|
/* Set parameter data to BMC. */
|
||||||
|
extern int ipmi_cfgp_set(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel);
|
||||||
|
|
||||||
|
/* Write parameter data to file. */
|
||||||
|
extern int ipmi_cfgp_save(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, FILE *file);
|
||||||
|
|
||||||
|
/* Print parameter data in user-friendly format. */
|
||||||
|
extern int ipmi_cfgp_print(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, FILE *file);
|
@ -30,16 +30,17 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_CHANNEL_H
|
#pragma once
|
||||||
#define IPMI_CHANNEL_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
|
||||||
|
|
||||||
#define IPMI_GET_CHANNEL_AUTH_CAP 0x38
|
#define IPMI_GET_CHANNEL_AUTH_CAP 0x38
|
||||||
|
#define IPMI_SET_CHANNEL_ACCESS 0x40
|
||||||
#define IPMI_GET_CHANNEL_ACCESS 0x41
|
#define IPMI_GET_CHANNEL_ACCESS 0x41
|
||||||
#define IPMI_GET_CHANNEL_INFO 0x42
|
#define IPMI_GET_CHANNEL_INFO 0x42
|
||||||
#define IPMI_SET_USER_ACCESS 0x43
|
#define IPMI_SET_USER_ACCESS 0x43
|
||||||
@ -49,6 +50,104 @@
|
|||||||
#define IPMI_SET_USER_PASSWORD 0x47
|
#define IPMI_SET_USER_PASSWORD 0x47
|
||||||
#define IPMI_GET_CHANNEL_CIPHER_SUITES 0x54
|
#define IPMI_GET_CHANNEL_CIPHER_SUITES 0x54
|
||||||
|
|
||||||
|
/* These are for channel_info_t.session_support */
|
||||||
|
#define IPMI_CHANNEL_SESSION_LESS 0x00
|
||||||
|
#define IPMI_CHANNEL_SESSION_SINGLE 0x40
|
||||||
|
#define IPMI_CHANNEL_SESSION_MULTI 0x80
|
||||||
|
#define IPMI_CHANNEL_SESSION_BASED 0xC0
|
||||||
|
|
||||||
|
/* Fixed channel numbers as per Table 6-1 */
|
||||||
|
typedef enum {
|
||||||
|
CH_PRIMARY_IPMB,
|
||||||
|
CH_IMP_SPECIFIC_1,
|
||||||
|
CH_IMP_SPECIFIC_2,
|
||||||
|
CH_IMP_SPECIFIC_3,
|
||||||
|
CH_IMP_SPECIFIC_4,
|
||||||
|
CH_IMP_SPECIFIC_5,
|
||||||
|
CH_IMP_SPECIFIC_6,
|
||||||
|
CH_IMP_SPECIFIC_7,
|
||||||
|
CH_IMP_SPECIFIC_8,
|
||||||
|
CH_IMP_SPECIFIC_9,
|
||||||
|
CH_IMP_SPECIFIC_A,
|
||||||
|
CH_IMP_SPECIFIC_B,
|
||||||
|
CH_RSVD1,
|
||||||
|
CH_RSVD2,
|
||||||
|
CH_CURRENT,
|
||||||
|
CH_SYSTEM,
|
||||||
|
CH_TOTAL,
|
||||||
|
CH_UNKNOWN = UINT8_MAX
|
||||||
|
} ipmi_channel_num_t;
|
||||||
|
|
||||||
|
/* (22.24) Get Channel Info */
|
||||||
|
struct channel_info_t {
|
||||||
|
uint8_t channel;
|
||||||
|
uint8_t medium;
|
||||||
|
uint8_t protocol;
|
||||||
|
uint8_t session_support;
|
||||||
|
uint8_t active_sessions;
|
||||||
|
uint8_t vendor_id[3];
|
||||||
|
uint8_t aux_info[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* (22.22 / 22.23) Set/Get Channel Access */
|
||||||
|
typedef enum {
|
||||||
|
ALERTING_ENABLED = 0,
|
||||||
|
ALERTING_DISABLED = (1 << 5) /* See Table 22 */
|
||||||
|
} alerting_t;
|
||||||
|
|
||||||
|
struct channel_access_t {
|
||||||
|
uint8_t access_mode;
|
||||||
|
alerting_t alerting;
|
||||||
|
uint8_t channel;
|
||||||
|
uint8_t per_message_auth;
|
||||||
|
uint8_t privilege_limit;
|
||||||
|
uint8_t user_level_auth;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The Cipher Suite Record Format from table 22-18 of the IPMI v2.0 spec
|
||||||
|
*/
|
||||||
|
enum cipher_suite_format_tag {
|
||||||
|
STANDARD_CIPHER_SUITE = 0xc0,
|
||||||
|
OEM_CIPHER_SUITE = 0xc1,
|
||||||
|
};
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(1)
|
||||||
|
#endif
|
||||||
|
struct std_cipher_suite_record_t {
|
||||||
|
uint8_t start_of_record;
|
||||||
|
uint8_t cipher_suite_id;
|
||||||
|
uint8_t auth_alg;
|
||||||
|
uint8_t integrity_alg;
|
||||||
|
uint8_t crypt_alg;
|
||||||
|
} ATTRIBUTE_PACKING;
|
||||||
|
struct oem_cipher_suite_record_t {
|
||||||
|
uint8_t start_of_record;
|
||||||
|
uint8_t cipher_suite_id;
|
||||||
|
uint8_t iana[3];
|
||||||
|
uint8_t auth_alg;
|
||||||
|
uint8_t integrity_alg;
|
||||||
|
uint8_t crypt_alg;
|
||||||
|
} ATTRIBUTE_PACKING;
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(0)
|
||||||
|
#endif
|
||||||
|
#define CIPHER_ALG_MASK 0x3f
|
||||||
|
#define MAX_CIPHER_SUITE_RECORD_OFFSET 0x40
|
||||||
|
#define MAX_CIPHER_SUITE_DATA_LEN 0x10
|
||||||
|
#define LIST_ALGORITHMS_BY_CIPHER_SUITE 0x80
|
||||||
|
|
||||||
|
/* Below is the theoretical maximum number of cipher suites that could be
|
||||||
|
* reported by a BMC. That is with the Get Channel Cipher Suites Command, at 16
|
||||||
|
* bytes at a time and 0x40 requests, it can report 1024 bytes, which is about
|
||||||
|
* 204 standard records or 128 OEM records. Really, we probably don't need more
|
||||||
|
* than about 20, which is the full set of standard records plus a few OEM
|
||||||
|
* records.
|
||||||
|
*/
|
||||||
|
#define MAX_CIPHER_SUITE_COUNT (MAX_CIPHER_SUITE_RECORD_OFFSET * \
|
||||||
|
MAX_CIPHER_SUITE_DATA_LEN / \
|
||||||
|
sizeof(struct std_cipher_suite_record_t))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Get Authentication Capabilities response structure
|
* The Get Authentication Capabilities response structure
|
||||||
@ -101,158 +200,25 @@ struct get_channel_auth_cap_rsp {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int _ipmi_get_channel_access(struct ipmi_intf *intf,
|
||||||
|
struct channel_access_t *channel_access,
|
||||||
/*
|
uint8_t get_volatile_settings);
|
||||||
* The Get Channel Info response structure
|
int ipmi_get_channel_cipher_suites(struct ipmi_intf *intf,
|
||||||
* From table 22-29 of the IPMI v2.0 spec
|
const char *payload_type,
|
||||||
*/
|
uint8_t channel,
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
struct cipher_suite_info *suites,
|
||||||
#pragma pack(1)
|
size_t *count);
|
||||||
#endif
|
int _ipmi_get_channel_info(struct ipmi_intf *intf,
|
||||||
struct get_channel_info_rsp {
|
struct channel_info_t *channel_info);
|
||||||
#if WORDS_BIGENDIAN
|
int _ipmi_set_channel_access(struct ipmi_intf *intf,
|
||||||
uint8_t __reserved1 : 4;
|
struct channel_access_t channel_access,
|
||||||
uint8_t channel_number : 4; /* channel number */
|
uint8_t access_option,
|
||||||
#else
|
uint8_t privilege_option);
|
||||||
uint8_t channel_number : 4; /* channel number */
|
|
||||||
uint8_t __reserved1 : 4;
|
|
||||||
#endif
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved2 : 1;
|
|
||||||
uint8_t channel_medium : 7; /* Channel medium type per table 6-3 */
|
|
||||||
#else
|
|
||||||
uint8_t channel_medium : 7; /* Channel medium type per table 6-3 */
|
|
||||||
uint8_t __reserved2 : 1;
|
|
||||||
#endif
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved3 : 3;
|
|
||||||
uint8_t channel_protocol : 5; /* Channel protocol per table 6-2 */
|
|
||||||
#else
|
|
||||||
uint8_t channel_protocol : 5; /* Channel protocol per table 6-2 */
|
|
||||||
uint8_t __reserved3 : 3;
|
|
||||||
#endif
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t session_support : 2; /* Description of session support */
|
|
||||||
uint8_t active_sessions : 6; /* Count of active sessions */
|
|
||||||
#else
|
|
||||||
uint8_t active_sessions : 6; /* Count of active sessions */
|
|
||||||
uint8_t session_support : 2; /* Description of session support */
|
|
||||||
#endif
|
|
||||||
uint8_t vendor_id[3]; /* For OEM that specified the protocol */
|
|
||||||
uint8_t aux_info[2]; /* Not used*/
|
|
||||||
} ATTRIBUTE_PACKING;
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Get Channel Access response structure
|
|
||||||
* From table 22-28 of the IPMI v2.0 spec
|
|
||||||
*/
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(1)
|
|
||||||
#endif
|
|
||||||
struct get_channel_access_rsp {
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t alerting : 1;
|
|
||||||
uint8_t per_message_auth : 1;
|
|
||||||
uint8_t user_level_auth : 1;
|
|
||||||
uint8_t access_mode : 3;
|
|
||||||
#else
|
|
||||||
uint8_t access_mode : 3;
|
|
||||||
uint8_t user_level_auth : 1;
|
|
||||||
uint8_t per_message_auth : 1;
|
|
||||||
uint8_t alerting : 1;
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
#endif
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved2 : 4;
|
|
||||||
uint8_t channel_priv_limit : 4; /* Channel privilege level limit */
|
|
||||||
#else
|
|
||||||
uint8_t channel_priv_limit : 4; /* Channel privilege level limit */
|
|
||||||
uint8_t __reserved2 : 4;
|
|
||||||
#endif
|
|
||||||
} ATTRIBUTE_PACKING;
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(1)
|
|
||||||
#endif
|
|
||||||
struct get_user_access_rsp {
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t max_user_ids : 6;
|
|
||||||
uint8_t __reserved2 : 2;
|
|
||||||
uint8_t enabled_user_ids : 6;
|
|
||||||
uint8_t __reserved3 : 2;
|
|
||||||
uint8_t fixed_user_ids : 6;
|
|
||||||
uint8_t __reserved4 : 1;
|
|
||||||
uint8_t callin_callback : 1;
|
|
||||||
uint8_t link_auth : 1;
|
|
||||||
uint8_t ipmi_messaging : 1;
|
|
||||||
uint8_t privilege_limit : 4;
|
|
||||||
#else
|
|
||||||
uint8_t max_user_ids : 6;
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t enabled_user_ids : 6;
|
|
||||||
uint8_t __reserved2 : 2;
|
|
||||||
uint8_t fixed_user_ids : 6;
|
|
||||||
uint8_t __reserved3 : 2;
|
|
||||||
uint8_t privilege_limit : 4;
|
|
||||||
uint8_t ipmi_messaging : 1;
|
|
||||||
uint8_t link_auth : 1;
|
|
||||||
uint8_t callin_callback : 1;
|
|
||||||
uint8_t __reserved4 : 1;
|
|
||||||
#endif
|
|
||||||
} ATTRIBUTE_PACKING;
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(1)
|
|
||||||
#endif
|
|
||||||
struct set_user_access_data {
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t change_bits : 1;
|
|
||||||
uint8_t callin_callback : 1;
|
|
||||||
uint8_t link_auth : 1;
|
|
||||||
uint8_t ipmi_messaging : 1;
|
|
||||||
uint8_t channel : 4;
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t user_id : 6;
|
|
||||||
uint8_t __reserved2 : 4;
|
|
||||||
uint8_t privilege_limit : 4;
|
|
||||||
uint8_t __reserved3 : 4;
|
|
||||||
uint8_t session_limit : 4;
|
|
||||||
#else
|
|
||||||
uint8_t channel : 4;
|
|
||||||
uint8_t ipmi_messaging : 1;
|
|
||||||
uint8_t link_auth : 1;
|
|
||||||
uint8_t callin_callback : 1;
|
|
||||||
uint8_t change_bits : 1;
|
|
||||||
uint8_t user_id : 6;
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t privilege_limit : 4;
|
|
||||||
uint8_t __reserved2 : 4;
|
|
||||||
uint8_t session_limit : 4;
|
|
||||||
uint8_t __reserved3 : 4;
|
|
||||||
#endif
|
|
||||||
} ATTRIBUTE_PACKING;
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint8_t ipmi_get_channel_medium(struct ipmi_intf * intf, uint8_t channel);
|
uint8_t ipmi_get_channel_medium(struct ipmi_intf * intf, uint8_t channel);
|
||||||
uint8_t ipmi_current_channel_medium(struct ipmi_intf * intf);
|
void ipmi_current_channel_info(struct ipmi_intf *intf,
|
||||||
|
struct channel_info_t *chinfo);
|
||||||
int ipmi_channel_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_channel_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
int ipmi_get_channel_auth_cap(struct ipmi_intf * intf, uint8_t channel, uint8_t priv);
|
int ipmi_get_channel_auth_cap(struct ipmi_intf * intf,
|
||||||
|
uint8_t channel, uint8_t priv);
|
||||||
int ipmi_get_channel_info(struct ipmi_intf * intf, uint8_t channel);
|
int ipmi_get_channel_info(struct ipmi_intf * intf, uint8_t channel);
|
||||||
|
|
||||||
#endif /*IPMI_CHANNEL_H*/
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_CHASSIS_H
|
#pragma once
|
||||||
#define IPMI_CHASSIS_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -51,5 +50,3 @@ int ipmi_chassis_power_status(struct ipmi_intf * intf);
|
|||||||
int ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl);
|
int ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl);
|
||||||
int ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
int ipmi_power_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_power_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /*IPMI_CHASSIS_H*/
|
|
||||||
|
@ -30,9 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_CONSTANTS_H
|
#pragma once
|
||||||
#define IPMI_CONSTANTS_H
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* COMMANDS
|
* COMMANDS
|
||||||
@ -74,6 +72,7 @@
|
|||||||
#define IPMI_SESSION_PRIV_OPERATOR 0x3
|
#define IPMI_SESSION_PRIV_OPERATOR 0x3
|
||||||
#define IPMI_SESSION_PRIV_ADMIN 0x4
|
#define IPMI_SESSION_PRIV_ADMIN 0x4
|
||||||
#define IPMI_SESSION_PRIV_OEM 0x5
|
#define IPMI_SESSION_PRIV_OEM 0x5
|
||||||
|
#define IPMI_SESSION_PRIV_NOACCESS 0xF
|
||||||
|
|
||||||
#define IPMI_SET_IN_PROGRESS_SET_COMPLETE 0x00
|
#define IPMI_SET_IN_PROGRESS_SET_COMPLETE 0x00
|
||||||
#define IPMI_SET_IN_PROGRESS_IN_PROGRESS 0x01
|
#define IPMI_SET_IN_PROGRESS_IN_PROGRESS 0x01
|
||||||
@ -118,17 +117,17 @@
|
|||||||
#define IPMI_AUTH_RAKP_NONE 0x00
|
#define IPMI_AUTH_RAKP_NONE 0x00
|
||||||
#define IPMI_AUTH_RAKP_HMAC_SHA1 0x01
|
#define IPMI_AUTH_RAKP_HMAC_SHA1 0x01
|
||||||
#define IPMI_AUTH_RAKP_HMAC_MD5 0x02
|
#define IPMI_AUTH_RAKP_HMAC_MD5 0x02
|
||||||
|
#define IPMI_AUTH_RAKP_HMAC_SHA256 0x03
|
||||||
|
|
||||||
/* From table 13-18 of the IPMI v2 specification */
|
/* From table 13-18 of the IPMI v2 specification */
|
||||||
#define IPMI_INTEGRITY_NONE 0x00
|
#define IPMI_INTEGRITY_NONE 0x00
|
||||||
#define IPMI_INTEGRITY_HMAC_SHA1_96 0x01
|
#define IPMI_INTEGRITY_HMAC_SHA1_96 0x01
|
||||||
#define IPMI_INTEGRITY_HMAC_MD5_128 0x02
|
#define IPMI_INTEGRITY_HMAC_MD5_128 0x02
|
||||||
#define IPMI_INTEGRITY_MD5_128 0x03
|
#define IPMI_INTEGRITY_MD5_128 0x03
|
||||||
|
#define IPMI_INTEGRITY_HMAC_SHA256_128 0x04
|
||||||
|
|
||||||
/* From table 13-19 of the IPMI v2 specfication */
|
/* From table 13-19 of the IPMI v2 specification */
|
||||||
#define IPMI_CRYPT_NONE 0x00
|
#define IPMI_CRYPT_NONE 0x00
|
||||||
#define IPMI_CRYPT_AES_CBC_128 0x01
|
#define IPMI_CRYPT_AES_CBC_128 0x01
|
||||||
#define IPMI_CRYPT_XRC4_128 0x02
|
#define IPMI_CRYPT_XRC4_128 0x02
|
||||||
#define IPMI_CRYPT_XRC4_40 0x03
|
#define IPMI_CRYPT_XRC4_40 0x03
|
||||||
|
|
||||||
#endif /*IPMI_CONSTANTS_H*/
|
|
||||||
|
@ -16,9 +16,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
#ifndef IPMI_DCMI_H
|
|
||||||
#define IPMI_DCMI_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -52,6 +50,53 @@
|
|||||||
#define GOOD_PWR_GLIMIT_CCODE(ccode) ((ccode = ((ccode == 0x80) ? 0 : ccode)))
|
#define GOOD_PWR_GLIMIT_CCODE(ccode) ((ccode = ((ccode == 0x80) ? 0 : ccode)))
|
||||||
#define GOOD_ASSET_TAG_CCODE(ccode) ((ccode = (((ccode == 0x80) || (ccode == 0x81) || (ccode == 0x82) || (ccode == 0x83)) ? 0 : ccode)))
|
#define GOOD_ASSET_TAG_CCODE(ccode) ((ccode = (((ccode == 0x80) || (ccode == 0x81) || (ccode == 0x82) || (ccode == 0x83)) ? 0 : ccode)))
|
||||||
|
|
||||||
|
/* External Node Manager Configuration and Control Commands per spec 2.0 */
|
||||||
|
|
||||||
|
#define IPMI_NM_POLICY_CTL 0xC0
|
||||||
|
#define IPMI_NM_SET_POLICY 0xC1
|
||||||
|
#define IPMI_NM_GET_POLICY 0xC2
|
||||||
|
#define IPMI_NM_SET_ALERT_TH 0xC3
|
||||||
|
#define IPMI_NM_GET_ALERT_TH 0xC4
|
||||||
|
#define IPMI_NM_SET_SUSPEND 0xC5
|
||||||
|
#define IPMI_NM_GET_SUSPEND 0xC6
|
||||||
|
#define IPMI_NM_RESET_STATS 0xC7
|
||||||
|
#define IPMI_NM_GET_STATS 0xC8
|
||||||
|
#define IPMI_NM_GET_CAP 0xC9
|
||||||
|
#define IPMI_NM_GET_VERSION 0xCA
|
||||||
|
#define IPMI_NM_SET_POWER 0xCB
|
||||||
|
#define IPMI_NM_SET_ALERT_DS 0xCE
|
||||||
|
#define IPMI_NM_GET_ALERT_DS 0xCF
|
||||||
|
#define IPMI_NM_LIMITING 0xF2
|
||||||
|
|
||||||
|
/* Node Manager Policy Control Flags */
|
||||||
|
#define IPMI_NM_GLOBAL_ENABLE 0x01
|
||||||
|
#define IPMI_NM_DOMAIN_ENABLE 0x02
|
||||||
|
#define IPMI_NM_PER_POLICY_ENABLE 0x04
|
||||||
|
|
||||||
|
/* Node Manager Set Policy Enable */
|
||||||
|
#define IPMI_NM_POLICY_ENABLE 0x10
|
||||||
|
|
||||||
|
/* Node Manager Policy Trigger Codes */
|
||||||
|
#define IPMI_NM_NO_POLICY_TRIG 0x00
|
||||||
|
#define IPMI_NM_TEMP_TRIGGER 0x01
|
||||||
|
#define IPMI_NM_NO_READ_TRIG 0x02
|
||||||
|
#define IPMI_NM_RESET_TRIGGER 0x03
|
||||||
|
#define IPMI_NM_BOOT_TRIGGER 0x04
|
||||||
|
|
||||||
|
/* Policy Exception Actions flags */
|
||||||
|
#define IPMI_NM_POLICY_ALERT 0x01
|
||||||
|
#define IPMI_NM_POLICY_SHUT 0x02
|
||||||
|
|
||||||
|
/* Power Correction codes for Policy action */
|
||||||
|
#define IPMI_NM_PWR_AUTO_CORR 0x00
|
||||||
|
#define IPMI_NM_PWR_SOFT_CORR 0x01
|
||||||
|
#define IPMI_NM_PWR_AGGR_CORR 0x02
|
||||||
|
|
||||||
|
/* Set Threshold message size */
|
||||||
|
#define IPMI_NM_SET_THRESH_LEN 12
|
||||||
|
|
||||||
|
/* Number of Suspend Periods */
|
||||||
|
#define IPMI_NM_SUSPEND_PERIOD_MAX 5
|
||||||
|
|
||||||
struct dcmi_cmd {
|
struct dcmi_cmd {
|
||||||
uint16_t val;
|
uint16_t val;
|
||||||
@ -82,7 +127,7 @@ struct power_reading {
|
|||||||
uint8_t state;
|
uint8_t state;
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
/* make a struct for the return from the capabilites command */
|
/* make a struct for the return from the capabilities command */
|
||||||
struct capabilities {
|
struct capabilities {
|
||||||
uint8_t grp_id; /* first byte: Group Extension ID */
|
uint8_t grp_id; /* first byte: Group Extension ID */
|
||||||
uint16_t conformance;
|
uint16_t conformance;
|
||||||
@ -126,4 +171,97 @@ struct thermal_limit {
|
|||||||
|
|
||||||
int ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /*IPMI_DCMI_H*/
|
/* Node Manager discover command */
|
||||||
|
struct nm_discover {
|
||||||
|
uint8_t intel_id[3]; /* Always returns 000157 */
|
||||||
|
uint8_t nm_version;
|
||||||
|
uint8_t ipmi_version;
|
||||||
|
uint8_t patch_version;
|
||||||
|
uint8_t major_rev;
|
||||||
|
uint8_t minor_rev;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager get capabilities command */
|
||||||
|
struct nm_capability {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t max_settings;
|
||||||
|
uint16_t max_value; /* max power/thermal/time after reset */
|
||||||
|
uint16_t min_value; /* min "" */
|
||||||
|
uint32_t min_corr; /* min correction time inmillesecs */
|
||||||
|
uint32_t max_corr;
|
||||||
|
uint16_t min_stats;
|
||||||
|
uint16_t max_stats;
|
||||||
|
uint8_t scope;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager get statistics command */
|
||||||
|
struct nm_statistics {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint16_t curr_value;
|
||||||
|
uint16_t min_value;
|
||||||
|
uint16_t max_value;
|
||||||
|
uint16_t ave_value;
|
||||||
|
uint32_t time_stamp;
|
||||||
|
uint32_t stat_period;
|
||||||
|
uint8_t id_state;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager set policy */
|
||||||
|
struct nm_policy {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t domain; /* 0:3 are domain, 4 = Policy enabled */
|
||||||
|
uint8_t policy_id;
|
||||||
|
uint8_t policy_type; /* 0:3 trigger type 4 = action 5:6 correction */
|
||||||
|
uint8_t policy_exception; /* exception actions */
|
||||||
|
uint16_t policy_limits;
|
||||||
|
uint32_t corr_time;
|
||||||
|
uint16_t trigger_limit;
|
||||||
|
uint16_t stats_period;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Maager get policy */
|
||||||
|
struct nm_get_policy {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t domain; /* 0:3 are domain, 4 = Policy enabled */
|
||||||
|
uint8_t policy_type; /* 0:3 trigger type 4 = action 5:6 correction */
|
||||||
|
uint8_t policy_exception; /* exception actions */
|
||||||
|
uint16_t policy_limits;
|
||||||
|
uint32_t corr_time;
|
||||||
|
uint16_t trigger_limit;
|
||||||
|
uint16_t stats_period;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager set alert destination */
|
||||||
|
struct nm_set_alert {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t chan; /* 0:3 BMC chan, 4:6 reserved, bit 7=0 register alert receiver =1 invalidate */
|
||||||
|
uint8_t dest; /* lan destination */
|
||||||
|
uint8_t string; /* alert string selector */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager set alert threshold */
|
||||||
|
struct nm_thresh {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t domain; /* 0:3 are domain, 4 = Policy enabled */
|
||||||
|
uint8_t policy_id;
|
||||||
|
uint8_t count;
|
||||||
|
uint16_t thresholds[3];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager suspend period struct */
|
||||||
|
struct nm_period {
|
||||||
|
uint8_t start;
|
||||||
|
uint8_t stop;
|
||||||
|
uint8_t repeat;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Node Manager set suspend period */
|
||||||
|
struct nm_suspend {
|
||||||
|
uint8_t intel_id[3];
|
||||||
|
uint8_t domain; /* 0:3 are domain, 4 = Policy enabled */
|
||||||
|
uint8_t policy_id;
|
||||||
|
uint8_t count;
|
||||||
|
struct nm_period period[IPMI_NM_SUSPEND_PERIOD_MAX];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
int ipmi_nm_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
@ -26,8 +26,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#ifndef IPMI_DELLOEM_H
|
|
||||||
#define IPMI_DELLOEM_H
|
#pragma once
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -72,6 +72,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#define IDRAC_11G 1
|
#define IDRAC_11G 1
|
||||||
#define IDRAC_12G 2
|
#define IDRAC_12G 2
|
||||||
|
#define IDRAC_13G 3
|
||||||
// Return Error code for license
|
// Return Error code for license
|
||||||
#define LICENSE_NOT_SUPPORTED 0x6F
|
#define LICENSE_NOT_SUPPORTED 0x6F
|
||||||
#define VFL_NOT_LICENSED 0x33
|
#define VFL_NOT_LICENSED 0x33
|
||||||
@ -184,6 +185,9 @@ typedef struct _lcd_mode
|
|||||||
#define IMC_IDRAC_12G_MONOLITHIC (uint8_t) (0x10)
|
#define IMC_IDRAC_12G_MONOLITHIC (uint8_t) (0x10)
|
||||||
#define IMC_IDRAC_12G_MODULAR (uint8_t) (0x11)
|
#define IMC_IDRAC_12G_MODULAR (uint8_t) (0x11)
|
||||||
|
|
||||||
|
#define IMC_IDRAC_13G_MONOLITHIC (uint8_t) (0x20)
|
||||||
|
#define IMC_IDRAC_13G_MODULAR (uint8_t) (0x21)
|
||||||
|
#define IMC_IDRAC_13G_DCS (uint8_t) (0x22)
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -339,10 +343,6 @@ typedef struct _power_headroom
|
|||||||
uint16_t peakheadroom;
|
uint16_t peakheadroom;
|
||||||
} __attribute__ ((packed)) POWER_HEADROOM;
|
} __attribute__ ((packed)) POWER_HEADROOM;
|
||||||
|
|
||||||
struct vFlashstr {
|
|
||||||
uint8_t val;
|
|
||||||
const char * str;
|
|
||||||
};
|
|
||||||
typedef struct ipmi_vFlash_extended_info
|
typedef struct ipmi_vFlash_extended_info
|
||||||
{
|
{
|
||||||
uint8_t vflashcompcode;
|
uint8_t vflashcompcode;
|
||||||
@ -362,5 +362,3 @@ typedef struct _SensorReadingType
|
|||||||
}SensorReadingType;
|
}SensorReadingType;
|
||||||
uint16_t compareinputwattage(IPMI_POWER_SUPPLY_INFO* powersupplyinfo, uint16_t inputwattage);
|
uint16_t compareinputwattage(IPMI_POWER_SUPPLY_INFO* powersupplyinfo, uint16_t inputwattage);
|
||||||
int ipmi_delloem_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_delloem_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /*IPMI_DELLOEM_H*/
|
|
||||||
|
@ -33,8 +33,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_EKANALYZER_H
|
#pragma once
|
||||||
#define IPMI_EKANALYZER_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
@ -64,5 +63,3 @@
|
|||||||
#define FRU_RADIAL_IPMB0_LINK_MAPPING 0x15
|
#define FRU_RADIAL_IPMB0_LINK_MAPPING 0x15
|
||||||
|
|
||||||
int ipmi_ekanalyzer_main(struct ipmi_intf *, int, char **);
|
int ipmi_ekanalyzer_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /* IPMI_EKANALYZER_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_ENTITY_H
|
#pragma once
|
||||||
#define IPMI_ENTITY_H
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -49,5 +48,3 @@ struct entity_id {
|
|||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* IPMI_ENTITY_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_EVENT_H
|
#pragma once
|
||||||
#define IPMI_EVENT_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -61,6 +60,31 @@ struct platform_event_msg {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ipmi_event_main(struct ipmi_intf *, int, char **);
|
/* See IPMI 2.0 Specification, Appendix G, Table G-1, "Event Commands" */
|
||||||
|
typedef enum {
|
||||||
|
IPMI_CMD_SET_EVENT_RCVR = 0,
|
||||||
|
IPMI_CMD_GET_EVENT_RCVR,
|
||||||
|
IPMI_CMD_PLATFORM_EVENT
|
||||||
|
} ipmi_event_cmd_t;
|
||||||
|
|
||||||
#endif /*IPMI_EVENT_H*/
|
typedef enum {
|
||||||
|
PLATFORM_EVENT_DATA_LEN_NON_SI = sizeof(struct platform_event_msg),
|
||||||
|
PLATFORM_EVENT_DATA_LEN_SI, /* System interfaces require generator ID */
|
||||||
|
PLATFORM_EVENT_DATA_LEN_MAX = PLATFORM_EVENT_DATA_LEN_SI
|
||||||
|
} ipmi_platform_event_data_len_t;
|
||||||
|
|
||||||
|
/* See Table 5-4 */
|
||||||
|
typedef enum {
|
||||||
|
EVENT_SWID_BIOS_BASE = 0x00, /* BIOS */
|
||||||
|
EVENT_SWID_SMI_BASE = 0x10, /* SMI Handler */
|
||||||
|
EVENT_SWID_SMS_BASE = 0x20, /* System Management Software */
|
||||||
|
EVENT_SWID_OEM_BASE = 0x30, /* OEM */
|
||||||
|
EVENT_SWID_REMOTE_CONSOLE_BASE = 0x40, /* Remote Console SW */
|
||||||
|
EVENT_SWID_TERMINAL_MODE_BASE = 0x47 /* Terminal Mode RC SW */
|
||||||
|
} ipmi_event_swid_t;
|
||||||
|
#define EVENT_SWID(base, index) ((EVENT_SWID_##base##_BASE + index) & 0x7F)
|
||||||
|
|
||||||
|
/* See Figure 29-2, Table 32-1 */
|
||||||
|
#define EVENT_GENERATOR(base, index) (EVENT_SWID(base,index) << 1 | 1)
|
||||||
|
|
||||||
|
int ipmi_event_main(struct ipmi_intf *, int, char **);
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_FIREWALL_H
|
#pragma once
|
||||||
#define IPMI_FIREWALL_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -102,5 +101,3 @@ static inline int bit_test(const unsigned char * bf, int n) {
|
|||||||
static inline void bit_set(unsigned char * bf, int n, int v) {
|
static inline void bit_set(unsigned char * bf, int n, int v) {
|
||||||
bf[n>>3] = (bf[n>>3] & ~(1<<(n%8))) | ((v?1:0)<<(n%8));
|
bf[n>>3] = (bf[n>>3] & ~(1<<(n%8))) | ((v?1:0)<<(n%8));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*IPMI_FIREWALL_H */
|
|
||||||
|
@ -30,17 +30,19 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_FRU_H
|
#pragma once
|
||||||
#define IPMI_FRU_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
#include <ipmitool/ipmi_sdr.h>
|
#include <ipmitool/ipmi_sdr.h>
|
||||||
|
#include <ipmitool/ipmi_time.h>
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define FRU_END_OF_FIELDS 0xc1
|
||||||
|
|
||||||
#define GET_FRU_INFO 0x10
|
#define GET_FRU_INFO 0x10
|
||||||
#define GET_FRU_DATA 0x11
|
#define GET_FRU_DATA 0x11
|
||||||
#define SET_FRU_DATA 0x12
|
#define SET_FRU_DATA 0x12
|
||||||
@ -125,6 +127,7 @@ struct fru_area_product {
|
|||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
|
/* See Table 16-1 of "IPMI FRU Information Storage Specification" */
|
||||||
struct fru_multirec_header {
|
struct fru_multirec_header {
|
||||||
#define FRU_RECORD_TYPE_POWER_SUPPLY_INFORMATION 0x00
|
#define FRU_RECORD_TYPE_POWER_SUPPLY_INFORMATION 0x00
|
||||||
#define FRU_RECORD_TYPE_DC_OUTPUT 0x01
|
#define FRU_RECORD_TYPE_DC_OUTPUT 0x01
|
||||||
@ -134,6 +137,8 @@ struct fru_multirec_header {
|
|||||||
#define FRU_RECORD_TYPE_EXTENDED_COMPATIBILITY 0x05
|
#define FRU_RECORD_TYPE_EXTENDED_COMPATIBILITY 0x05
|
||||||
#define FRU_RECORD_TYPE_OEM_EXTENSION 0xc0
|
#define FRU_RECORD_TYPE_OEM_EXTENSION 0xc0
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
|
#define FRU_RECORD_FORMAT_EOL_MASK 0x80
|
||||||
|
#define FRU_RECORD_FORMAT_VER_MASK 0x0F
|
||||||
uint8_t format;
|
uint8_t format;
|
||||||
uint8_t len;
|
uint8_t len;
|
||||||
uint8_t record_checksum;
|
uint8_t record_checksum;
|
||||||
@ -193,9 +198,6 @@ struct fru_multirec_powersupply {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char * combined_voltage_desc[] __attribute__((unused)) = {
|
|
||||||
"12 V", "-12 V", "5 V", "3.3 V"};
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
@ -242,6 +244,43 @@ struct fru_multirec_dcload {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(push, 1)
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* In accordance with Table 18-7 of "IPMI Platform Management FRU Information
|
||||||
|
* Storage Definition v1.0"
|
||||||
|
*/
|
||||||
|
struct fru_multirec_mgmt {
|
||||||
|
#define FRU_MULTIREC_MGMT_SUBTYPE_MIN 0x01
|
||||||
|
#define FRU_MULTIREC_MGMT_SUBTYPE_MAX 0x07
|
||||||
|
uint8_t subtype;
|
||||||
|
#define FRU_MULTIREC_MGMT_SYSURL 0x01
|
||||||
|
#define FRU_MULTIREC_MGMT_CMPURL 0x04
|
||||||
|
#define FRU_MULTIREC_MGMT_URL_MINLEN 16
|
||||||
|
#define FRU_MULTIREC_MGMT_URL_MAXLEN 256
|
||||||
|
|
||||||
|
#define FRU_MULTIREC_MGMT_SYSNAME 0x02
|
||||||
|
#define FRU_MULTIREC_MGMT_CMPNAME 0x05
|
||||||
|
#define FRU_MULTIREC_MGMT_NAME_MINLEN 8
|
||||||
|
#define FRU_MULTIREC_MGMT_NAME_MAXLEN 64
|
||||||
|
|
||||||
|
#define FRU_MULTIREC_MGMT_SYSPINGADDR 0x03
|
||||||
|
#define FRU_MULTIREC_MGMT_CMPPINGADDR 0x06
|
||||||
|
#define FRU_MULTIREC_MGMT_PINGADDR_MINLEN 8
|
||||||
|
#define FRU_MULTIREC_MGMT_PINGADDR_MAXLEN 64
|
||||||
|
|
||||||
|
#define FRU_MULTIREC_MGMT_UUID 0x07
|
||||||
|
#define FRU_MULTIREC_MGMT_UUID_LEN 16
|
||||||
|
|
||||||
|
#define FRU_MULTIREC_MGMT_DATA_MAXLEN FRU_MULTIREC_MGMT_URL_MAXLEN
|
||||||
|
uint8_t data[];
|
||||||
|
} ATTRIBUTE_PACKING;
|
||||||
|
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
@ -297,22 +336,24 @@ struct fru_picmgext_link_desc {
|
|||||||
unsigned int desig_channel:6;
|
unsigned int desig_channel:6;
|
||||||
unsigned int desig_if:2;
|
unsigned int desig_if:2;
|
||||||
unsigned int desig_port:4;
|
unsigned int desig_port:4;
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01
|
#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05
|
#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05
|
||||||
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD 0x32
|
||||||
unsigned int type:8;
|
unsigned int type:8;
|
||||||
unsigned int ext:4;
|
unsigned int ext:4;
|
||||||
unsigned int grouping:8;
|
unsigned int grouping:8;
|
||||||
#else
|
#else
|
||||||
unsigned int grouping:8;
|
unsigned int grouping:8;
|
||||||
unsigned int ext:4;
|
unsigned int ext:4;
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01
|
#define FRU_PICMGEXT_LINK_TYPE_BASE 0x01
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET 0x02
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND 0x03
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR 0x04
|
||||||
#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05
|
#define FRU_PICMGEXT_LINK_TYPE_PCIE 0x05
|
||||||
|
#define FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET_10GBD 0x32
|
||||||
unsigned int type:8;
|
unsigned int type:8;
|
||||||
unsigned int desig_port:4;
|
unsigned int desig_port:4;
|
||||||
unsigned int desig_if:2;
|
unsigned int desig_if:2;
|
||||||
@ -588,20 +629,28 @@ struct fru_picmgext_amc_link_desc_record {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* IPMI Return codes for Get FRU Inventory Area and Write FRU Inventory Area */
|
||||||
|
/* PROTECTED_OFFSET Only expected on write command failures. */
|
||||||
|
#define IPMI_CC_FRU_WRITE_PROTECTED_OFFSET 0x80
|
||||||
|
#define IPMI_CC_FRU_DEVICE_BUSY 0x81
|
||||||
|
|
||||||
/* FRU Board manufacturing date */
|
/* FRU Board manufacturing date */
|
||||||
static const uint64_t secs_from_1970_1996 = 820454400;
|
#define FRU_BOARD_DATE_UNSPEC 0 /* IPMI FRU Information Storage Definition
|
||||||
static const char * chassis_type_desc[] __attribute__((unused)) = {
|
v1.0 rev 1.3, Table 11-1 */
|
||||||
"Unspecified", "Other", "Unknown",
|
static inline time_t ipmi_fru2time_t(void *mfg_date) {
|
||||||
"Desktop", "Low Profile Desktop", "Pizza Box",
|
const uint64_t secs_from_1970_1996 = 820454400;
|
||||||
"Mini Tower", "Tower",
|
uint32_t fru_ts = ipmi24toh(mfg_date);
|
||||||
"Portable", "LapTop", "Notebook", "Hand Held",
|
time_t ts;
|
||||||
"Docking Station", "All in One", "Sub Notebook",
|
|
||||||
"Space-saving", "Lunch Box", "Main Server Chassis",
|
if (FRU_BOARD_DATE_UNSPEC == fru_ts) {
|
||||||
"Expansion Chassis", "SubChassis", "Bus Expansion Chassis",
|
ts = IPMI_TIME_UNSPECIFIED;
|
||||||
"Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis",
|
}
|
||||||
"Sealed-case PC", "Multi-system Chassis", "CompactPCI",
|
else {
|
||||||
"AdvancedTCA", "Blade", "Blade Enclosure"
|
ts = fru_ts * 60 + secs_from_1970_1996;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct ipmi_fru_bloc {
|
typedef struct ipmi_fru_bloc {
|
||||||
struct ipmi_fru_bloc * next;
|
struct ipmi_fru_bloc * next;
|
||||||
@ -610,14 +659,6 @@ typedef struct ipmi_fru_bloc {
|
|||||||
uint8_t blocId[32];
|
uint8_t blocId[32];
|
||||||
} t_ipmi_fru_bloc;
|
} 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_main(struct ipmi_intf *intf, int argc, char **argv);
|
||||||
int ipmi_fru_print(struct ipmi_intf *intf, struct sdr_record_fru_locator *fru);
|
int ipmi_fru_print(struct ipmi_intf *intf, struct sdr_record_fru_locator *fru);
|
||||||
|
char *get_fru_area_str(uint8_t *data, uint32_t *offset);
|
||||||
#endif /* IPMI_FRU_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_KFWUM_H
|
#pragma once
|
||||||
# define IPMI_KFWUM_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
@ -239,5 +238,3 @@ struct KfwumFinishFirmwareDownloadReq {
|
|||||||
# ifdef HAVE_PRAGMA_PACK
|
# ifdef HAVE_PRAGMA_PACK
|
||||||
# pragma pack(0)
|
# pragma pack(0)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#endif /* IPMI_KFWUM_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_GENDEV_H
|
#pragma once
|
||||||
#define IPMI_GENDEV_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -44,5 +43,3 @@
|
|||||||
#include <ipmitool/ipmi_entity.h>
|
#include <ipmitool/ipmi_entity.h>
|
||||||
|
|
||||||
int ipmi_gendev_main(struct ipmi_intf *, int, char **);
|
int ipmi_gendev_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /* IPMI_GENDEV_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_HPMFWUPG_H
|
#pragma once
|
||||||
#define IPMI_HPMFWUPG_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
@ -72,23 +71,6 @@ int ipmi_hpmfwupg_main(struct ipmi_intf *, int, char **);
|
|||||||
#define HPMFWUPG_FW_MISMATCH 0x83
|
#define HPMFWUPG_FW_MISMATCH 0x83
|
||||||
#define HPMFWUPG_ROLLBACK_DENIED 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 */
|
/* HPM FIRMWARE UPGRADE GENERAL DEFINITIONS */
|
||||||
#define HPMFWUPG_PICMG_IDENTIFIER 0
|
#define HPMFWUPG_PICMG_IDENTIFIER 0
|
||||||
#define HPMFWUPG_VERSION_SIZE 6
|
#define HPMFWUPG_VERSION_SIZE 6
|
||||||
@ -437,7 +419,7 @@ struct HpmfwupgInitiateUpgradeActionCtx {
|
|||||||
struct HpmfwupgUploadFirmwareBlockReq {
|
struct HpmfwupgUploadFirmwareBlockReq {
|
||||||
unsigned char picmgId;
|
unsigned char picmgId;
|
||||||
unsigned char blockNumber;
|
unsigned char blockNumber;
|
||||||
unsigned char data[0];
|
unsigned char data[];
|
||||||
} ATTRIBUTE_PACKING;
|
} ATTRIBUTE_PACKING;
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
# pragma pack(0)
|
# pragma pack(0)
|
||||||
@ -796,13 +778,10 @@ typedef struct _VERSIONINFO {
|
|||||||
unsigned char imageAux[4];
|
unsigned char imageAux[4];
|
||||||
unsigned char coldResetRequired;
|
unsigned char coldResetRequired;
|
||||||
unsigned char rollbackSupported;
|
unsigned char rollbackSupported;
|
||||||
|
unsigned char deferredActivationSupported;
|
||||||
char descString[HPMFWUPG_DESC_STRING_LENGTH + 1];
|
char descString[HPMFWUPG_DESC_STRING_LENGTH + 1];
|
||||||
}VERSIONINFO, *PVERSIONINFO;
|
}VERSIONINFO, *PVERSIONINFO;
|
||||||
|
|
||||||
VERSIONINFO gVersionInfo[HPMFWUPG_COMPONENT_ID_MAX];
|
|
||||||
|
|
||||||
#define TARGET_VER (0x01)
|
#define TARGET_VER (0x01)
|
||||||
#define ROLLBACK_VER (0x02)
|
#define ROLLBACK_VER (0x02)
|
||||||
#define IMAGE_VER (0x04)
|
#define IMAGE_VER (0x04)
|
||||||
|
|
||||||
#endif /* IPMI_KFWUM_H */
|
|
||||||
|
5
include/ipmitool/ipmi_ime.h
Executable file → Normal file
5
include/ipmitool/ipmi_ime.h
Executable file → Normal file
@ -33,13 +33,10 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_IME_H
|
#pragma once
|
||||||
#define IPMI_IME_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
|
||||||
int ipmi_ime_main(struct ipmi_intf *, int, char **);
|
int ipmi_ime_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /* IPMI_IME_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_INTF_H
|
#pragma once
|
||||||
#define IPMI_INTF_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
#include <ipmitool/ipmi_oem.h>
|
#include <ipmitool/ipmi_oem.h>
|
||||||
@ -59,39 +58,78 @@ enum LANPLUS_SESSION_STATE {
|
|||||||
|
|
||||||
|
|
||||||
#define IPMI_AUTHCODE_BUFFER_SIZE 20
|
#define IPMI_AUTHCODE_BUFFER_SIZE 20
|
||||||
#define IPMI_SIK_BUFFER_SIZE 20
|
#define IPMI_SIK_BUFFER_SIZE IPMI_MAX_MD_SIZE
|
||||||
#define IPMI_KG_BUFFER_SIZE 21 /* key plus null byte */
|
#define IPMI_KG_BUFFER_SIZE 21 /* key plus null byte */
|
||||||
|
|
||||||
struct ipmi_session {
|
enum cipher_suite_ids {
|
||||||
uint8_t hostname[64];
|
IPMI_LANPLUS_CIPHER_SUITE_0 = 0,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_1 = 1,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_2 = 2,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_3 = 3,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_4 = 4,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_5 = 5,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_6 = 6,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_7 = 7,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_8 = 8,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_9 = 9,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_10 = 10,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_11 = 11,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_12 = 12,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_13 = 13,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_14 = 14,
|
||||||
|
#ifdef HAVE_CRYPTO_SHA256
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_15 = 15,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_16 = 16,
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_17 = 17,
|
||||||
|
#endif /* HAVE_CRYPTO_SHA256 */
|
||||||
|
IPMI_LANPLUS_CIPHER_SUITE_RESERVED = 0xff,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cipher_suite_info {
|
||||||
|
enum cipher_suite_ids cipher_suite_id;
|
||||||
|
uint8_t auth_alg;
|
||||||
|
uint8_t integrity_alg;
|
||||||
|
uint8_t crypt_alg;
|
||||||
|
uint32_t iana;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ipmi_session_params {
|
||||||
|
char * hostname;
|
||||||
uint8_t username[17];
|
uint8_t username[17];
|
||||||
uint8_t authcode[IPMI_AUTHCODE_BUFFER_SIZE + 1];
|
uint8_t authcode_set[IPMI_AUTHCODE_BUFFER_SIZE + 1];
|
||||||
uint8_t challenge[16];
|
|
||||||
uint8_t authtype;
|
|
||||||
uint8_t authtype_set;
|
uint8_t authtype_set;
|
||||||
|
uint8_t privlvl;
|
||||||
|
enum cipher_suite_ids cipher_suite_id;
|
||||||
|
char sol_escape_char;
|
||||||
|
int password;
|
||||||
|
int port;
|
||||||
|
int retry;
|
||||||
|
uint32_t timeout;
|
||||||
|
uint8_t kg[IPMI_KG_BUFFER_SIZE]; /* BMC key */
|
||||||
|
uint8_t lookupbit;
|
||||||
|
};
|
||||||
|
|
||||||
#define IPMI_AUTHSTATUS_PER_MSG_DISABLED 0x10
|
#define IPMI_AUTHSTATUS_PER_MSG_DISABLED 0x10
|
||||||
#define IPMI_AUTHSTATUS_PER_USER_DISABLED 0x08
|
#define IPMI_AUTHSTATUS_PER_USER_DISABLED 0x08
|
||||||
#define IPMI_AUTHSTATUS_NONNULL_USERS_ENABLED 0x04
|
#define IPMI_AUTHSTATUS_NONNULL_USERS_ENABLED 0x04
|
||||||
#define IPMI_AUTHSTATUS_NULL_USERS_ENABLED 0x02
|
#define IPMI_AUTHSTATUS_NULL_USERS_ENABLED 0x02
|
||||||
#define IPMI_AUTHSTATUS_ANONYMOUS_USERS_ENABLED 0x01
|
#define IPMI_AUTHSTATUS_ANONYMOUS_USERS_ENABLED 0x01
|
||||||
uint8_t authstatus;
|
|
||||||
uint8_t authextra;
|
|
||||||
uint8_t privlvl;
|
|
||||||
uint8_t cipher_suite_id;
|
|
||||||
char sol_escape_char;
|
|
||||||
int password;
|
|
||||||
int port;
|
|
||||||
int active;
|
|
||||||
int retry;
|
|
||||||
|
|
||||||
|
struct ipmi_session {
|
||||||
|
int active;
|
||||||
uint32_t session_id;
|
uint32_t session_id;
|
||||||
uint32_t in_seq;
|
uint32_t in_seq;
|
||||||
uint32_t out_seq;
|
uint32_t out_seq;
|
||||||
|
|
||||||
|
uint8_t authcode[IPMI_AUTHCODE_BUFFER_SIZE + 1];
|
||||||
|
uint8_t challenge[16];
|
||||||
|
uint8_t authtype;
|
||||||
|
uint8_t authstatus;
|
||||||
|
uint8_t authextra;
|
||||||
uint32_t timeout;
|
uint32_t timeout;
|
||||||
|
|
||||||
struct sockaddr_storage addr;
|
struct sockaddr_storage addr;
|
||||||
socklen_t addrlen;
|
socklen_t addrlen;
|
||||||
int ai_family; /* Protocol family for socket. */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This struct holds state data specific to IPMI v2 / RMCP+ sessions
|
* This struct holds state data specific to IPMI v2 / RMCP+ sessions
|
||||||
@ -107,13 +145,12 @@ struct ipmi_session {
|
|||||||
uint8_t integrity_alg;
|
uint8_t integrity_alg;
|
||||||
uint8_t crypt_alg;
|
uint8_t crypt_alg;
|
||||||
uint8_t max_priv_level;
|
uint8_t max_priv_level;
|
||||||
uint8_t lookupbit;
|
|
||||||
|
|
||||||
uint32_t console_id;
|
uint32_t console_id;
|
||||||
uint32_t bmc_id;
|
uint32_t bmc_id;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Values required for RAKP mesages
|
* Values required for RAKP messages
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Random number generated byt the console */
|
/* Random number generated byt the console */
|
||||||
@ -125,10 +162,13 @@ struct ipmi_session {
|
|||||||
uint8_t requested_role; /* As sent in the RAKP 1 message */
|
uint8_t requested_role; /* As sent in the RAKP 1 message */
|
||||||
uint8_t rakp2_return_code;
|
uint8_t rakp2_return_code;
|
||||||
|
|
||||||
uint8_t sik[IPMI_SIK_BUFFER_SIZE]; /* Session integrity key */
|
uint8_t sik[IPMI_SIK_BUFFER_SIZE]; /* Session integrity key */
|
||||||
uint8_t kg[IPMI_KG_BUFFER_SIZE]; /* BMC key */
|
uint8_t sik_len; /* Session Integrity key length */
|
||||||
uint8_t k1[20]; /* Used for Integrity checking? */
|
uint8_t kg[IPMI_KG_BUFFER_SIZE]; /* BMC key */
|
||||||
uint8_t k2[20]; /* First 16 bytes used for AES */
|
uint8_t k1[IPMI_MAX_MD_SIZE]; /* Used for Integrity checking? */
|
||||||
|
uint8_t k1_len; /* K1 key length */
|
||||||
|
uint8_t k2[IPMI_MAX_MD_SIZE]; /* First 16 bytes used for AES */
|
||||||
|
uint8_t k2_len; /* K2 key length */
|
||||||
} v2_data;
|
} v2_data;
|
||||||
|
|
||||||
|
|
||||||
@ -168,8 +208,11 @@ struct ipmi_intf {
|
|||||||
int abort;
|
int abort;
|
||||||
int noanswer;
|
int noanswer;
|
||||||
int picmg_avail;
|
int picmg_avail;
|
||||||
|
int vita_avail;
|
||||||
IPMI_OEM manufacturer_id;
|
IPMI_OEM manufacturer_id;
|
||||||
|
int ai_family;
|
||||||
|
|
||||||
|
struct ipmi_session_params ssn_params;
|
||||||
struct ipmi_session * session;
|
struct ipmi_session * session;
|
||||||
struct ipmi_oem_handle * oem;
|
struct ipmi_oem_handle * oem;
|
||||||
struct ipmi_cmd * cmdlist;
|
struct ipmi_cmd * cmdlist;
|
||||||
@ -189,7 +232,6 @@ struct ipmi_intf {
|
|||||||
int (*open)(struct ipmi_intf * intf);
|
int (*open)(struct ipmi_intf * intf);
|
||||||
void (*close)(struct ipmi_intf * intf);
|
void (*close)(struct ipmi_intf * intf);
|
||||||
struct ipmi_rs *(*sendrecv)(struct ipmi_intf * intf, struct ipmi_rq * req);
|
struct ipmi_rs *(*sendrecv)(struct ipmi_intf * intf, struct ipmi_rq * req);
|
||||||
int (*sendrsp)(struct ipmi_intf * intf, struct ipmi_rs * rsp);
|
|
||||||
struct ipmi_rs *(*recv_sol)(struct ipmi_intf * intf);
|
struct ipmi_rs *(*recv_sol)(struct ipmi_intf * intf);
|
||||||
struct ipmi_rs *(*send_sol)(struct ipmi_intf * intf, struct ipmi_v2_payload * payload);
|
struct ipmi_rs *(*send_sol)(struct ipmi_intf * intf, struct ipmi_v2_payload * payload);
|
||||||
int (*keepalive)(struct ipmi_intf * intf);
|
int (*keepalive)(struct ipmi_intf * intf);
|
||||||
@ -198,6 +240,10 @@ struct ipmi_intf {
|
|||||||
void (*set_max_response_data_size)(struct ipmi_intf * intf, uint16_t size);
|
void (*set_max_response_data_size)(struct ipmi_intf * intf, uint16_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint16_t ipmi_intf_get_max_request_data_size(struct ipmi_intf *intf);
|
||||||
|
uint16_t ipmi_intf_get_max_response_data_size(struct ipmi_intf *intf);
|
||||||
|
uint8_t ipmi_intf_get_bridging_level(const struct ipmi_intf *intf);
|
||||||
|
|
||||||
struct ipmi_intf * ipmi_intf_load(char * name);
|
struct ipmi_intf * ipmi_intf_load(char * name);
|
||||||
void ipmi_intf_print(struct ipmi_intf_support * intflist);
|
void ipmi_intf_print(struct ipmi_intf_support * intflist);
|
||||||
|
|
||||||
@ -206,16 +252,19 @@ void ipmi_intf_session_set_username(struct ipmi_intf * intf, char * username);
|
|||||||
void ipmi_intf_session_set_password(struct ipmi_intf * intf, char * password);
|
void ipmi_intf_session_set_password(struct ipmi_intf * intf, char * password);
|
||||||
void ipmi_intf_session_set_privlvl(struct ipmi_intf * intf, uint8_t privlvl);
|
void ipmi_intf_session_set_privlvl(struct ipmi_intf * intf, uint8_t privlvl);
|
||||||
void ipmi_intf_session_set_lookupbit(struct ipmi_intf * intf, uint8_t lookupbit);
|
void ipmi_intf_session_set_lookupbit(struct ipmi_intf * intf, uint8_t lookupbit);
|
||||||
void ipmi_intf_session_set_cipher_suite_id(struct ipmi_intf * intf, uint8_t cipher_suite_id);
|
#ifdef IPMI_INTF_LANPLUS
|
||||||
|
void ipmi_intf_session_set_cipher_suite_id(struct ipmi_intf * intf,
|
||||||
|
enum cipher_suite_ids cipher_suite_id);
|
||||||
|
#endif /* IPMI_INTF_LANPLUS */
|
||||||
void ipmi_intf_session_set_sol_escape_char(struct ipmi_intf * intf, char sol_escape_char);
|
void ipmi_intf_session_set_sol_escape_char(struct ipmi_intf * intf, char sol_escape_char);
|
||||||
void ipmi_intf_session_set_kgkey(struct ipmi_intf * intf, char * kgkey);
|
void ipmi_intf_session_set_kgkey(struct ipmi_intf *intf, const uint8_t *kgkey);
|
||||||
void ipmi_intf_session_set_port(struct ipmi_intf * intf, int port);
|
void ipmi_intf_session_set_port(struct ipmi_intf * intf, int port);
|
||||||
void ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype);
|
void ipmi_intf_session_set_authtype(struct ipmi_intf * intf, uint8_t authtype);
|
||||||
void ipmi_intf_session_set_timeout(struct ipmi_intf * intf, uint32_t timeout);
|
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_intf_session_set_retry(struct ipmi_intf * intf, int retry);
|
||||||
|
void ipmi_intf_session_cleanup(struct ipmi_intf *intf);
|
||||||
void ipmi_cleanup(struct ipmi_intf * intf);
|
void ipmi_cleanup(struct ipmi_intf * intf);
|
||||||
|
|
||||||
#if defined(IPMI_INTF_LAN) || defined (IPMI_INTF_LANPLUS)
|
#if defined(IPMI_INTF_LAN) || defined (IPMI_INTF_LANPLUS)
|
||||||
int ipmi_intf_socket_connect(struct ipmi_intf * intf);
|
int ipmi_intf_socket_connect(struct ipmi_intf * intf);
|
||||||
#endif
|
#endif
|
||||||
#endif /* IPMI_INTF_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_ISOL_H
|
#pragma once
|
||||||
#define IPMI_ISOL_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -53,5 +52,3 @@ struct isol_config_parameters {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int ipmi_isol_main(struct ipmi_intf *, int, char **);
|
int ipmi_isol_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /* IPMI_SOL_H */
|
|
||||||
|
@ -33,8 +33,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_KONTRONOEM_H
|
#pragma once
|
||||||
#define IPMI_KONTRONOEM_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
@ -42,5 +41,3 @@
|
|||||||
|
|
||||||
int ipmi_kontronoem_main(struct ipmi_intf *, int, char **);
|
int ipmi_kontronoem_main(struct ipmi_intf *, int, char **);
|
||||||
int ipmi_kontronoem_set_large_buffer(struct ipmi_intf *, unsigned char size);
|
int ipmi_kontronoem_set_large_buffer(struct ipmi_intf *, unsigned char size);
|
||||||
|
|
||||||
#endif /* IPMI_KONTRONOEM_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_LANP_H
|
#pragma once
|
||||||
#define IPMI_LANP_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -50,6 +49,13 @@
|
|||||||
#define IPMI_LANP_WRITE_LOCK 1
|
#define IPMI_LANP_WRITE_LOCK 1
|
||||||
#define IPMI_LANP_WRITE_COMMIT 2
|
#define IPMI_LANP_WRITE_COMMIT 2
|
||||||
|
|
||||||
|
#define IPMI_LANP_VLAN_ID_MAX 4094
|
||||||
|
#define IPMI_LANP_VLAN_ID_MIN 1
|
||||||
|
#define IPMI_LANP_VLAN_DISABLE 0 /* ID 0 = VLAN is disabled for the channel */
|
||||||
|
|
||||||
|
#define IPMI_LANP_IS_VLAN_VALID(x) \
|
||||||
|
((x) >= IPMI_LANP_VLAN_ID_MIN && (x) <= IPMI_LANP_VLAN_ID_MAX)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IPMI_LANP_SET_IN_PROGRESS,
|
IPMI_LANP_SET_IN_PROGRESS,
|
||||||
IPMI_LANP_AUTH_TYPE,
|
IPMI_LANP_AUTH_TYPE,
|
||||||
@ -76,6 +82,39 @@ enum {
|
|||||||
IPMI_LANP_RMCP_CIPHER_SUPPORT,
|
IPMI_LANP_RMCP_CIPHER_SUPPORT,
|
||||||
IPMI_LANP_RMCP_CIPHERS,
|
IPMI_LANP_RMCP_CIPHERS,
|
||||||
IPMI_LANP_RMCP_PRIV_LEVELS,
|
IPMI_LANP_RMCP_PRIV_LEVELS,
|
||||||
|
IPMI_LANP_VLAN_TAGS,
|
||||||
|
IPMI_LANP_BAD_PASS_THRESH,
|
||||||
|
IPMI_LANP_IP6_SUPPORT=50,
|
||||||
|
IPMI_LANP_IP6_ENABLES,
|
||||||
|
IPMI_LANP_IP6_TRAFFIC_CLASS,
|
||||||
|
IPMI_LANP_IP6_STATIC_HOPS,
|
||||||
|
IPMI_LANP_IP6_FLOW_LABEL,
|
||||||
|
IPMI_LANP_IP6_STATUS,
|
||||||
|
IPMI_LANP_IP6_STATIC_ADDR,
|
||||||
|
IPMI_LANP_IP6_STATIC_DUID_STG,
|
||||||
|
IPMI_LANP_IP6_STATIC_DUID,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_ADDR,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_DUID_STG,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_DUID,
|
||||||
|
IPMI_LANP_IP6_DHCP6_CFG_SUP,
|
||||||
|
IPMI_LANP_IP6_DHCP6_CFG,
|
||||||
|
IPMI_LANP_IP6_ROUTER_CFG,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR1_ADDR,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR1_MAC,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR1_PFX_LEN,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR1_PFX,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR2_ADDR,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR2_MAC,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR2_PFX_LEN,
|
||||||
|
IPMI_LANP_IP6_STATIC_RTR2_PFX,
|
||||||
|
IPMI_LANP_IP6_NUM_DYNAMIC_RTRS,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_RTR_ADDR,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_RTR_MAC,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_RTR_PFX_LEN,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_RTR_PFX,
|
||||||
|
IPMI_LANP_IP6_DYNAMIC_HOPS,
|
||||||
|
IPMI_LANP_IP6_NDSLAAC_CFG_SUP,
|
||||||
|
IPMI_LANP_IP6_NDSLAAC_CFG,
|
||||||
IPMI_LANP_OEM_ALERT_STRING=96,
|
IPMI_LANP_OEM_ALERT_STRING=96,
|
||||||
IPMI_LANP_ALERT_RETRY=97,
|
IPMI_LANP_ALERT_RETRY=97,
|
||||||
IPMI_LANP_UTC_OFFSET=98,
|
IPMI_LANP_UTC_OFFSET=98,
|
||||||
@ -85,48 +124,6 @@ enum {
|
|||||||
IPMI_LANP_CHAN_ACCESS_MODE=201,
|
IPMI_LANP_CHAN_ACCESS_MODE=201,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct lan_param {
|
|
||||||
int cmd;
|
|
||||||
int size;
|
|
||||||
char desc[24];
|
|
||||||
uint8_t * data;
|
|
||||||
int data_len;
|
|
||||||
} ipmi_lan_params[] __attribute__((unused)) = {
|
|
||||||
{ IPMI_LANP_SET_IN_PROGRESS, 1, "Set in Progress" },
|
|
||||||
{ IPMI_LANP_AUTH_TYPE, 1, "Auth Type Support" },
|
|
||||||
{ IPMI_LANP_AUTH_TYPE_ENABLE, 5, "Auth Type Enable" },
|
|
||||||
{ IPMI_LANP_IP_ADDR, 4, "IP Address" },
|
|
||||||
{ IPMI_LANP_IP_ADDR_SRC, 1, "IP Address Source" },
|
|
||||||
{ IPMI_LANP_MAC_ADDR, 6, "MAC Address" }, /* 5 */
|
|
||||||
{ IPMI_LANP_SUBNET_MASK, 4, "Subnet Mask" },
|
|
||||||
{ IPMI_LANP_IP_HEADER, 3, "IP Header" },
|
|
||||||
{ IPMI_LANP_PRI_RMCP_PORT, 2, "Primary RMCP Port" },
|
|
||||||
{ IPMI_LANP_SEC_RMCP_PORT, 2, "Secondary RMCP Port" },
|
|
||||||
{ IPMI_LANP_BMC_ARP, 1, "BMC ARP Control" }, /* 10 */
|
|
||||||
{ IPMI_LANP_GRAT_ARP, 1, "Gratituous ARP Intrvl" },
|
|
||||||
{ IPMI_LANP_DEF_GATEWAY_IP, 4, "Default Gateway IP" },
|
|
||||||
{ IPMI_LANP_DEF_GATEWAY_MAC, 6, "Default Gateway MAC" },
|
|
||||||
{ IPMI_LANP_BAK_GATEWAY_IP, 4, "Backup Gateway IP" },
|
|
||||||
{ IPMI_LANP_BAK_GATEWAY_MAC, 6, "Backup Gateway MAC" }, /* 15 */
|
|
||||||
{ IPMI_LANP_SNMP_STRING, 18, "SNMP Community String" },
|
|
||||||
{ IPMI_LANP_NUM_DEST, 1, "Number of Destinations"},
|
|
||||||
{ IPMI_LANP_DEST_TYPE, 4, "Destination Type" },
|
|
||||||
{ IPMI_LANP_DEST_ADDR, 13, "Destination Addresses" },
|
|
||||||
{ IPMI_LANP_VLAN_ID, 2, "802.1q VLAN ID" }, /* 20 */
|
|
||||||
{ IPMI_LANP_VLAN_PRIORITY, 1, "802.1q VLAN Priority" },
|
|
||||||
{ IPMI_LANP_RMCP_CIPHER_SUPPORT,1, "RMCP+ Cipher Suite Count" },
|
|
||||||
{ IPMI_LANP_RMCP_CIPHERS, 16, "RMCP+ Cipher Suites" },
|
|
||||||
{ IPMI_LANP_RMCP_PRIV_LEVELS, 9, "Cipher Suite Priv Max" },
|
|
||||||
{ IPMI_LANP_OEM_ALERT_STRING, 28, "OEM Alert String" }, /* 25 */
|
|
||||||
{ IPMI_LANP_ALERT_RETRY, 1, "Alert Retry Algorithm" },
|
|
||||||
{ IPMI_LANP_UTC_OFFSET, 3, "UTC Offset" },
|
|
||||||
{ IPMI_LANP_DHCP_SERVER_IP, 4, "DHCP Server IP" },
|
|
||||||
{ IPMI_LANP_DHCP_SERVER_MAC, 6, "DHDP Server MAC" },
|
|
||||||
{ IPMI_LANP_DHCP_ENABLE, 1, "DHCP Enable" }, /* 30 */
|
|
||||||
{ IPMI_LANP_CHAN_ACCESS_MODE, 2, "Channel Access Mode" },
|
|
||||||
{ -1 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int ipmi_lanp_main(struct ipmi_intf *, int, char **);
|
int ipmi_lanp_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /*IPMI_LANP_H*/
|
uint8_t find_lan_channel(struct ipmi_intf *intf, uint8_t start);
|
||||||
|
52
include/ipmitool/ipmi_lanp6.h
Normal file
52
include/ipmitool/ipmi_lanp6.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 Pentair Technical Products. All right reserved
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Pentair Technical Products or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* LAN configuration parameter.
|
||||||
|
*/
|
||||||
|
struct ipmi_lanp {
|
||||||
|
int selector;
|
||||||
|
const char *name;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Private data for LAN configuration.
|
||||||
|
*/
|
||||||
|
struct ipmi_lanp_priv {
|
||||||
|
struct ipmi_intf *intf;
|
||||||
|
int channel;
|
||||||
|
};
|
@ -30,13 +30,10 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_MAIN_H
|
#pragma once
|
||||||
#define IPMI_MAIN_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi_intf.h>
|
#include <ipmitool/ipmi_intf.h>
|
||||||
|
|
||||||
int ipmi_main(int argc, char ** argv, struct ipmi_cmd * cmdlist, struct ipmi_intf_support * intflist);
|
int ipmi_main(int argc, char ** argv, struct ipmi_cmd * cmdlist, struct ipmi_intf_support * intflist);
|
||||||
void ipmi_cmd_print(struct ipmi_cmd * cmdlist);
|
void ipmi_cmd_print(struct ipmi_cmd * cmdlist);
|
||||||
int ipmi_cmd_run(struct ipmi_intf * intf, char * name, int argc, char ** argv);
|
int ipmi_cmd_run(struct ipmi_intf * intf, char * name, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /* IPMI_MAIN_H */
|
|
||||||
|
@ -30,10 +30,19 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_MC_H
|
#pragma once
|
||||||
#define IPMI_MC_H
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi_strings.h>
|
||||||
|
|
||||||
|
#define OEM_MFG_STRING(oem) val2str(IPM_DEV_MANUFACTURER_ID(oem),\
|
||||||
|
ipmi_oem_info)
|
||||||
|
#define OEM_PROD_STRING(oem, p) oemval2str(IPM_DEV_MANUFACTURER_ID(oem),\
|
||||||
|
ipmi16toh(p),\
|
||||||
|
ipmi_oem_product_info)
|
||||||
|
|
||||||
#define BMC_GET_DEVICE_ID 0x01
|
#define BMC_GET_DEVICE_ID 0x01
|
||||||
#define BMC_COLD_RESET 0x02
|
#define BMC_COLD_RESET 0x02
|
||||||
@ -74,7 +83,7 @@ struct ipm_devid_rsp {
|
|||||||
#define IPM_DEV_DEVICE_ID_REV_MASK (0x0F) /* BCD-enoded */
|
#define IPM_DEV_DEVICE_ID_REV_MASK (0x0F) /* BCD-enoded */
|
||||||
|
|
||||||
#define IPM_DEV_FWREV1_AVAIL_MASK (0x80) /* 0 = normal operation */
|
#define IPM_DEV_FWREV1_AVAIL_MASK (0x80) /* 0 = normal operation */
|
||||||
#define IPM_DEV_FWREV1_MAJOR_MASK (0x3f) /* Major rev, BCD-encoded */
|
#define IPM_DEV_FWREV1_MAJOR_MASK (0x7f) /* Major rev, BCD-encoded */
|
||||||
|
|
||||||
#define IPM_DEV_IPMI_VER_MAJOR_MASK (0x0F) /* Major rev, BCD-encoded */
|
#define IPM_DEV_IPMI_VER_MAJOR_MASK (0x0F) /* Major rev, BCD-encoded */
|
||||||
#define IPM_DEV_IPMI_VER_MINOR_MASK (0xF0) /* Minor rev, BCD-encoded */
|
#define IPM_DEV_IPMI_VER_MINOR_MASK (0xF0) /* Minor rev, BCD-encoded */
|
||||||
@ -84,11 +93,141 @@ struct ipm_devid_rsp {
|
|||||||
#define IPM_DEV_IPMI_VERSION_MINOR(x) \
|
#define IPM_DEV_IPMI_VERSION_MINOR(x) \
|
||||||
((x & IPM_DEV_IPMI_VER_MINOR_MASK) >> IPM_DEV_IPMI_VER_MINOR_SHIFT)
|
((x & IPM_DEV_IPMI_VER_MINOR_MASK) >> IPM_DEV_IPMI_VER_MINOR_SHIFT)
|
||||||
|
|
||||||
#define IPM_DEV_MANUFACTURER_ID(x) \
|
#define IPM_DEV_MANUFACTURER_ID_RESERVED 0x0FFFFF
|
||||||
((uint32_t) ((x[2] & 0x0F) << 16 | x[1] << 8 | x[0]))
|
#define IPM_DEV_MANUFACTURER_ID(x) ipmi24toh(x)
|
||||||
|
|
||||||
#define IPM_DEV_ADTL_SUPPORT_BITS (8)
|
#define IPM_DEV_ADTL_SUPPORT_BITS (8)
|
||||||
|
|
||||||
|
/* There are lots of BMC implementations that don't follow the IPMI
|
||||||
|
* specification for GUID encoding. Some send data encoded as in
|
||||||
|
* RFC4122, some follow SMBIOS specification. We support all users
|
||||||
|
* of those buggy implementations here.
|
||||||
|
*
|
||||||
|
* Most implementations like AMI MegaRAC do it the SMBIOS way.
|
||||||
|
* This is the legacy behavior we don't want to break yet.
|
||||||
|
* That's why the last real mode is GUID_SMBIOS. If automatic
|
||||||
|
* detection finds more than one possible candidate, and
|
||||||
|
* GUID_SMBIOS is one of them, then it will take precedence.
|
||||||
|
*
|
||||||
|
* For the same reason GUID_IPMI is right before GUID_SMBIOS.
|
||||||
|
* If both RFC4122 and IPMI encodings have a valid version
|
||||||
|
* field, then IPMI takes precedence.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
/* Real modes, in reverse precedence order */
|
||||||
|
GUID_RFC4122,
|
||||||
|
GUID_IPMI,
|
||||||
|
GUID_SMBIOS,
|
||||||
|
GUID_REAL_MODES, /* Real mode count*/
|
||||||
|
/* Pseudo modes start here */
|
||||||
|
GUID_AUTO = GUID_REAL_MODES, /* Automatically detect mode */
|
||||||
|
GUID_DUMP, /* Just dump the data */
|
||||||
|
GUID_TOTAL_MODES
|
||||||
|
} ipmi_guid_mode_t;
|
||||||
|
|
||||||
|
#define GUID_NODE_SZ 6
|
||||||
|
|
||||||
|
#define GUID_VER_MASK 0x0F
|
||||||
|
#define GUID_VER_SHIFT 12
|
||||||
|
#define GUID_VERSION(t_hi) (((t_hi) >> GUID_VER_SHIFT) & GUID_VER_MASK)
|
||||||
|
#define GUID_TIME_HI(t_hi) ((t_hi) & ~(GUID_VER_MASK << GUID_VER_SHIFT))
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
GUID_VERSION_UNKNOWN = 0, /* Not valid according to any specification */
|
||||||
|
|
||||||
|
/* The following are according to IPMI/SMBIOS/RFC4122 */
|
||||||
|
GUID_VERSION_TIME, /* Time-based, recommended for IPMI */
|
||||||
|
GUID_VERSION_DCE, /* DCE Security with POSIX UIDs, not for IPMI */
|
||||||
|
GUID_VERSION_MD5, /* Name-based, using MD5 */
|
||||||
|
GUID_VERSION_RND, /* Randomly generated */
|
||||||
|
GUID_VERSION_SHA1, /* Name-based, using SHA-1 */
|
||||||
|
|
||||||
|
GUID_VERSION_MAX = GUID_VERSION_SHA1, /* The maximum supported version */
|
||||||
|
GUID_VERSION_COUNT /* The number of supported versions */
|
||||||
|
} guid_version_t;
|
||||||
|
|
||||||
|
static inline bool is_guid_version_valid(guid_version_t ver)
|
||||||
|
{
|
||||||
|
return (ver > GUID_VERSION_UNKNOWN) && (ver <= GUID_VERSION_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The structure follows IPMI v2.0, rev 1.1
|
||||||
|
* See section 20.8 */
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(1)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
uint8_t node[GUID_NODE_SZ]; /* Byte 0 is LSB */
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint8_t clock_seq_low; /* clock sequence low field */
|
||||||
|
uint8_t clock_seq_hi_and_rsvd;/* clock sequence high field */
|
||||||
|
};
|
||||||
|
uint16_t clock_seq_and_rsvd;
|
||||||
|
};
|
||||||
|
uint16_t time_hi_and_version; /* timestamp high field and version number */
|
||||||
|
uint16_t time_mid; /* timestamp middle field */
|
||||||
|
uint32_t time_low; /* timestamp low field */
|
||||||
|
} ATTRIBUTE_PACKING ipmi_guid_t;
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The structure follows RFC4122 (section 4.1.2)
|
||||||
|
* and SMBIOS v3.0.0 (section 7.2.1) */
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(1)
|
||||||
|
#endif
|
||||||
|
typedef struct {
|
||||||
|
uint32_t time_low; /* timestamp low field */
|
||||||
|
uint16_t time_mid; /* timestamp middle field */
|
||||||
|
uint16_t time_hi_and_version; /* timestamp high field and version number */
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
uint8_t clock_seq_hi_and_rsvd;/* clock sequence high field */
|
||||||
|
uint8_t clock_seq_low; /* clock sequence low field */
|
||||||
|
};
|
||||||
|
uint16_t clock_seq_and_rsvd;
|
||||||
|
};
|
||||||
|
uint8_t node[GUID_NODE_SZ]; /* Byte 0 is MSB */
|
||||||
|
} ATTRIBUTE_PACKING rfc_guid_t;
|
||||||
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
|
#pragma pack(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Parsed GUID structure */
|
||||||
|
typedef struct {
|
||||||
|
uint8_t node[GUID_NODE_SZ]; /* MSB first */
|
||||||
|
/* These are architecture-specific for easy output with printf() */
|
||||||
|
uint16_t clock_seq_and_rsvd;
|
||||||
|
uint64_t time_hi_and_version;
|
||||||
|
uint64_t time_mid;
|
||||||
|
uint64_t time_low;
|
||||||
|
/* These are the parsed values */
|
||||||
|
time_t time;
|
||||||
|
ipmi_guid_mode_t mode;
|
||||||
|
guid_version_t ver; /* Version from time_hi_and_version, if valid */
|
||||||
|
} parsed_guid_t;
|
||||||
|
|
||||||
|
parsed_guid_t ipmi_parse_guid(void *guid, ipmi_guid_mode_t guid_mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary GUID/UUID to a canonical hex string form.
|
||||||
|
* If the version/encoding of the source data is unknown,
|
||||||
|
* dump the source data as a simple hex string.
|
||||||
|
*
|
||||||
|
* @param[out] str The string representation of GUID
|
||||||
|
* @param[in] data The source binary GUID data
|
||||||
|
* @param[in] mode The conversion mode, use GUID_AUTO for automatic detection
|
||||||
|
*
|
||||||
|
* @returns The parsed GUID structure
|
||||||
|
*/
|
||||||
|
parsed_guid_t
|
||||||
|
ipmi_guid2str(char *str, const void *data, ipmi_guid_mode_t mode);
|
||||||
|
#define GUID_STR_MAXLEN 36 /* 8+4+4+4+12 bytes plus the dashes */
|
||||||
|
|
||||||
|
int _ipmi_mc_get_guid(struct ipmi_intf *intf, ipmi_guid_t *guid);
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
@ -119,14 +258,24 @@ struct ipm_selftest_rsp {
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
struct ipm_get_watchdog_rsp {
|
struct ipm_get_watchdog_rsp {
|
||||||
unsigned char timer_use;
|
unsigned char use;
|
||||||
unsigned char timer_actions;
|
unsigned char intr_action;
|
||||||
unsigned char pre_timeout;
|
unsigned char pre_timeout;
|
||||||
unsigned char timer_use_exp;
|
unsigned char exp_flags;
|
||||||
unsigned char initial_countdown_lsb;
|
union {
|
||||||
unsigned char initial_countdown_msb;
|
struct {
|
||||||
unsigned char present_countdown_lsb;
|
unsigned char initial_countdown_lsb;
|
||||||
unsigned char present_countdown_msb;
|
unsigned char initial_countdown_msb;
|
||||||
|
};
|
||||||
|
uint16_t init_cnt_le;
|
||||||
|
};
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned char present_countdown_lsb;
|
||||||
|
unsigned char present_countdown_msb;
|
||||||
|
};
|
||||||
|
uint16_t pres_cnt_le;
|
||||||
|
};
|
||||||
} ATTRIBUTE_PACKING;
|
} ATTRIBUTE_PACKING;
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
@ -151,20 +300,42 @@ struct ipm_get_watchdog_rsp {
|
|||||||
#define IPM_WATCHDOG_CLEAR_BIOS_POST 0x04
|
#define IPM_WATCHDOG_CLEAR_BIOS_POST 0x04
|
||||||
#define IPM_WATCHDOG_CLEAR_BIOS_FRB2 0x02
|
#define IPM_WATCHDOG_CLEAR_BIOS_FRB2 0x02
|
||||||
|
|
||||||
|
/* Use */
|
||||||
|
#define IPMI_WDT_USE_NOLOG_SHIFT 7
|
||||||
|
#define IPMI_WDT_USE_DONTSTOP_SHIFT 6 /* For 'set' */
|
||||||
|
#define IPMI_WDT_USE_RUNNING_SHIFT 6 /* For 'get' */
|
||||||
|
#define IPMI_WDT_USE_SHIFT 0
|
||||||
|
#define IPMI_WDT_USE_MASK 0x07
|
||||||
|
|
||||||
|
/* Pre-timeout interrupt type */
|
||||||
|
#define IPMI_WDT_INTR_SHIFT 4
|
||||||
|
#define IPMI_WDT_INTR_MASK 0x07 /* Apply to the intr value, not to the data byte */
|
||||||
|
|
||||||
|
/* Action */
|
||||||
|
#define IPMI_WDT_ACTION_SHIFT 0
|
||||||
|
#define IPMI_WDT_ACTION_MASK 0x07
|
||||||
|
|
||||||
|
#define IPMI_WDT_GET(b, s) (((b) >> (IPMI_WDT_##s##_SHIFT)) & (IPMI_WDT_##s##_MASK))
|
||||||
|
|
||||||
|
#define IS_WDT_BIT(b, s) IS_SET((b), IPMI_WDT_##s##_SHIFT)
|
||||||
|
|
||||||
/* IPMI 2.0 command for system information*/
|
/* IPMI 2.0 command for system information*/
|
||||||
#define IPMI_SET_SYS_INFO 0x58
|
#define IPMI_SET_SYS_INFO 0x58
|
||||||
#define IPMI_GET_SYS_INFO 0x59
|
#define IPMI_GET_SYS_INFO 0x59
|
||||||
#define IPMI_SYSINFO_SET0_SIZE 14
|
#define IPMI_SYSINFO_SET0_SIZE 14
|
||||||
#define IPMI_SYSINFO_SETN_SIZE 16
|
#define IPMI_SYSINFO_SETN_SIZE 16
|
||||||
|
|
||||||
|
/* System Information "Parameter selector" values: */
|
||||||
|
#define IPMI_SYSINFO_SET_STATE 0x00
|
||||||
|
#define IPMI_SYSINFO_SYSTEM_FW_VERSION 0x01
|
||||||
#define IPMI_SYSINFO_HOSTNAME 0x02
|
#define IPMI_SYSINFO_HOSTNAME 0x02
|
||||||
#define IPMI_SYSINFO_PRIMARY_OS_NAME 0x03
|
#define IPMI_SYSINFO_PRIMARY_OS_NAME 0x03
|
||||||
#define IPMI_SYSINFO_OS_NAME 0x04
|
#define IPMI_SYSINFO_OS_NAME 0x04
|
||||||
#define IPMI_SYSINFO_DELL_OS_VERSION 0xe4
|
#define IPMI_SYSINFO_DELL_OS_VERSION 0xe4
|
||||||
#define IPMI_SYSINFO_DELL_URL 0xde
|
#define IPMI_SYSINFO_DELL_URL 0xde
|
||||||
|
#define IPMI_SYSINFO_DELL_IPV6_COUNT 0xe6
|
||||||
|
#define IPMI_SYSINFO_DELL_IPV6_DESTADDR 0xf0
|
||||||
|
|
||||||
int ipmi_mc_getsysinfo(struct ipmi_intf * intf, int param, int block, int set,
|
int ipmi_mc_getsysinfo(struct ipmi_intf * intf, int param, int block, int set,
|
||||||
int len, void *buffer);
|
int len, void *buffer);
|
||||||
int ipmi_mc_setsysinfo(struct ipmi_intf * intf, int len, void *buffer);
|
int ipmi_mc_setsysinfo(struct ipmi_intf * intf, int len, void *buffer);
|
||||||
|
|
||||||
#endif /*IPMI_MC_H */
|
|
||||||
|
@ -28,8 +28,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_OEM_H
|
#pragma once
|
||||||
#define IPMI_OEM_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -43,5 +42,3 @@ struct ipmi_oem_handle {
|
|||||||
void ipmi_oem_print(void);
|
void ipmi_oem_print(void);
|
||||||
int ipmi_oem_setup(struct ipmi_intf * intf, char * oemtype);
|
int ipmi_oem_setup(struct ipmi_intf * intf, char * oemtype);
|
||||||
int ipmi_oem_active(struct ipmi_intf * intf, const char * oemtype);
|
int ipmi_oem_active(struct ipmi_intf * intf, const char * oemtype);
|
||||||
|
|
||||||
#endif /*IPMI_OEM_H*/
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF DELL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF DELL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_PEF_H
|
#pragma once
|
||||||
#define IPMI_PEF_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -40,7 +39,7 @@
|
|||||||
struct pef_capabilities { /* "get pef capabilities" response */
|
struct pef_capabilities { /* "get pef capabilities" response */
|
||||||
uint8_t version;
|
uint8_t version;
|
||||||
uint8_t actions; /* mapped by PEF_ACTION_xxx */
|
uint8_t actions; /* mapped by PEF_ACTION_xxx */
|
||||||
uint8_t tblsize;
|
uint8_t event_filter_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -111,224 +110,6 @@ struct bit_desc_map { /* description text container */
|
|||||||
struct desc_map desc_maps[128];
|
struct desc_map desc_maps[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_actions __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_ALL,
|
|
||||||
{ {"Alert", PEF_ACTION_ALERT},
|
|
||||||
{"Power-off", PEF_ACTION_POWER_DOWN},
|
|
||||||
{"Reset", PEF_ACTION_RESET},
|
|
||||||
{"Power-cycle", PEF_ACTION_POWER_CYCLE},
|
|
||||||
{"OEM-defined", PEF_ACTION_OEM},
|
|
||||||
{"Diagnostic-interrupt", PEF_ACTION_DIAGNOSTIC_INTERRUPT},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_severities __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_ANY,
|
|
||||||
{ {"Non-recoverable", PEF_SEVERITY_NON_RECOVERABLE},
|
|
||||||
{"Critical", PEF_SEVERITY_CRITICAL},
|
|
||||||
{"Warning", PEF_SEVERITY_WARNING},
|
|
||||||
{"OK", PEF_SEVERITY_OK},
|
|
||||||
{"Information", PEF_SEVERITY_INFORMATION},
|
|
||||||
{"Monitor", PEF_SEVERITY_MONITOR},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_sensortypes __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"Any", 255},
|
|
||||||
{"Temperature", 1},
|
|
||||||
{"Voltage", 2},
|
|
||||||
{"Current", 3},
|
|
||||||
{"Fan", 4},
|
|
||||||
{"Chassis Intrusion", 5},
|
|
||||||
{"Platform security breach", 6},
|
|
||||||
{"Processor", 7},
|
|
||||||
{"Power supply", 8},
|
|
||||||
{"Power Unit", 9},
|
|
||||||
{"Cooling device", 10},
|
|
||||||
{"Other (units-based)", 11},
|
|
||||||
{"Memory", 12},
|
|
||||||
{"Drive Slot", 13},
|
|
||||||
{"POST memory resize", 14},
|
|
||||||
{"POST error", 15},
|
|
||||||
{"Logging disabled", 16},
|
|
||||||
{"Watchdog 1", 17},
|
|
||||||
{"System event", 18},
|
|
||||||
{"Critical Interrupt", 19},
|
|
||||||
{"Button", 20},
|
|
||||||
{"Module/board", 21},
|
|
||||||
{"uController/coprocessor", 22},
|
|
||||||
{"Add-in card", 23},
|
|
||||||
{"Chassis", 24},
|
|
||||||
{"Chipset", 25},
|
|
||||||
{"Other (FRU)", 26},
|
|
||||||
{"Cable/interconnect", 27},
|
|
||||||
{"Terminator", 28},
|
|
||||||
{"System boot", 29},
|
|
||||||
{"Boot error", 30},
|
|
||||||
{"OS boot", 31},
|
|
||||||
{"OS critical stop", 32},
|
|
||||||
{"Slot/connector", 33},
|
|
||||||
{"ACPI power state", 34},
|
|
||||||
{"Watchdog 2", 35},
|
|
||||||
{"Platform alert", 36},
|
|
||||||
{"Entity presence", 37},
|
|
||||||
{"Monitor ASIC/IC", 38},
|
|
||||||
{"LAN", 39},
|
|
||||||
{"Management subsytem health",40},
|
|
||||||
{"Battery", 41},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_1 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"<LNC", 0}, /* '<' : getting worse */
|
|
||||||
{">LNC", 1}, /* '>' : getting better */
|
|
||||||
{"<LC", 2},
|
|
||||||
{">LC", 3},
|
|
||||||
{"<LNR", 4},
|
|
||||||
{">LNR", 5},
|
|
||||||
{">UNC", 6},
|
|
||||||
{"<UNC", 7},
|
|
||||||
{">UC", 8},
|
|
||||||
{"<UC", 9},
|
|
||||||
{">UNR", 10},
|
|
||||||
{"<UNR", 11},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_2 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"transition to idle", 0},
|
|
||||||
{"transition to active", 1},
|
|
||||||
{"transition to busy", 2},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_3 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"state deasserted", 0},
|
|
||||||
{"state asserted", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_4 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"predictive failure deasserted", 0},
|
|
||||||
{"predictive failure asserted", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_5 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"limit not exceeded", 0},
|
|
||||||
{"limit exceeded", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_6 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"performance met", 0},
|
|
||||||
{"performance lags", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_7 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"ok", 0},
|
|
||||||
{"<warn", 1}, /* '<' : getting worse */
|
|
||||||
{"<fail", 2},
|
|
||||||
{"<dead", 3},
|
|
||||||
{">warn", 4}, /* '>' : getting better */
|
|
||||||
{">fail", 5},
|
|
||||||
{"dead", 6},
|
|
||||||
{"monitor", 7},
|
|
||||||
{"informational", 8},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_8 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"device removed/absent", 0},
|
|
||||||
{"device inserted/present", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_9 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"device disabled", 0},
|
|
||||||
{"device enabled", 1},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_10 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"transition to running", 0},
|
|
||||||
{"transition to in test", 1},
|
|
||||||
{"transition to power off", 2},
|
|
||||||
{"transition to online", 3},
|
|
||||||
{"transition to offline", 4},
|
|
||||||
{"transition to off duty", 5},
|
|
||||||
{"transition to degraded", 6},
|
|
||||||
{"transition to power save", 7},
|
|
||||||
{"install error", 8},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_11 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"fully redundant", 0},
|
|
||||||
{"redundancy lost", 1},
|
|
||||||
{"redundancy degraded", 2},
|
|
||||||
{"<non-redundant/sufficient", 3}, /* '<' : getting worse */
|
|
||||||
{">non-redundant/sufficient", 4}, /* '>' : getting better */
|
|
||||||
{"non-redundant/insufficient", 5},
|
|
||||||
{"<redundancy degraded", 6},
|
|
||||||
{">redundancy degraded", 7},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_gentype_12 = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"D0 power state", 0},
|
|
||||||
{"D1 power state", 1},
|
|
||||||
{"D2 power state", 2},
|
|
||||||
{"D3 power state", 3},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map *
|
|
||||||
pef_b2s_generic_ER[] __attribute__((unused)) = {
|
|
||||||
&pef_b2s_gentype_1,
|
|
||||||
&pef_b2s_gentype_2,
|
|
||||||
&pef_b2s_gentype_3,
|
|
||||||
&pef_b2s_gentype_4,
|
|
||||||
&pef_b2s_gentype_5,
|
|
||||||
&pef_b2s_gentype_6,
|
|
||||||
&pef_b2s_gentype_7,
|
|
||||||
&pef_b2s_gentype_8,
|
|
||||||
&pef_b2s_gentype_9,
|
|
||||||
&pef_b2s_gentype_10,
|
|
||||||
&pef_b2s_gentype_11,
|
|
||||||
&pef_b2s_gentype_12,
|
|
||||||
};
|
|
||||||
#define PEF_B2S_GENERIC_ER_ENTRIES \
|
|
||||||
(sizeof(pef_b2s_generic_ER) / sizeof(pef_b2s_generic_ER[0]))
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -336,6 +117,7 @@ pef_b2s_generic_ER[] __attribute__((unused)) = {
|
|||||||
struct pef_policy_entry {
|
struct pef_policy_entry {
|
||||||
#define PEF_POLICY_ID_MASK 0xf0
|
#define PEF_POLICY_ID_MASK 0xf0
|
||||||
#define PEF_POLICY_ID_SHIFT 4
|
#define PEF_POLICY_ID_SHIFT 4
|
||||||
|
#define PEF_POLICY_DISABLED 0xF7
|
||||||
#define PEF_POLICY_ENABLED 0x08
|
#define PEF_POLICY_ENABLED 0x08
|
||||||
#define PEF_POLICY_FLAGS_MASK 0x07
|
#define PEF_POLICY_FLAGS_MASK 0x07
|
||||||
#define PEF_POLICY_FLAGS_MATCH_ALWAYS 0
|
#define PEF_POLICY_FLAGS_MATCH_ALWAYS 0
|
||||||
@ -355,46 +137,6 @@ struct pef_policy_entry {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_policies __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"Match-always", PEF_POLICY_FLAGS_MATCH_ALWAYS},
|
|
||||||
{"Try-next-entry", PEF_POLICY_FLAGS_PREV_OK_SKIP},
|
|
||||||
{"Try-next-set", PEF_POLICY_FLAGS_PREV_OK_NEXT_POLICY_SET},
|
|
||||||
{"Try-next-channel", PEF_POLICY_FLAGS_PREV_OK_NEXT_CHANNEL_IN_SET},
|
|
||||||
{"Try-next-destination", PEF_POLICY_FLAGS_PREV_OK_NEXT_DESTINATION_IN_SET},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_ch_medium __attribute__((unused)) = {
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_IPMB 1
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_ICMB_10 2
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_ICMB_09 3
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_LAN 4
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_SERIAL 5
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_XLAN 6
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_PCI_SMBUS 7
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_SMBUS_V1X 8
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_SMBUS_V2X 9
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_USB_V1X 10
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_USB_V2X 11
|
|
||||||
#define PEF_CH_MEDIUM_TYPE_SYSTEM 12
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"IPMB (I2C)", PEF_CH_MEDIUM_TYPE_IPMB},
|
|
||||||
{"ICMB v1.0", PEF_CH_MEDIUM_TYPE_ICMB_10},
|
|
||||||
{"ICMB v0.9", PEF_CH_MEDIUM_TYPE_ICMB_09},
|
|
||||||
{"802.3 LAN", PEF_CH_MEDIUM_TYPE_LAN},
|
|
||||||
{"Serial/Modem (RS-232)", PEF_CH_MEDIUM_TYPE_SERIAL},
|
|
||||||
{"Other LAN", PEF_CH_MEDIUM_TYPE_XLAN},
|
|
||||||
{"PCI SMBus", PEF_CH_MEDIUM_TYPE_PCI_SMBUS},
|
|
||||||
{"SMBus v1.0/1.1", PEF_CH_MEDIUM_TYPE_SMBUS_V1X},
|
|
||||||
{"SMBus v2.0", PEF_CH_MEDIUM_TYPE_SMBUS_V2X},
|
|
||||||
{"USB 1.x", PEF_CH_MEDIUM_TYPE_USB_V1X},
|
|
||||||
{"USB 2.x", PEF_CH_MEDIUM_TYPE_USB_V2X},
|
|
||||||
{"System I/F (KCS,SMIC,BT)", PEF_CH_MEDIUM_TYPE_SYSTEM},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -449,15 +191,6 @@ struct pef_cfgparm_control {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_control __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_ALL,
|
|
||||||
{ {"PEF", PEF_CONTROL_ENABLE},
|
|
||||||
{"PEF event messages", PEF_CONTROL_ENABLE_EVENT_MESSAGES},
|
|
||||||
{"PEF startup delay", PEF_CONTROL_ENABLE_STARTUP_DELAY},
|
|
||||||
{"Alert startup delay", PEF_CONTROL_ENABLE_ALERT_STARTUP_DELAY},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -510,7 +243,9 @@ struct pef_cfgparm_filter_table_size {
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
struct pef_cfgparm_filter_table_entry {
|
struct pef_cfgparm_filter_table_entry {
|
||||||
#define PEF_FILTER_TABLE_ID_MASK 0x7f
|
# define PEF_FILTER_DISABLED 0x7F
|
||||||
|
# define PEF_FILTER_ENABLED 0x80
|
||||||
|
# define PEF_FILTER_TABLE_ID_MASK 0x7F
|
||||||
uint8_t data1;
|
uint8_t data1;
|
||||||
struct pef_table_entry entry;
|
struct pef_table_entry entry;
|
||||||
} ATTRIBUTE_PACKING;
|
} ATTRIBUTE_PACKING;
|
||||||
@ -522,8 +257,8 @@ struct pef_cfgparm_filter_table_entry {
|
|||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
#endif
|
#endif
|
||||||
struct pef_cfgparm_filter_table_data_1 {
|
struct pef_cfgparm_filter_table_data_1 {
|
||||||
uint8_t data1;
|
uint8_t id;
|
||||||
uint8_t data2;
|
uint8_t cfg;
|
||||||
} ATTRIBUTE_PACKING;
|
} ATTRIBUTE_PACKING;
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
@ -653,15 +388,6 @@ struct pef_lan_cfgparm_dest_type {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_lan_desttype __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"Acknowledged", PEF_LAN_DEST_TYPE_ACK},
|
|
||||||
{"PET", PEF_LAN_DEST_TYPE_PET},
|
|
||||||
{"OEM 1", PEF_LAN_DEST_TYPE_OEM_1},
|
|
||||||
{"OEM 2", PEF_LAN_DEST_TYPE_OEM_2},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -752,18 +478,6 @@ struct pef_serial_cfgparm_dest_info {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_serial_desttype __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"Acknowledged", PEF_SERIAL_DEST_TYPE_ACK},
|
|
||||||
{"TAP page", PEF_SERIAL_DEST_TYPE_TAP},
|
|
||||||
{"PPP PET", PEF_SERIAL_DEST_TYPE_PPP},
|
|
||||||
{"Basic callback", PEF_SERIAL_DEST_TYPE_BASIC_CALLBACK},
|
|
||||||
{"PPP callback", PEF_SERIAL_DEST_TYPE_PPP_CALLBACK},
|
|
||||||
{"OEM 1", PEF_SERIAL_DEST_TYPE_OEM_1},
|
|
||||||
{"OEM 2", PEF_SERIAL_DEST_TYPE_OEM_2},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -832,14 +546,6 @@ struct pef_serial_cfgparm_tap_svc_settings {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct bit_desc_map
|
|
||||||
pef_b2s_tap_svc_confirm __attribute__((unused)) = {
|
|
||||||
BIT_DESC_MAP_LIST,
|
|
||||||
{ {"ACK", PEF_SERIAL_TAP_CONFIRMATION_ACK_AFTER_ETX},
|
|
||||||
{"211+ACK", PEF_SERIAL_TAP_CONFIRMATION_211_ACK_AFTER_ETX},
|
|
||||||
{"{211|213}+ACK", PEF_SERIAL_TAP_CONFIRMATION_21X_ACK_AFTER_ETX},
|
|
||||||
{NULL}
|
|
||||||
} };
|
|
||||||
|
|
||||||
#if 0 /* FYI : config parm groupings */
|
#if 0 /* FYI : config parm groupings */
|
||||||
struct pef_config_parms { /* PEF */
|
struct pef_config_parms { /* PEF */
|
||||||
@ -936,6 +642,7 @@ BIT_DESC_MAP_LIST,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define IPMI_CMD_GET_PEF_CAPABILITIES 0x10
|
#define IPMI_CMD_GET_PEF_CAPABILITIES 0x10
|
||||||
|
#define IPMI_CMD_SET_PEF_CONFIG_PARMS 0x12
|
||||||
#define IPMI_CMD_GET_PEF_CONFIG_PARMS 0x13
|
#define IPMI_CMD_GET_PEF_CONFIG_PARMS 0x13
|
||||||
#define IPMI_CMD_GET_LAST_PROCESSED_EVT_ID 0x15
|
#define IPMI_CMD_GET_LAST_PROCESSED_EVT_ID 0x15
|
||||||
#define IPMI_CMD_GET_SYSTEM_GUID 0x37
|
#define IPMI_CMD_GET_SYSTEM_GUID 0x37
|
||||||
@ -943,6 +650,13 @@ BIT_DESC_MAP_LIST,
|
|||||||
#define IPMI_CMD_LAN_GET_CONFIG 0x02
|
#define IPMI_CMD_LAN_GET_CONFIG 0x02
|
||||||
#define IPMI_CMD_SERIAL_GET_CONFIG 0x11
|
#define IPMI_CMD_SERIAL_GET_CONFIG 0x11
|
||||||
|
|
||||||
|
struct pef_cfgparm_set_policy_table_entry
|
||||||
|
{
|
||||||
|
uint8_t param_selector;
|
||||||
|
uint8_t policy_id;
|
||||||
|
struct pef_policy_entry entry;
|
||||||
|
} ATTRIBUTE_PACKING;
|
||||||
|
|
||||||
const char * ipmi_pef_bit_desc(struct bit_desc_map * map, uint32_t val);
|
const char * ipmi_pef_bit_desc(struct bit_desc_map * map, uint32_t val);
|
||||||
void ipmi_pef_print_flags(struct bit_desc_map * map, flg_e type, uint32_t val);
|
void ipmi_pef_print_flags(struct bit_desc_map * map, flg_e type, uint32_t val);
|
||||||
void ipmi_pef_print_dec(const char * text, uint32_t val);
|
void ipmi_pef_print_dec(const char * text, uint32_t val);
|
||||||
@ -952,5 +666,3 @@ void ipmi_pef_print_2xd(const char * text, uint8_t u1, uint8_t u2);
|
|||||||
void ipmi_pef_print_str(const char * text, const char * val);
|
void ipmi_pef_print_str(const char * text, const char * val);
|
||||||
|
|
||||||
int ipmi_pef_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_pef_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /* IPMI_PEF_H */
|
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
(C) Kontron
|
(C) Kontron
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _IPMI_PICMG_H_
|
#pragma once
|
||||||
#define _IPMI_PICMG_H_
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -12,6 +11,7 @@
|
|||||||
#define PICMG_CPCI_MAJOR_VERSION 1
|
#define PICMG_CPCI_MAJOR_VERSION 1
|
||||||
#define PICMG_ATCA_MAJOR_VERSION 2
|
#define PICMG_ATCA_MAJOR_VERSION 2
|
||||||
#define PICMG_AMC_MAJOR_VERSION 4
|
#define PICMG_AMC_MAJOR_VERSION 4
|
||||||
|
#define PICMG_UTCA_MAJOR_VERSION 5
|
||||||
|
|
||||||
/* PICMG commands */
|
/* PICMG commands */
|
||||||
#define PICMG_GET_PICMG_PROPERTIES_CMD 0x00
|
#define PICMG_GET_PICMG_PROPERTIES_CMD 0x00
|
||||||
@ -91,95 +91,7 @@ typedef enum picmg_busres_resource_id {
|
|||||||
PICMG_BUSRES_SYNC_CLOCK_GROUP_3
|
PICMG_BUSRES_SYNC_CLOCK_GROUP_3
|
||||||
} t_picmg_busres_resource_id;
|
} t_picmg_busres_resource_id;
|
||||||
|
|
||||||
/* the LED color capabilities */
|
const char *picmg_led_color_str(int color);
|
||||||
static const char* led_color_str[] __attribute__((unused)) = {
|
|
||||||
"reserved",
|
|
||||||
"BLUE",
|
|
||||||
"RED",
|
|
||||||
"GREEN",
|
|
||||||
"AMBER",
|
|
||||||
"ORANGE",
|
|
||||||
"WHITE",
|
|
||||||
"reserved"
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const char* amc_link_type_str[] __attribute__((unused)) = {
|
|
||||||
"RESERVED",
|
|
||||||
"RESERVED1",
|
|
||||||
"PCI EXPRESS",
|
|
||||||
"ADVANCED SWITCHING1",
|
|
||||||
"ADVANCED SWITCHING2",
|
|
||||||
"ETHERNET",
|
|
||||||
"RAPIDIO",
|
|
||||||
"STORAGE",
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char* amc_link_type_ext_str[][16] __attribute__((unused)) = {
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED */
|
|
||||||
{
|
|
||||||
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED1 */
|
|
||||||
{
|
|
||||||
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_PCI_EXPRESS */
|
|
||||||
{
|
|
||||||
"Gen 1 - NSSC",
|
|
||||||
"Gen 1 - SSC",
|
|
||||||
"Gen 2 - NSSC",
|
|
||||||
"Gen 2 - SSC",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING1 */
|
|
||||||
{
|
|
||||||
"Gen 1 - NSSC",
|
|
||||||
"Gen 1 - SSC",
|
|
||||||
"Gen 2 - NSSC",
|
|
||||||
"Gen 2 - SSC",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING2 */
|
|
||||||
{
|
|
||||||
"Gen 1 - NSSC",
|
|
||||||
"Gen 1 - SSC",
|
|
||||||
"Gen 2 - NSSC",
|
|
||||||
"Gen 2 - SSC",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET */
|
|
||||||
{
|
|
||||||
"1000BASE-BX (SerDES Gigabit)",
|
|
||||||
"10GBASE-BX410 Gigabit XAUI",
|
|
||||||
"", "",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", "",
|
|
||||||
"", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_RAPIDIO */
|
|
||||||
{
|
|
||||||
"1.25 Gbaud transmission rate",
|
|
||||||
"2.5 Gbaud transmission rate",
|
|
||||||
"3.125 Gbaud transmission rate",
|
|
||||||
"", "", "", "", "",
|
|
||||||
"", "", "", "", "", "", "", ""
|
|
||||||
},
|
|
||||||
/* FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE */
|
|
||||||
{
|
|
||||||
"Fibre Channel",
|
|
||||||
"Serial ATA",
|
|
||||||
"Serial Attached SCSI",
|
|
||||||
"", "", "", "", "",
|
|
||||||
"", "", "", "", "", "", "", ""
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sAmcPortState {
|
struct sAmcPortState {
|
||||||
#ifndef WORDS_BIGENDIAN
|
#ifndef WORDS_BIGENDIAN
|
||||||
@ -207,5 +119,3 @@ struct sAmcPortState {
|
|||||||
int ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
uint8_t picmg_discover(struct ipmi_intf *intf);
|
uint8_t picmg_discover(struct ipmi_intf *intf);
|
||||||
uint8_t ipmi_picmg_ipmb_address(struct ipmi_intf *intf);
|
uint8_t ipmi_picmg_ipmb_address(struct ipmi_intf *intf);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
52
include/ipmitool/ipmi_quantaoem.h
Normal file
52
include/ipmitool/ipmi_quantaoem.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Quanta Computer 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 Quanta Computer 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.
|
||||||
|
* Quanta Computer Inc. 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
|
||||||
|
* Quanta Computer Inc. 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
#include <ipmitool/ipmi.h>
|
||||||
|
#include <ipmitool/ipmi_sdr.h>
|
||||||
|
|
||||||
|
#define OEM_QCT_NETFN 0x36
|
||||||
|
#define OEM_QCT_GET_INFO 0x65
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
OEM_QCT_PLATFORM_UNKNOWN = 0,
|
||||||
|
OEM_QCT_PLATFORM_GRANTLEY,
|
||||||
|
OEM_QCT_PLATFORM_PURLEY
|
||||||
|
} qct_platform_t;
|
||||||
|
|
||||||
|
qct_platform_t oem_qct_get_platform_id(struct ipmi_intf *intf);
|
||||||
|
char *oem_qct_get_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec);
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_RAW_H
|
#pragma once
|
||||||
#define IPMI_RAW_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -40,5 +39,3 @@ struct ipmi_rs * ipmi_master_write_read(struct ipmi_intf * intf, uint8_t bus, ui
|
|||||||
uint8_t * wdata, uint8_t wsize, uint8_t rsize);
|
uint8_t * wdata, uint8_t wsize, uint8_t rsize);
|
||||||
int ipmi_rawi2c_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_rawi2c_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
int ipmi_rawspd_main(struct ipmi_intf * intf, int argc, char ** argv);
|
int ipmi_rawspd_main(struct ipmi_intf * intf, int argc, char ** argv);
|
||||||
|
|
||||||
#endif /* IPMI_RAW_H */
|
|
||||||
|
@ -30,13 +30,13 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SDR_H
|
#pragma once
|
||||||
#define IPMI_SDR_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <ipmitool/bswap.h>
|
#include <ipmitool/bswap.h>
|
||||||
@ -102,8 +102,6 @@ enum {
|
|||||||
#define GET_SENSOR_EVENT_STATUS 0x2b
|
#define GET_SENSOR_EVENT_STATUS 0x2b
|
||||||
#define GET_SENSOR_READING 0x2d
|
#define GET_SENSOR_READING 0x2d
|
||||||
#define GET_SENSOR_TYPE 0x2f
|
#define GET_SENSOR_TYPE 0x2f
|
||||||
#define GET_SENSOR_READING 0x2d
|
|
||||||
#define GET_SENSOR_TYPE 0x2f
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
#ifdef HAVE_PRAGMA_PACK
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
@ -383,6 +381,29 @@ struct sdr_record_common_sensor {
|
|||||||
|
|
||||||
struct sdr_record_mask mask;
|
struct sdr_record_mask mask;
|
||||||
|
|
||||||
|
/* IPMI 2.0, Table 43-1, byte 21[7:6] Analog (numeric) Data Format */
|
||||||
|
#define SDR_UNIT_FMT_UNSIGNED 0 /* unsigned */
|
||||||
|
#define SDR_UNIT_FMT_1S_COMPL 1 /* 1's complement (signed) */
|
||||||
|
#define SDR_UNIT_FMT_2S_COMPL 2 /* 2's complement (signed) */
|
||||||
|
#define SDR_UNIT_FMT_NA 3 /* does not return analog (numeric) reading */
|
||||||
|
/* IPMI 2.0, Table 43-1, byte 21[5:3] Rate */
|
||||||
|
#define SDR_UNIT_RATE_NONE 0 /* none */
|
||||||
|
#define SDR_UNIT_RATE_MICROSEC 1 /* per us */
|
||||||
|
#define SDR_UNIT_RATE_MILLISEC 2 /* per ms */
|
||||||
|
#define SDR_UNIT_RATE_SEC 3 /* per s */
|
||||||
|
#define SDR_UNIT_RATE_MIN 4 /* per min */
|
||||||
|
#define SDR_UNIT_RATE_HR 5 /* per hour */
|
||||||
|
#define SDR_UNIT_RATE_DAY 6 /* per day */
|
||||||
|
#define SDR_UNIT_RATE_RSVD 7 /* reserved */
|
||||||
|
/* IPMI 2.0, Table 43-1, byte 21[2:1] Modifier Unit */
|
||||||
|
#define SDR_UNIT_MOD_NONE 0 /* none */
|
||||||
|
#define SDR_UNIT_MOD_DIV 1 /* Basic Unit / Modifier Unit */
|
||||||
|
#define SDR_UNIT_MOD_MUL 2 /* Basic Unit * Mofifier Unit */
|
||||||
|
#define SDR_UNIT_MOD_RSVD 3 /* Reserved */
|
||||||
|
/* IPMI 2.0, Table 43-1, byte 21[0] Percentage */
|
||||||
|
#define SDR_UNIT_PCT_NO 0
|
||||||
|
#define SDR_UNIT_PCT_YES 1
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
#if WORDS_BIGENDIAN
|
#if WORDS_BIGENDIAN
|
||||||
uint8_t analog:2;
|
uint8_t analog:2;
|
||||||
@ -396,8 +417,8 @@ struct sdr_record_common_sensor {
|
|||||||
uint8_t analog:2;
|
uint8_t analog:2;
|
||||||
#endif
|
#endif
|
||||||
struct {
|
struct {
|
||||||
uint8_t base;
|
uint8_t base; /* Base unit type code per IPMI 2.0 Table 43-15 */
|
||||||
uint8_t modifier;
|
uint8_t modifier; /* Modifier unit type code per Table 43-15 */
|
||||||
} ATTRIBUTE_PACKING type;
|
} ATTRIBUTE_PACKING type;
|
||||||
} ATTRIBUTE_PACKING unit;
|
} ATTRIBUTE_PACKING unit;
|
||||||
} ATTRIBUTE_PACKING;
|
} ATTRIBUTE_PACKING;
|
||||||
@ -775,50 +796,7 @@ struct sdr_record_list {
|
|||||||
#pragma pack(0)
|
#pragma pack(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* unit description codes (IPMI v1.5 section 37.16) */
|
|
||||||
#define UNIT_MAX 0x90
|
|
||||||
static const char *unit_desc[] __attribute__ ((unused)) = {
|
|
||||||
"unspecified",
|
|
||||||
"degrees C", "degrees F", "degrees K",
|
|
||||||
"Volts", "Amps", "Watts", "Joules",
|
|
||||||
"Coulombs", "VA", "Nits",
|
|
||||||
"lumen", "lux", "Candela",
|
|
||||||
"kPa", "PSI", "Newton",
|
|
||||||
"CFM", "RPM", "Hz",
|
|
||||||
"microsecond", "millisecond", "second", "minute", "hour",
|
|
||||||
"day", "week", "mil", "inches", "feet", "cu in", "cu feet",
|
|
||||||
"mm", "cm", "m", "cu cm", "cu m", "liters", "fluid ounce",
|
|
||||||
"radians", "steradians", "revolutions", "cycles",
|
|
||||||
"gravities", "ounce", "pound", "ft-lb", "oz-in", "gauss",
|
|
||||||
"gilberts", "henry", "millihenry", "farad", "microfarad",
|
|
||||||
"ohms", "siemens", "mole", "becquerel", "PPM", "reserved",
|
|
||||||
"Decibels", "DbA", "DbC", "gray", "sievert",
|
|
||||||
"color temp deg K", "bit", "kilobit", "megabit", "gigabit",
|
|
||||||
"byte", "kilobyte", "megabyte", "gigabyte", "word", "dword",
|
|
||||||
"qword", "line", "hit", "miss", "retry", "reset",
|
|
||||||
"overflow", "underrun", "collision", "packets", "messages",
|
|
||||||
"characters", "error", "correctable error", "uncorrectable error",};
|
|
||||||
|
|
||||||
/* sensor type codes (IPMI v1.5 table 36.3)
|
|
||||||
/ Updated to v2.0 Table 42-3, Sensor Type Codes */
|
|
||||||
#define SENSOR_TYPE_MAX 0x2C
|
#define SENSOR_TYPE_MAX 0x2C
|
||||||
static const char *sensor_type_desc[] __attribute__ ((unused)) = {
|
|
||||||
"reserved",
|
|
||||||
"Temperature", "Voltage", "Current", "Fan",
|
|
||||||
"Physical Security", "Platform Security", "Processor",
|
|
||||||
"Power Supply", "Power Unit", "Cooling Device", "Other",
|
|
||||||
"Memory", "Drive Slot / Bay", "POST Memory Resize",
|
|
||||||
"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", "Watchdog2", "Platform Alert",
|
|
||||||
"Entity Presence", "Monitor ASIC", "LAN",
|
|
||||||
"Management Subsys Health", "Battery", "Session Audit",
|
|
||||||
"Version Change", "FRU State" };
|
|
||||||
|
|
||||||
struct sensor_reading {
|
struct sensor_reading {
|
||||||
char s_id[17]; /* name of the sensor */
|
char s_id[17]; /* name of the sensor */
|
||||||
@ -866,11 +844,10 @@ struct sdr_get_rs *ipmi_sdr_get_next_header(struct ipmi_intf *intf,
|
|||||||
struct ipmi_sdr_iterator *i);
|
struct ipmi_sdr_iterator *i);
|
||||||
uint8_t *ipmi_sdr_get_record(struct ipmi_intf *intf, struct sdr_get_rs *header,
|
uint8_t *ipmi_sdr_get_record(struct ipmi_intf *intf, struct sdr_get_rs *header,
|
||||||
struct ipmi_sdr_iterator *i);
|
struct ipmi_sdr_iterator *i);
|
||||||
void ipmi_sdr_end(struct ipmi_intf *intf, struct ipmi_sdr_iterator *i);
|
void ipmi_sdr_end(struct ipmi_sdr_iterator *i);
|
||||||
int ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type);
|
int ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type);
|
||||||
|
|
||||||
int ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf,uint16_t id,
|
int ipmi_sdr_print_name_from_rawentry(uint16_t id, uint8_t type,uint8_t * raw);
|
||||||
uint8_t type,uint8_t * raw);
|
|
||||||
int ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, uint8_t * raw,
|
int ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, uint8_t * raw,
|
||||||
int len);
|
int len);
|
||||||
int ipmi_sdr_print_listentry(struct ipmi_intf *intf,
|
int ipmi_sdr_print_listentry(struct ipmi_intf *intf,
|
||||||
@ -879,8 +856,8 @@ void ipmi_sdr_print_sensor_hysteresis(struct sdr_record_common_sensor *sensor,
|
|||||||
struct sdr_record_full_sensor *full,
|
struct sdr_record_full_sensor *full,
|
||||||
uint8_t hysteresis_value,
|
uint8_t hysteresis_value,
|
||||||
const char *hdrstr);
|
const char *hdrstr);
|
||||||
const char *ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type,
|
const char *ipmi_sdr_get_unit_string(bool pct, uint8_t type,
|
||||||
uint8_t base, uint8_t modifier);
|
uint8_t base, uint8_t modifier);
|
||||||
struct sensor_reading *
|
struct sensor_reading *
|
||||||
ipmi_sdr_read_sensor_value(struct ipmi_intf *intf,
|
ipmi_sdr_read_sensor_value(struct ipmi_intf *intf,
|
||||||
struct sdr_record_common_sensor *sensor,
|
struct sdr_record_common_sensor *sensor,
|
||||||
@ -909,21 +886,14 @@ struct ipmi_rs *ipmi_sdr_get_sensor_thresholds(struct ipmi_intf *intf,
|
|||||||
struct ipmi_rs *ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf *intf,
|
struct ipmi_rs *ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf *intf,
|
||||||
uint8_t sensor,
|
uint8_t sensor,
|
||||||
uint8_t target, uint8_t lun, uint8_t channel);
|
uint8_t target, uint8_t lun, uint8_t channel);
|
||||||
const char *ipmi_sdr_get_sensor_type_desc(const uint8_t type);
|
|
||||||
int ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin,
|
int ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin,
|
||||||
uint16_t * reserve_id);
|
uint16_t * reserve_id);
|
||||||
|
|
||||||
int ipmi_sdr_print_sensor_eventonly(struct ipmi_intf *intf,
|
int ipmi_sdr_print_sensor_eventonly(struct ipmi_intf *intf,
|
||||||
struct sdr_record_eventonly_sensor *sensor);
|
struct sdr_record_eventonly_sensor *sensor);
|
||||||
int ipmi_sdr_print_sensor_generic_locator(struct ipmi_intf *intf,
|
int ipmi_sdr_print_sensor_generic_locator(struct sdr_record_generic_locator *fru);
|
||||||
struct sdr_record_generic_locator
|
int ipmi_sdr_print_sensor_fru_locator(struct sdr_record_fru_locator *fru);
|
||||||
*fru);
|
int ipmi_sdr_print_sensor_mc_locator(struct sdr_record_mc_locator *mc);
|
||||||
int ipmi_sdr_print_sensor_fru_locator(struct ipmi_intf *intf,
|
|
||||||
struct sdr_record_fru_locator *fru);
|
|
||||||
int ipmi_sdr_print_sensor_mc_locator(struct ipmi_intf *intf,
|
|
||||||
struct sdr_record_mc_locator *mc);
|
|
||||||
int ipmi_sdr_print_sensor_entity_assoc(struct ipmi_intf *intf,
|
|
||||||
struct sdr_record_entity_assoc *assoc);
|
|
||||||
|
|
||||||
struct sdr_record_list *ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf,
|
struct sdr_record_list *ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf,
|
||||||
struct entity_id *entity);
|
struct entity_id *entity);
|
||||||
@ -936,13 +906,15 @@ struct sdr_record_list *ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf,
|
|||||||
struct sdr_record_list *ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf,
|
struct sdr_record_list *ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf,
|
||||||
uint8_t type);
|
uint8_t type);
|
||||||
int ipmi_sdr_list_cache(struct ipmi_intf *intf);
|
int ipmi_sdr_list_cache(struct ipmi_intf *intf);
|
||||||
int ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile);
|
int ipmi_sdr_list_cache_fromfile(const char *ifile);
|
||||||
void ipmi_sdr_list_empty(struct ipmi_intf *intf);
|
void ipmi_sdr_list_empty(void);
|
||||||
int ipmi_sdr_print_info(struct ipmi_intf *intf);
|
int ipmi_sdr_print_info(struct ipmi_intf *intf);
|
||||||
void ipmi_sdr_print_discrete_state(const char *desc, uint8_t sensor_type,
|
void ipmi_sdr_print_discrete_state(struct ipmi_intf *intf,
|
||||||
uint8_t event_type, uint8_t state1,
|
const char *desc, uint8_t sensor_type,
|
||||||
uint8_t state2);
|
uint8_t event_type, uint8_t state1,
|
||||||
void ipmi_sdr_print_discrete_state_mini(const char *header, const char *separator,
|
uint8_t state2);
|
||||||
|
void ipmi_sdr_print_discrete_state_mini(struct ipmi_intf *intf,
|
||||||
|
const char *header, const char *separator,
|
||||||
uint8_t sensor_type, uint8_t event_type,
|
uint8_t sensor_type, uint8_t event_type,
|
||||||
uint8_t state1, uint8_t state2);
|
uint8_t state1, uint8_t state2);
|
||||||
int ipmi_sdr_print_sensor_event_status(struct ipmi_intf *intf,
|
int ipmi_sdr_print_sensor_event_status(struct ipmi_intf *intf,
|
||||||
@ -953,5 +925,3 @@ int ipmi_sdr_print_sensor_event_enable(struct ipmi_intf *intf,
|
|||||||
uint8_t sensor_num, uint8_t sensor_type,
|
uint8_t sensor_num, uint8_t sensor_type,
|
||||||
uint8_t event_type, int numeric_fmt,
|
uint8_t event_type, int numeric_fmt,
|
||||||
uint8_t target, uint8_t lun, uint8_t channel);
|
uint8_t target, uint8_t lun, uint8_t channel);
|
||||||
|
|
||||||
#endif /* IPMI_SDR_H */
|
|
||||||
|
@ -28,8 +28,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SDRADD_H
|
#pragma once
|
||||||
#define IPMI_SDRADD_H
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Methods to add SDRs to repository from built-in sensors or files
|
* Methods to add SDRs to repository from built-in sensors or files
|
||||||
@ -42,5 +41,3 @@ ipmi_sdr_add_from_file(struct ipmi_intf *intf, const char *ifile);
|
|||||||
|
|
||||||
int
|
int
|
||||||
ipmi_sdr_add_from_list(struct ipmi_intf *intf, const char *rangeList);
|
ipmi_sdr_add_from_list(struct ipmi_intf *intf, const char *rangeList);
|
||||||
|
|
||||||
#endif /* IPMI_SDRADD_H */
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
151
include/ipmitool/ipmi_sel_supermicro.h
Normal file
151
include/ipmitool/ipmi_sel_supermicro.h
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
static uint16_t supermicro_x11[] = {
|
||||||
|
0x0958, 0x0955, 0x0953, 0x0952, 0x0941, 0x093A, 0x0939, 0x0938, 0x0937, 0x0930, 0x0927, 0x091D,
|
||||||
|
0x091C, 0x0917, 0x090D, 0x0909, 0x0907, 0x0901, 0x089F, 0x089C, 0x089B, 0x089A, 0x0898, 0x0896,
|
||||||
|
0x0895, 0x0894, 0x0891, 0x0890, 0x0888, 0x0886, 0x0885, 0x0884, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_b11[] = {
|
||||||
|
0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_b2[] = {
|
||||||
|
0x0951, 0x094E, 0x0931, 0x092E, 0x092A, 0x0928, 0x0908, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x10OBi[] = {
|
||||||
|
0x0923, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x10QRH[] = {
|
||||||
|
0x0872, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x10QBL[] = {
|
||||||
|
0x0853, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_brickland[] = {
|
||||||
|
0x0726, 0x083A, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static uint16_t supermicro_x9dal[] = {
|
||||||
|
0x0635, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x9db[] = {
|
||||||
|
0x0733, 0x0722, 0x0703, 0x0721, 0x0716, 0x0637, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x9sb[] = {
|
||||||
|
0x0651, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x9[] = {
|
||||||
|
0x0635, 0x0733, 0x0722, 0x0703, 0x0721, 0x0716, 0x0637, 0x0651, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_romely[] = {
|
||||||
|
0x0841, 0x0732, 0x0731, 0x0730, 0x0727, 0x0725, 0x0724, 0x0723, 0x0720, 0x0718, 0x0717, 0x0715,
|
||||||
|
0x0713, 0x0711, 0x070E, 0x070A, 0x0709, 0x0708, 0x0706, 0x0705, 0x0704, 0x0702, 0x0701, 0x0700,
|
||||||
|
0x066F, 0x066E, 0x066D, 0x0669, 0x0667, 0x0666, 0x0665, 0x0664, 0x0662, 0x0660, 0x0636, 0x0630,
|
||||||
|
0x062F, 0x062C, 0x0628, 0x0626, 0x0827, 0x070F, 0x0707, 0x0840, 0x0729, 0x0719, 0x0712, 0x070D,
|
||||||
|
0x066C, 0x066A, 0x0625, 0x0714, 0x0710, 0x070C, 0x070B, 0x0668, 0x0663, 0x0661, 0x062B, 0x062A,
|
||||||
|
0x0629, 0x093E, 0x0932, 0x092D, 0x092B, 0x0924, 0x0922, 0x0921, 0x091E, 0x0919, 0x0916, 0x089D,
|
||||||
|
0x0899, 0x0893, 0x0892, 0x0882, 0x0881, 0x0880, 0x087F, 0x087D, 0x0879, 0x0877, 0x086F, 0x086E,
|
||||||
|
0x086D, 0x086C, 0x086B, 0x085C, 0x085B, 0x084B, 0x0865, 0x0864, 0x0860, 0x0859, 0x0858, 0x0857,
|
||||||
|
0x0854, 0x0852, 0x0845, 0x0844, 0x0843, 0x0842, 0x083B, 0x0838, 0x0837, 0x0836, 0x0835, 0x0834,
|
||||||
|
0x0833, 0x0832, 0x0831, 0x0830, 0x0826, 0x0825, 0x0824, 0x0822, 0x0821, 0x0819, 0x0818, 0x0817,
|
||||||
|
0x0816, 0x0815, 0x0814, 0x0728, 0x0813, 0x0812, 0x0810, 0x0807, 0x0806, 0x0805, 0x0804, 0x0803,
|
||||||
|
0x0802, 0x0801, 0x0889, 0x0861, 0x083E, 0x0846, 0x0946, 0x0950, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_b8[] = {
|
||||||
|
0x000A, 0x061c, 0x0620, 0x0101, 0x061f, 0x0612, 0x061e, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_h8[] = {
|
||||||
|
0xa111, 0x0408, 0x0811, 0x1411, 0x0911, 0x1211, 0x1011, 0xcd11, 0x1111, 0xbe11, 0xce11, 0xbd11,
|
||||||
|
0xbc11, 0xa911, 0xaa11, 0xcb11, 0xad11, 0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, 0x2511,
|
||||||
|
0xbf11, 0x1511, 0x2211, 0x2411, 0x1911, 0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, 0xa311,
|
||||||
|
0x1311, 0xba11, 0xa711, 0xd111, 0x1711, 0xcf11, 0x2011, 0x1811, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_p8[] = {
|
||||||
|
0x5980, 0x6280, 0x6480, 0x7380, 0x7480, 0x0933, 0x094F, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_x8[] = {
|
||||||
|
0xa880, 0x0403, 0x0100, 0x0601, 0x0001, 0x0404, 0x0606, 0x0608, 0x0632, 0x0400, 0x0401, 0x0006,
|
||||||
|
0x040a, 0xf280, 0x060f, 0x0609, 0x0008, 0x0613, 0x061b, 0x0007, 0x0600, 0x060c, 0x060d, 0x0614,
|
||||||
|
0x0003, 0x040b, 0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, 0x061a,
|
||||||
|
0xf580, 0x062e, 0x0009, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_X8[] = {
|
||||||
|
0x000A, 0x061c, 0x0620, 0x0101, 0x061f, 0x0612, 0x061e, 0xa111, 0x0408, 0x0811, 0x1411, 0x0911,
|
||||||
|
0x1211, 0x1011, 0xcd11, 0x1111, 0xbe11, 0xce11, 0xbd11, 0xbc11, 0xa911, 0xaa11, 0xcb11, 0xad11,
|
||||||
|
0xa811, 0xac11, 0xaf11, 0xa511, 0xa011, 0x1611, 0x2511, 0xbf11, 0x1511, 0x2211, 0x2411, 0x1911,
|
||||||
|
0xab11, 0xd011, 0xae11, 0xca11, 0x0409, 0xa211, 0xa311, 0x1311, 0xba11, 0xa711, 0xd111, 0x1711,
|
||||||
|
0xcf11, 0x2011, 0x1811, 0x5980, 0x6280, 0x6480, 0x7380, 0x7480, 0x0933, 0x094F, 0xa880, 0x0403,
|
||||||
|
0x0100, 0x0601, 0x0001, 0x0404, 0x0606, 0x0608, 0x0632, 0x0400, 0x0401, 0x0006, 0x040a, 0xf280,
|
||||||
|
0x060f, 0x0609, 0x0008, 0x0613, 0x061b, 0x0007, 0x0600, 0x060c, 0x060d, 0x0614, 0x0003, 0x040b,
|
||||||
|
0x0621, 0x0610, 0x0638, 0xf380, 0x060b, 0x040d, 0x0605, 0x062d, 0x060e, 0x061a, 0xf580, 0x062e,
|
||||||
|
0x0009, 0xFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint16_t supermicro_older[] = {
|
||||||
|
0x8080, 0x8180, 0x8280, 0x8480, 0x8580, 0x8680, 0x8780, 0x8880, 0x8980, 0x9080, 0x9180, 0x9280,
|
||||||
|
0x9380, 0x9480, 0x9580, 0x9680, 0x9780, 0xA080, 0x9880, 0x9980, 0xB080, 0xB180, 0xB280, 0xB380,
|
||||||
|
0xB480, 0xA280, 0xB580, 0xB680, 0xA580, 0xB780, 0xD180, 0xA380, 0xA480, 0xD680, 0xBA80, 0xD280,
|
||||||
|
0x2111, 0xD380, 0xBC80, 0xBD80, 0xBE80, 0xC080, 0xC180, 0xAA80, 0xBE80, 0xBF80, 0xAB80, 0xD480,
|
||||||
|
0xD580, 0xAF80, 0xAE80, 0xC280, 0xAC80, 0xD080, 0xDA80, 0xDB80, 0xDC80, 0xDD80, 0xA680, 0xDE80,
|
||||||
|
0xAA80, 0xDF80, 0xBB80, 0xA780, 0xF080, 0xF180, 0xB880, 0xC380, 0xB780, 0x2311, 0xA980, 0xF480,
|
||||||
|
0xB980, 0x0002, 0xba80, 0x0602, 0x0603, 0x0604, 0x0607, 0x0410, 0xA611, 0x060A, 0x0611, 0xBB11,
|
||||||
|
0x061D, 0x0622, 0x0623, 0x0624, 0x0627, 0x0631, 0x0633, 0x0634, 0x0690, 0x0691, 0x0640, 0x0641,
|
||||||
|
0x0642, 0x066B, 0x0743, 0x0644, 0x0645, 0x0645, 0x0646, 0x0647, 0x0648, 0x0647, 0x0650, 0x0652,
|
||||||
|
0x0653, 0x0654, 0x0655, 0x0808, 0x0809, 0x0656, 0x0657, 0x0658, 0x0659, 0x0820, 0x0820, 0x0734,
|
||||||
|
0x0823, 0x0828, 0x0829, 0x0839, 0x083C, 0x083D, 0x083F, 0x0847, 0x0848, 0x0849, 0x0850, 0x0851,
|
||||||
|
0x0855, 0x0856, 0x0862, 0x0863, 0x0866, 0x0867, 0x0868, 0x0869, 0x084A, 0x084C, 0x084D, 0x084F,
|
||||||
|
0x085A, 0x085D, 0x085E, 0x085F, 0x086A, 0x0870, 0x0873, 0x0874, 0x0875, 0x0876, 0x0878, 0x087A,
|
||||||
|
0x087B, 0x087C, 0x087E, 0x0883, 0x0887, 0x088A, 0x088B, 0x088C, 0x088D, 0x088E, 0x088F, 0x0897,
|
||||||
|
0x089E, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x090A, 0x090B, 0x090C, 0x090E, 0x090F, 0x0910,
|
||||||
|
0x0912, 0x0913, 0x0914, 0x0915, 0x0918, 0x091A, 0x091B, 0x091F, 0x0920, 0x0925, 0x0926, 0x0929,
|
||||||
|
0x092C, 0x092F, 0x0934, 0x0935, 0x0936, 0x093B, 0x093C, 0x093D, 0x093F, 0x0940, 0x0942, 0x0943,
|
||||||
|
0x0944, 0x0945, 0x0947, 0x0948, 0x0949, 0x094A, 0x094B, 0x094C, 0x094D, 0x094E, 0x0954, 0x0956,
|
||||||
|
0x0957, 0x0959, 0xFFFF
|
||||||
|
};
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SENSOR_H
|
#pragma once
|
||||||
#define IPMI_SENSOR_H
|
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <ipmitool/bswap.h>
|
#include <ipmitool/bswap.h>
|
||||||
@ -86,4 +85,3 @@ struct sensor_set_thresh_rq {
|
|||||||
int ipmi_sensor_main(struct ipmi_intf *, int, char **);
|
int ipmi_sensor_main(struct ipmi_intf *, int, char **);
|
||||||
int ipmi_sensor_print_fc(struct ipmi_intf *, struct sdr_record_common_sensor *, uint8_t);
|
int ipmi_sensor_print_fc(struct ipmi_intf *, struct sdr_record_common_sensor *, uint8_t);
|
||||||
int ipmi_sensor_get_sensor_reading_factors( struct ipmi_intf * intf, struct sdr_record_full_sensor * sensor, uint8_t reading);
|
int ipmi_sensor_get_sensor_reading_factors( struct ipmi_intf * intf, struct sdr_record_full_sensor * sensor, uint8_t reading);
|
||||||
#endif /* IPMI_SENSOR_H */
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SESSION_H
|
#pragma once
|
||||||
#define IPMI_SESSION_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -127,5 +126,3 @@ struct get_session_info_rsp
|
|||||||
|
|
||||||
|
|
||||||
int ipmi_session_main(struct ipmi_intf *, int, char **);
|
int ipmi_session_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /*IPMI_CHANNEL_H*/
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SOL_H
|
#pragma once
|
||||||
#define IPMI_SOL_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -64,7 +63,7 @@ struct sol_config_parameters {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The ACTIVATE PAYLOAD command reponse structure
|
* The ACTIVATE PAYLOAD command response structure
|
||||||
* From table 24-2 of the IPMI v2.0 spec
|
* From table 24-2 of the IPMI v2.0 spec
|
||||||
*/
|
*/
|
||||||
#ifdef PRAGMA_PACK
|
#ifdef PRAGMA_PACK
|
||||||
@ -92,17 +91,13 @@ struct activate_payload_rsp {
|
|||||||
* function will return -1 if value is not valid, or
|
* function will return -1 if value is not valid, or
|
||||||
* will return 0 if valid.
|
* will return 0 if valid.
|
||||||
*/
|
*/
|
||||||
int ipmi_sol_set_param_isvalid_uint8_t( const char *strval,
|
int ipmi_sol_set_param_isvalid_uint8_t(const char *strval,
|
||||||
const char *name,
|
const char *name,
|
||||||
int base,
|
uint8_t minval,
|
||||||
uint8_t minval,
|
uint8_t maxval,
|
||||||
uint8_t maxval,
|
uint8_t *out_value);
|
||||||
uint8_t *out_value);
|
|
||||||
|
|
||||||
int ipmi_sol_main(struct ipmi_intf *, int, char **);
|
int ipmi_sol_main(struct ipmi_intf *, int, char **);
|
||||||
int ipmi_get_sol_info(struct ipmi_intf * intf,
|
int ipmi_get_sol_info(struct ipmi_intf *intf,
|
||||||
uint8_t channel,
|
uint8_t channel,
|
||||||
struct sol_config_parameters * params);
|
struct sol_config_parameters *params);
|
||||||
|
|
||||||
|
|
||||||
#endif /* IPMI_SOL_H */
|
|
||||||
|
@ -30,11 +30,12 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_STRINGS_H
|
#pragma once
|
||||||
#define IPMI_STRINGS_H
|
|
||||||
|
|
||||||
#include <ipmitool/helper.h>
|
#include <ipmitool/helper.h>
|
||||||
|
|
||||||
|
#define CC_STRING(cc) val2str(cc, completion_code_vals)
|
||||||
|
|
||||||
extern const struct valstr completion_code_vals[];
|
extern const struct valstr completion_code_vals[];
|
||||||
extern const struct valstr entity_id_vals[];
|
extern const struct valstr entity_id_vals[];
|
||||||
extern const struct valstr entity_device_type_vals[];
|
extern const struct valstr entity_device_type_vals[];
|
||||||
@ -48,10 +49,14 @@ extern const struct valstr ipmi_authtype_vals[];
|
|||||||
extern const struct valstr ipmi_channel_protocol_vals[];
|
extern const struct valstr ipmi_channel_protocol_vals[];
|
||||||
extern const struct valstr ipmi_channel_medium_vals[];
|
extern const struct valstr ipmi_channel_medium_vals[];
|
||||||
extern const struct valstr ipmi_chassis_power_control_vals[];
|
extern const struct valstr ipmi_chassis_power_control_vals[];
|
||||||
|
extern const struct valstr ipmi_chassis_restart_cause_vals[];
|
||||||
extern const struct valstr ipmi_auth_algorithms[];
|
extern const struct valstr ipmi_auth_algorithms[];
|
||||||
extern const struct valstr ipmi_integrity_algorithms[];
|
extern const struct valstr ipmi_integrity_algorithms[];
|
||||||
extern const struct valstr ipmi_encryption_algorithms[];
|
extern const struct valstr ipmi_encryption_algorithms[];
|
||||||
extern const struct valstr ipmi_oem_info[];
|
extern const struct valstr ipmi_user_enable_status_vals[];
|
||||||
|
extern const struct valstr *ipmi_oem_info;
|
||||||
|
void ipmi_oem_info_init();
|
||||||
|
void ipmi_oem_info_free();
|
||||||
|
|
||||||
extern const struct valstr picmg_frucontrol_vals[];
|
extern const struct valstr picmg_frucontrol_vals[];
|
||||||
extern const struct valstr picmg_clk_family_vals[];
|
extern const struct valstr picmg_clk_family_vals[];
|
||||||
@ -68,8 +73,5 @@ extern const struct oemvalstr picmg_busres_shmc_status_vals[];
|
|||||||
/* these are similar, expect that the lookup takes the IANA number
|
/* these are similar, expect that the lookup takes the IANA number
|
||||||
as first parameter */
|
as first parameter */
|
||||||
extern const struct oemvalstr ipmi_oem_product_info[];
|
extern const struct oemvalstr ipmi_oem_product_info[];
|
||||||
extern const struct oemvalstr ipmi_oem_sdr_type_vals[];
|
extern const char *ipmi_generic_sensor_type_vals[];
|
||||||
|
extern const struct oemvalstr ipmi_oem_sensor_type_vals[];
|
||||||
|
|
||||||
|
|
||||||
#endif /*IPMI_STRINGS_H*/
|
|
||||||
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_SUNOEM_H
|
#pragma once
|
||||||
#define IPMI_SUNOEM_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -68,6 +67,3 @@ typedef enum {
|
|||||||
} sunoem_ec_t;
|
} sunoem_ec_t;
|
||||||
|
|
||||||
int ipmi_sunoem_main(struct ipmi_intf *, int, char **);
|
int ipmi_sunoem_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /*IPMI_SUNOEM_H*/
|
|
||||||
|
|
||||||
|
90
include/ipmitool/ipmi_time.h
Normal file
90
include/ipmitool/ipmi_time.h
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Alexander Amelkin. 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 the copyright holder, 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.
|
||||||
|
* THE COPYRIGHT HOLDER 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
|
||||||
|
* THE COPYRIGHT HOLDER 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 THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY
|
||||||
|
* OF SUCH DAMAGES.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
extern bool time_in_utc;
|
||||||
|
|
||||||
|
/* Special values according to IPMI v2.0, rev. 1.1, section 37.1 */
|
||||||
|
#define IPMI_TIME_UNSPECIFIED 0xFFFFFFFFu
|
||||||
|
#define IPMI_TIME_INIT_DONE 0x20000000u
|
||||||
|
|
||||||
|
#define SECONDS_A_DAY (24 * 60 * 60)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether the timestamp is in seconds since Epoch or since
|
||||||
|
* the system startup.
|
||||||
|
*/
|
||||||
|
static inline bool ipmi_timestamp_is_special(time_t ts)
|
||||||
|
{
|
||||||
|
return (ts < IPMI_TIME_INIT_DONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether the timestamp is valid at all
|
||||||
|
*/
|
||||||
|
static inline bool ipmi_timestamp_is_valid(time_t ts)
|
||||||
|
{
|
||||||
|
return (ts != IPMI_TIME_UNSPECIFIED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Just 26 characters are required for asctime_r(), plus timezone info.
|
||||||
|
* However just to be safe locale-wise and assuming that in no locale
|
||||||
|
* the date/time string exceeds the 'standard' legacy terminal width,
|
||||||
|
* the buffer size is set here to 80.
|
||||||
|
*/
|
||||||
|
#define IPMI_ASCTIME_SZ 80
|
||||||
|
typedef char ipmi_datebuf_t[IPMI_ASCTIME_SZ];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are ipmitool-specific versions that take
|
||||||
|
* in account the command line options
|
||||||
|
*/
|
||||||
|
char *ipmi_asctime_r(time_t stamp, ipmi_datebuf_t outbuf);
|
||||||
|
size_t ipmi_strftime(char *s, size_t max, const char *format, time_t stamp)
|
||||||
|
__attribute__((format(strftime, 3, 0)));
|
||||||
|
|
||||||
|
/* These return pointers to static arrays and aren't thread safe */
|
||||||
|
char *ipmi_timestamp_fmt(uint32_t stamp, const char *fmt)
|
||||||
|
__attribute__((format(strftime, 2, 0)));
|
||||||
|
char *ipmi_timestamp_string(uint32_t stamp); /* Day Mon DD HH:MM:SS YYYY ZZZ */
|
||||||
|
char *ipmi_timestamp_numeric(uint32_t stamp); /* MM/DD/YYYY HH:MM:SS ZZZ */
|
||||||
|
char *ipmi_timestamp_date(uint32_t stamp); /* MM/DD/YYYY ZZZ */
|
||||||
|
char *ipmi_timestamp_time(uint32_t stamp); /* HH:MM:SS ZZZ */
|
||||||
|
|
||||||
|
/* Subtract the UTC offset from local time_t */
|
||||||
|
time_t ipmi_localtime2utc(time_t local);
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_TSOL_H
|
#pragma once
|
||||||
#define IPMI_TSOL_H
|
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
@ -42,5 +41,3 @@
|
|||||||
#define IPMI_TSOL_DEF_PORT 6230
|
#define IPMI_TSOL_DEF_PORT 6230
|
||||||
|
|
||||||
int ipmi_tsol_main(struct ipmi_intf *, int, char **);
|
int ipmi_tsol_main(struct ipmi_intf *, int, char **);
|
||||||
|
|
||||||
#endif /* IPMI_TSOL_H */
|
|
||||||
|
@ -30,66 +30,54 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMI_USER_H
|
#pragma once
|
||||||
#define IPMI_USER_H
|
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
|
|
||||||
|
#define IPMI_PASSWORD_DISABLE_USER 0x00
|
||||||
|
#define IPMI_PASSWORD_ENABLE_USER 0x01
|
||||||
|
#define IPMI_PASSWORD_SET_PASSWORD 0x02
|
||||||
|
#define IPMI_PASSWORD_TEST_PASSWORD 0x03
|
||||||
|
|
||||||
/*
|
#define IPMI_USER_ENABLE_UNSPECIFIED 0x00
|
||||||
* The GET USER ACCESS response from table 22-32 of the IPMI v2.0 spec
|
#define IPMI_USER_ENABLE_ENABLED 0x40
|
||||||
*/
|
#define IPMI_USER_ENABLE_DISABLED 0x80
|
||||||
struct user_access_rsp {
|
#define IPMI_USER_ENABLE_RESERVED 0xC0
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
uint8_t maximum_ids : 6;
|
|
||||||
#else
|
|
||||||
uint8_t maximum_ids : 6;
|
|
||||||
uint8_t __reserved1 : 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WORDS_BIGENDIAN
|
#define IPMI_UID_MASK 0x3F /* The user_id is 6-bit and is usually in bits [5:0] */
|
||||||
uint8_t __reserved2 : 2;
|
#define IPMI_UID(id) ((id) & IPMI_UID_MASK)
|
||||||
uint8_t enabled_user_count : 6;
|
|
||||||
#else
|
|
||||||
uint8_t enabled_user_count : 6;
|
|
||||||
uint8_t __reserved2 : 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved3 : 2;
|
|
||||||
uint8_t fixed_name_count : 6;
|
|
||||||
#else
|
|
||||||
uint8_t fixed_name_count : 6;
|
|
||||||
uint8_t __reserved3 : 2;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(1)
|
|
||||||
#endif
|
|
||||||
#if WORDS_BIGENDIAN
|
|
||||||
uint8_t __reserved4 : 1;
|
|
||||||
uint8_t no_callin_access : 1;
|
|
||||||
uint8_t link_auth_access : 1;
|
|
||||||
uint8_t ipmi_messaging_access : 1;
|
|
||||||
uint8_t channel_privilege_limit : 4;
|
|
||||||
#else
|
|
||||||
uint8_t channel_privilege_limit : 4;
|
|
||||||
uint8_t ipmi_messaging_access : 1;
|
|
||||||
uint8_t link_auth_access : 1;
|
|
||||||
uint8_t no_callin_access : 1;
|
|
||||||
uint8_t __reserved4 : 1;
|
|
||||||
#endif
|
|
||||||
} ATTRIBUTE_PACKING;
|
|
||||||
#ifdef HAVE_PRAGMA_PACK
|
|
||||||
#pragma pack(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
/* (22.27) Get and (22.26) Set User Access */
|
||||||
|
struct user_access_t {
|
||||||
|
uint8_t callin_callback;
|
||||||
|
uint8_t channel;
|
||||||
|
uint8_t enabled_user_ids;
|
||||||
|
uint8_t enable_status;
|
||||||
|
uint8_t fixed_user_ids;
|
||||||
|
uint8_t ipmi_messaging;
|
||||||
|
uint8_t link_auth;
|
||||||
|
uint8_t max_user_ids;
|
||||||
|
uint8_t privilege_limit;
|
||||||
|
uint8_t session_limit;
|
||||||
|
uint8_t user_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* (22.29) Get User Name */
|
||||||
|
struct user_name_t {
|
||||||
|
uint8_t user_id;
|
||||||
|
uint8_t user_name[17];
|
||||||
|
};
|
||||||
|
|
||||||
int ipmi_user_main(struct ipmi_intf *, int, char **);
|
int ipmi_user_main(struct ipmi_intf *, int, char **);
|
||||||
|
int _ipmi_get_user_access(struct ipmi_intf *intf,
|
||||||
#endif /* IPMI_USER_H */
|
struct user_access_t *user_access_rsp);
|
||||||
|
int _ipmi_get_user_name(struct ipmi_intf *intf, struct user_name_t *user_name);
|
||||||
|
int _ipmi_set_user_access(struct ipmi_intf *intf,
|
||||||
|
struct user_access_t *user_access_req,
|
||||||
|
uint8_t change_priv_limit_only);
|
||||||
|
int _ipmi_set_user_password(struct ipmi_intf *intf,
|
||||||
|
uint8_t user_id, uint8_t operation,
|
||||||
|
const char *password, uint8_t is_twenty_byte);
|
||||||
|
46
include/ipmitool/ipmi_vita.h
Normal file
46
include/ipmitool/ipmi_vita.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Pigeon Point Systems. All right reserved
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* VITA 46.11 commands */
|
||||||
|
#define VITA_GET_VSO_CAPABILITIES_CMD 0x00
|
||||||
|
#define VITA_FRU_CONTROL_CMD 0x04
|
||||||
|
#define VITA_GET_FRU_LED_PROPERTIES_CMD 0x05
|
||||||
|
#define VITA_GET_LED_COLOR_CAPABILITIES_CMD 0x06
|
||||||
|
#define VITA_SET_FRU_LED_STATE_CMD 0x07
|
||||||
|
#define VITA_GET_FRU_LED_STATE_CMD 0x08
|
||||||
|
#define VITA_SET_FRU_STATE_POLICY_BITS_CMD 0x0A
|
||||||
|
#define VITA_GET_FRU_STATE_POLICY_BITS_CMD 0x0B
|
||||||
|
#define VITA_SET_FRU_ACTIVATION_CMD 0x0C
|
||||||
|
#define VITA_GET_FRU_ADDRESS_INFO_CMD 0x40
|
||||||
|
|
||||||
|
/* VITA 46.11 site types */
|
||||||
|
#define VITA_FRONT_VPX_MODULE 0x00
|
||||||
|
#define VITA_POWER_ENTRY 0x01
|
||||||
|
#define VITA_CHASSIS_FRU 0x02
|
||||||
|
#define VITA_DEDICATED_CHMC 0x03
|
||||||
|
#define VITA_FAN_TRAY 0x04
|
||||||
|
#define VITA_FAN_TRAY_FILTER 0x05
|
||||||
|
#define VITA_ALARM_PANEL 0x06
|
||||||
|
#define VITA_XMC 0x07
|
||||||
|
#define VITA_VPX_RTM 0x09
|
||||||
|
#define VITA_FRONT_VME_MODULE 0x0A
|
||||||
|
#define VITA_FRONT_VXS_MODULE 0x0B
|
||||||
|
#define VITA_POWER_SUPPLY 0x0C
|
||||||
|
#define VITA_FRONT_VITA62_MODULE 0x0D
|
||||||
|
#define VITA_71_MODULE 0x0E
|
||||||
|
#define VITA_FMC 0x0F
|
||||||
|
|
||||||
|
|
||||||
|
#define GROUP_EXT_VITA 0x03
|
||||||
|
|
||||||
|
extern uint8_t
|
||||||
|
vita_discover(struct ipmi_intf *intf);
|
||||||
|
|
||||||
|
extern uint8_t
|
||||||
|
ipmi_vita_ipmb_address(struct ipmi_intf *intf);
|
||||||
|
|
||||||
|
extern int
|
||||||
|
ipmi_vita_main(struct ipmi_intf * intf, int argc, char ** argv);
|
@ -30,8 +30,7 @@
|
|||||||
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IPMITOOL_LOG_H
|
#pragma once
|
||||||
#define IPMITOOL_LOG_H
|
|
||||||
|
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
@ -54,10 +53,6 @@
|
|||||||
|
|
||||||
void log_init(const char * name, int isdaemon, int verbose);
|
void log_init(const char * name, int isdaemon, int verbose);
|
||||||
void log_halt(void);
|
void log_halt(void);
|
||||||
void log_level_set(int level);
|
void log_level_set(int verbose);
|
||||||
int log_level_get(void);
|
|
||||||
void lprintf(int level, const char * format, ...);
|
void lprintf(int level, const char * format, ...);
|
||||||
void lperror(int level, const char * format, ...);
|
void lperror(int level, const char * format, ...);
|
||||||
|
|
||||||
#endif /*IPMITOOL_LOG_H*/
|
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@
|
|||||||
# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
# 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.
|
# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)/include
|
AUTOMAKE_OPTIONS = subdir-objects
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir)/include
|
||||||
MAINTAINERCLEANFILES = Makefile.in
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libipmitool.la
|
noinst_LTLIBRARIES = libipmitool.la
|
||||||
@ -39,8 +40,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_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_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c \
|
||||||
ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \
|
ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \
|
||||||
ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c \
|
ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c ipmi_vita.c \
|
||||||
../src/plugins/lan/md5.c ../src/plugins/lan/md5.h
|
ipmi_lanp6.c ipmi_cfgp.c ipmi_quantaoem.c ipmi_time.c
|
||||||
|
|
||||||
libipmitool_la_LDFLAGS = -export-dynamic
|
libipmitool_la_LDFLAGS = -export-dynamic
|
||||||
libipmitool_la_LIBADD = -lm
|
libipmitool_la_LIBADD = -lm
|
||||||
|
1060
lib/dimm_spd.c
1060
lib/dimm_spd.c
File diff suppressed because it is too large
Load Diff
472
lib/helper.c
472
lib/helper.c
@ -45,6 +45,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
@ -53,7 +54,7 @@
|
|||||||
#ifdef HAVE_PATHS_H
|
#ifdef HAVE_PATHS_H
|
||||||
# include <paths.h>
|
# include <paths.h>
|
||||||
#else
|
#else
|
||||||
# define _PATH_VARRUN "/var/run/"
|
# define _PATH_RUN "/run/"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <ipmitool/ipmi.h>
|
#include <ipmitool/ipmi.h>
|
||||||
@ -73,24 +74,141 @@ uint16_t buf2short(uint8_t * buf)
|
|||||||
return (uint16_t)(buf[1] << 8 | buf[0]);
|
return (uint16_t)(buf[1] << 8 | buf[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * buf2str(uint8_t * buf, int len)
|
/* buf2str_extended - convert sequence of bytes to hexadecimal string with
|
||||||
|
* optional separator
|
||||||
|
*
|
||||||
|
* @param buf - data to convert
|
||||||
|
* @param len - size of data
|
||||||
|
* @param sep - optional separator (can be NULL)
|
||||||
|
*
|
||||||
|
* @returns buf representation in hex, possibly truncated to fit
|
||||||
|
* allocated static memory
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
buf2str_extended(const uint8_t *buf, int len, const char *sep)
|
||||||
{
|
{
|
||||||
static char str[2049];
|
static char str[BUF2STR_MAXIMUM_OUTPUT_SIZE];
|
||||||
|
char *cur;
|
||||||
int i;
|
int i;
|
||||||
|
int sz;
|
||||||
|
int left;
|
||||||
|
int sep_len;
|
||||||
|
|
||||||
if (len <= 0 || len > 1024)
|
if (!buf) {
|
||||||
return NULL;
|
snprintf(str, sizeof(str), "<NULL>");
|
||||||
|
return (const char *)str;
|
||||||
memset(str, 0, 2049);
|
}
|
||||||
|
cur = str;
|
||||||
for (i=0; i<len; i++)
|
left = sizeof(str);
|
||||||
sprintf(str+i+i, "%2.2x", buf[i]);
|
if (sep) {
|
||||||
|
sep_len = strlen(sep);
|
||||||
str[len*2] = '\0';
|
} else {
|
||||||
|
sep_len = 0;
|
||||||
|
}
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
/* may return more than 2, depending on locale */
|
||||||
|
sz = snprintf(cur, left, "%2.2x", buf[i]);
|
||||||
|
if (sz >= left) {
|
||||||
|
/* buffer overflow, truncate */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cur += sz;
|
||||||
|
left -= sz;
|
||||||
|
/* do not write separator after last byte */
|
||||||
|
if (sep && i != (len - 1)) {
|
||||||
|
if (sep_len >= left) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
strncpy(cur, sep, left - sz);
|
||||||
|
cur += sep_len;
|
||||||
|
left -= sep_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*cur = '\0';
|
||||||
|
|
||||||
return (const char *)str;
|
return (const char *)str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
buf2str(const uint8_t *buf, int len)
|
||||||
|
{
|
||||||
|
return buf2str_extended(buf, len, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_parse_hex - convert hexadecimal numbers to ascii string
|
||||||
|
* Input string must be composed of two-characer
|
||||||
|
* hexadecimal numbers.
|
||||||
|
* There is no separator between the numbers. Each number
|
||||||
|
* results in one byte of the converted string.
|
||||||
|
*
|
||||||
|
* Example: ipmi_parse_hex("50415353574F5244")
|
||||||
|
* returns 'PASSWORD'
|
||||||
|
*
|
||||||
|
* @param str: input string. It must contain only even number
|
||||||
|
* of '0'-'9','a'-'f' and 'A-F' characters.
|
||||||
|
* @param out: pointer to output data
|
||||||
|
* @param size: size of the output buffer
|
||||||
|
* @returns 0 for empty input string
|
||||||
|
* -1 for string with odd length
|
||||||
|
* -2 if out is NULL
|
||||||
|
* -3 if there is non-hexadecimal char in string
|
||||||
|
* >0 length of resulting binary data even if it is > size
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_parse_hex(const char *str, uint8_t *out, int size)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
uint8_t *q;
|
||||||
|
uint8_t d = 0;
|
||||||
|
uint8_t b = 0;
|
||||||
|
int shift = 4;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = strlen(str);
|
||||||
|
if (len == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len % 2 != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
len /= 2; /* out bytes */
|
||||||
|
if (!out) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (p = str, q = out; *p; p++) {
|
||||||
|
if (!isxdigit(*p)) {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p < 'A') {
|
||||||
|
/* it must be 0-9 */
|
||||||
|
d = *p - '0';
|
||||||
|
} else {
|
||||||
|
/* it's A-F or a-f */
|
||||||
|
/* convert to lowercase and to 10-15 */
|
||||||
|
d = (*p | 0x20) - 'a' + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q < (out + size)) {
|
||||||
|
/* there is space, store */
|
||||||
|
b += d << shift;
|
||||||
|
if (shift) {
|
||||||
|
shift = 0;
|
||||||
|
} else {
|
||||||
|
shift = 4;
|
||||||
|
*q = b;
|
||||||
|
b = 0;
|
||||||
|
q++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
void printbuf(const uint8_t * buf, int len, const char * desc)
|
void printbuf(const uint8_t * buf, int len, const char * desc)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -110,29 +228,168 @@ void printbuf(const uint8_t * buf, int len, const char * desc)
|
|||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * val2str(uint16_t val, const struct valstr *vs)
|
/*
|
||||||
|
* Unconditionally reverse the order of arbitrarily long strings of bytes
|
||||||
|
*/
|
||||||
|
uint8_t *array_byteswap(uint8_t *buffer, size_t length)
|
||||||
{
|
{
|
||||||
static char un_str[32];
|
size_t i;
|
||||||
int i;
|
uint8_t temp;
|
||||||
|
size_t max = length - 1;
|
||||||
|
|
||||||
for (i = 0; vs[i].str != NULL; i++) {
|
for (i = 0; i < length / 2; ++i) {
|
||||||
if (vs[i].val == val)
|
temp = buffer[i];
|
||||||
return vs[i].str;
|
buffer[i] = buffer[max - i];
|
||||||
|
buffer[max - i] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert data array from network (big-endian) to host byte order */
|
||||||
|
uint8_t *array_ntoh(uint8_t *buffer, size_t length)
|
||||||
|
{
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
/* Big-endian host doesn't need conversion from big-endian network */
|
||||||
|
(void)length; /* Silence the compiler */
|
||||||
|
return buffer;
|
||||||
|
#else
|
||||||
|
/* Little-endian host needs conversion from big-endian network */
|
||||||
|
return array_byteswap(buffer, length);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert data array from little-endian to host byte order */
|
||||||
|
uint8_t *array_letoh(uint8_t *buffer, size_t length)
|
||||||
|
{
|
||||||
|
#if WORDS_BIGENDIAN
|
||||||
|
/* Big-endian host needs conversion from little-endian IPMI */
|
||||||
|
return array_byteswap(buffer, length);
|
||||||
|
#else
|
||||||
|
/* Little-endian host doesn't need conversion from little-endian IPMI */
|
||||||
|
(void)length; /* Silence the compiler */
|
||||||
|
return buffer;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* str2mac - parse-out MAC address from given string and store it
|
||||||
|
* into buffer.
|
||||||
|
*
|
||||||
|
* @arg: string to be parsed.
|
||||||
|
* @buf: buffer of 6 to hold parsed MAC address.
|
||||||
|
*
|
||||||
|
* returns zero on success, (-1) on error and error message is printed-out.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
str2mac(const char *arg, uint8_t *buf)
|
||||||
|
{
|
||||||
|
unsigned int m1 = 0;
|
||||||
|
unsigned int m2 = 0;
|
||||||
|
unsigned int m3 = 0;
|
||||||
|
unsigned int m4 = 0;
|
||||||
|
unsigned int m5 = 0;
|
||||||
|
unsigned int m6 = 0;
|
||||||
|
if (sscanf(arg, "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
|
&m1, &m2, &m3, &m4, &m5, &m6) != 6) {
|
||||||
|
lprintf(LOG_ERR, "Invalid MAC address: %s", arg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (m1 > UINT8_MAX || m2 > UINT8_MAX
|
||||||
|
|| m3 > UINT8_MAX || m4 > UINT8_MAX
|
||||||
|
|| m5 > UINT8_MAX || m6 > UINT8_MAX) {
|
||||||
|
lprintf(LOG_ERR, "Invalid MAC address: %s", arg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buf[0] = (uint8_t)m1;
|
||||||
|
buf[1] = (uint8_t)m2;
|
||||||
|
buf[2] = (uint8_t)m3;
|
||||||
|
buf[3] = (uint8_t)m4;
|
||||||
|
buf[4] = (uint8_t)m5;
|
||||||
|
buf[5] = (uint8_t)m6;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* mac2str -- return MAC address as a string
|
||||||
|
*
|
||||||
|
* @buf: buffer of 6 to hold parsed MAC address.
|
||||||
|
*/
|
||||||
|
const char *
|
||||||
|
mac2str(const uint8_t *buf)
|
||||||
|
{
|
||||||
|
return buf2str_extended(buf, 6, ":");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the index of value in a valstr array
|
||||||
|
*
|
||||||
|
* @param[in] val The value to search for
|
||||||
|
* @param[in] vs The valstr array to search in
|
||||||
|
* @return >=0 The index into \p vs
|
||||||
|
* @return -1 Error: value \p val was not found in \p vs
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
inline
|
||||||
|
off_t find_val_idx(uint32_t val, const struct valstr *vs)
|
||||||
|
{
|
||||||
|
if (vs) {
|
||||||
|
for (off_t i = 0; vs[i].str; ++i) {
|
||||||
|
if (vs[i].val == val) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a statically allocated 'Unknown' string for the provided value.
|
||||||
|
* The function is not thread-safe (as most of ipmitool).
|
||||||
|
*
|
||||||
|
* @param[in] val The value to put into the string
|
||||||
|
* @returns A pointer to a statically allocated string
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
inline
|
||||||
|
const char *unknown_val_str(uint32_t val)
|
||||||
|
{
|
||||||
|
static char un_str[32];
|
||||||
memset(un_str, 0, 32);
|
memset(un_str, 0, 32);
|
||||||
snprintf(un_str, 32, "Unknown (0x%02X)", val);
|
snprintf(un_str, 32, "Unknown (0x%02X)", val);
|
||||||
|
|
||||||
return un_str;
|
return un_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * oemval2str(uint32_t oem, uint16_t val,
|
const char *
|
||||||
const struct oemvalstr *vs)
|
specific_val2str(uint32_t val,
|
||||||
|
const struct valstr *specific,
|
||||||
|
const struct valstr *generic)
|
||||||
{
|
{
|
||||||
static char un_str[32];
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; vs[i].oem != 0xffffff && vs[i].str != NULL; i++) {
|
if (0 <= (i = find_val_idx(val, specific))) {
|
||||||
|
return specific[i].str;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 <= (i = find_val_idx(val, generic))) {
|
||||||
|
return generic[i].str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return unknown_val_str(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *val2str(uint32_t val, const struct valstr *vs)
|
||||||
|
{
|
||||||
|
return specific_val2str(val, NULL, vs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *oemval2str(uint32_t oem, uint32_t val,
|
||||||
|
const struct oemvalstr *vs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; vs[i].oem != 0xffffff && vs[i].str; i++) {
|
||||||
/* FIXME: for now on we assume PICMG capability on all IANAs */
|
/* FIXME: for now on we assume PICMG capability on all IANAs */
|
||||||
if ( (vs[i].oem == oem || vs[i].oem == IPMI_OEM_PICMG) &&
|
if ( (vs[i].oem == oem || vs[i].oem == IPMI_OEM_PICMG) &&
|
||||||
vs[i].val == val ) {
|
vs[i].val == val ) {
|
||||||
@ -140,10 +397,7 @@ const char * oemval2str(uint32_t oem, uint16_t val,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(un_str, 0, 32);
|
return unknown_val_str(val);
|
||||||
snprintf(un_str, 32, "Unknown (0x%X)", val);
|
|
||||||
|
|
||||||
return un_str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* str2double - safely convert string to double
|
/* str2double - safely convert string to double
|
||||||
@ -357,6 +611,7 @@ int str2char(const char *str, int8_t * chr_ptr)
|
|||||||
if (arg_long < INT8_MIN || arg_long > INT8_MAX) {
|
if (arg_long < INT8_MIN || arg_long > INT8_MAX) {
|
||||||
return (-3);
|
return (-3);
|
||||||
}
|
}
|
||||||
|
*chr_ptr = (uint8_t)arg_long;
|
||||||
return 0;
|
return 0;
|
||||||
} /* str2char(...) */
|
} /* str2char(...) */
|
||||||
|
|
||||||
@ -387,12 +642,12 @@ int str2uchar(const char * str, uint8_t * uchr_ptr)
|
|||||||
return 0;
|
return 0;
|
||||||
} /* str2uchar(...) */
|
} /* str2uchar(...) */
|
||||||
|
|
||||||
uint16_t str2val(const char *str, const struct valstr *vs)
|
uint32_t str2val32(const char *str, const struct valstr *vs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; vs[i].str != NULL; i++) {
|
for (i = 0; vs[i].str; i++) {
|
||||||
if (strncasecmp(vs[i].str, str, __maxlen(str, vs[i].str)) == 0)
|
if (strcasecmp(vs[i].str, str) == 0)
|
||||||
return vs[i].val;
|
return vs[i].val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,10 +665,10 @@ print_valstr(const struct valstr * vs, const char * title, int loglevel)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (vs == NULL)
|
if (!vs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (title != NULL) {
|
if (title) {
|
||||||
if (loglevel < 0)
|
if (loglevel < 0)
|
||||||
printf("\n%s:\n\n", title);
|
printf("\n%s:\n\n", title);
|
||||||
else
|
else
|
||||||
@ -428,7 +683,7 @@ print_valstr(const struct valstr * vs, const char * title, int loglevel)
|
|||||||
lprintf(loglevel, "==============================================");
|
lprintf(loglevel, "==============================================");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; vs[i].str != NULL; i++) {
|
for (i = 0; vs[i].str; i++) {
|
||||||
if (loglevel < 0) {
|
if (loglevel < 0) {
|
||||||
if (vs[i].val < 256)
|
if (vs[i].val < 256)
|
||||||
printf(" %d\t0x%02x\t%s\n", vs[i].val, vs[i].val, vs[i].str);
|
printf(" %d\t0x%02x\t%s\n", vs[i].val, vs[i].val, vs[i].str);
|
||||||
@ -459,18 +714,18 @@ print_valstr_2col(const struct valstr * vs, const char * title, int loglevel)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (vs == NULL)
|
if (!vs)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (title != NULL) {
|
if (title) {
|
||||||
if (loglevel < 0)
|
if (loglevel < 0)
|
||||||
printf("\n%s:\n\n", title);
|
printf("\n%s:\n\n", title);
|
||||||
else
|
else
|
||||||
lprintf(loglevel, "\n%s:\n", title);
|
lprintf(loglevel, "\n%s:\n", title);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; vs[i].str != NULL; i++) {
|
for (i = 0; vs[i].str; i++) {
|
||||||
if (vs[i+1].str == NULL) {
|
if (!vs[i+1].str) {
|
||||||
/* last one */
|
/* last one */
|
||||||
if (loglevel < 0) {
|
if (loglevel < 0) {
|
||||||
printf(" %4d %-32s\n", vs[i].val, vs[i].str);
|
printf(" %4d %-32s\n", vs[i].val, vs[i].str);
|
||||||
@ -524,12 +779,12 @@ ipmi_open_file(const char * file, int rw)
|
|||||||
struct stat st1, st2;
|
struct stat st1, st2;
|
||||||
FILE * fp;
|
FILE * fp;
|
||||||
|
|
||||||
/* verify existance */
|
/* verify existence */
|
||||||
if (lstat(file, &st1) < 0) {
|
if (lstat(file, &st1) < 0) {
|
||||||
if (rw) {
|
if (rw) {
|
||||||
/* does not exist, ok to create */
|
/* does not exist, ok to create */
|
||||||
fp = fopen(file, "w");
|
fp = fopen(file, "w");
|
||||||
if (fp == NULL) {
|
if (!fp) {
|
||||||
lperror(LOG_ERR, "Unable to open file %s "
|
lperror(LOG_ERR, "Unable to open file %s "
|
||||||
"for write", file);
|
"for write", file);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -546,7 +801,7 @@ ipmi_open_file(const char * file, int rw)
|
|||||||
if (!rw) {
|
if (!rw) {
|
||||||
/* on read skip the extra checks */
|
/* on read skip the extra checks */
|
||||||
fp = fopen(file, "r");
|
fp = fopen(file, "r");
|
||||||
if (fp == NULL) {
|
if (!fp) {
|
||||||
lperror(LOG_ERR, "Unable to open file %s", file);
|
lperror(LOG_ERR, "Unable to open file %s", file);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -569,7 +824,7 @@ ipmi_open_file(const char * file, int rw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fp = fopen(file, rw ? "w+" : "r");
|
fp = fopen(file, rw ? "w+" : "r");
|
||||||
if (fp == NULL) {
|
if (!fp) {
|
||||||
lperror(LOG_ERR, "Unable to open file %s", file);
|
lperror(LOG_ERR, "Unable to open file %s", file);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -613,6 +868,7 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
|||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int fd;
|
int fd;
|
||||||
|
int ret;
|
||||||
#ifdef SIGHUP
|
#ifdef SIGHUP
|
||||||
sigset_t sighup;
|
sigset_t sighup;
|
||||||
#endif
|
#endif
|
||||||
@ -656,7 +912,11 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
|||||||
exit(0);
|
exit(0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
chdir("/");
|
ret = chdir("/");
|
||||||
|
if (ret) {
|
||||||
|
lprintf(LOG_ERR, "chdir failed: %s (%d)", strerror(errno), errno);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
umask(0);
|
umask(0);
|
||||||
|
|
||||||
for (fd=0; fd<64; fd++) {
|
for (fd=0; fd<64; fd++) {
|
||||||
@ -665,9 +925,57 @@ ipmi_start_daemon(struct ipmi_intf *intf)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fd = open("/dev/null", O_RDWR);
|
fd = open("/dev/null", O_RDWR);
|
||||||
assert(0 == fd);
|
if (fd != STDIN_FILENO) {
|
||||||
dup(fd);
|
lprintf(LOG_ERR, "failed to reset stdin: %s (%d)", strerror(errno), errno);
|
||||||
dup(fd);
|
exit(1);
|
||||||
|
}
|
||||||
|
ret = dup(fd);
|
||||||
|
if (ret != STDOUT_FILENO) {
|
||||||
|
lprintf(LOG_ERR, "failed to reset stdout: %s (%d)", strerror(errno), errno);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
ret = dup(fd);
|
||||||
|
if (ret != STDERR_FILENO) {
|
||||||
|
lprintf(LOG_ERR, "failed to reset stderr: %s (%d)", strerror(errno), errno);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* eval_ccode - evaluate return value of _ipmi_* functions and print error error
|
||||||
|
* message, if conditions are met.
|
||||||
|
*
|
||||||
|
* @ccode - return value of _ipmi_* function.
|
||||||
|
*
|
||||||
|
* returns - 0 if ccode is 0, otherwise (-1) and error might get printed-out.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
eval_ccode(const int ccode)
|
||||||
|
{
|
||||||
|
if (!ccode) {
|
||||||
|
return 0;
|
||||||
|
} else if (ccode < 0) {
|
||||||
|
switch (ccode) {
|
||||||
|
case (-1):
|
||||||
|
lprintf(LOG_ERR, "IPMI response is NULL.");
|
||||||
|
break;
|
||||||
|
case (-2):
|
||||||
|
lprintf(LOG_ERR, "Unexpected data length received.");
|
||||||
|
break;
|
||||||
|
case (-3):
|
||||||
|
lprintf(LOG_ERR, "Invalid function parameter.");
|
||||||
|
break;
|
||||||
|
case (-4):
|
||||||
|
lprintf(LOG_ERR, "ipmitool: malloc failure.");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (-1);
|
||||||
|
} else {
|
||||||
|
lprintf(LOG_ERR, "IPMI command failed: %s",
|
||||||
|
val2str(ccode, completion_code_vals));
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* is_fru_id - wrapper for str-2-int FRU ID conversion. Message is printed
|
/* is_fru_id - wrapper for str-2-int FRU ID conversion. Message is printed
|
||||||
@ -699,9 +1007,9 @@ is_fru_id(const char *argv_ptr, uint8_t *fru_id_ptr)
|
|||||||
/* is_ipmi_channel_num - wrapper for str-2-int Channel conversion. Message is
|
/* is_ipmi_channel_num - wrapper for str-2-int Channel conversion. Message is
|
||||||
* printed on error.
|
* printed on error.
|
||||||
*
|
*
|
||||||
* 6.3 Channel Numbers, p. 45, IPMIv2 spec.
|
* 6.3 Channel Numbers, p. 49, IPMIv2 spec. rev1.1
|
||||||
* Valid channel numbers are: <0..7>, <E-F>
|
* Valid channel numbers are: <0x0..0xB>, <0xE-0xF>
|
||||||
* Reserved channel numbers: <8-D>
|
* Reserved channel numbers: <0xC-0xD>
|
||||||
*
|
*
|
||||||
* @argv_ptr: source string to convert from; usually argv
|
* @argv_ptr: source string to convert from; usually argv
|
||||||
* @channel_ptr: pointer where to store result
|
* @channel_ptr: pointer where to store result
|
||||||
@ -718,14 +1026,14 @@ is_ipmi_channel_num(const char *argv_ptr, uint8_t *channel_ptr)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if ((str2uchar(argv_ptr, channel_ptr) == 0)
|
if ((str2uchar(argv_ptr, channel_ptr) == 0)
|
||||||
&& ((*channel_ptr >= 0x0 && *channel_ptr <= 0x7)
|
&& (*channel_ptr <= 0xB
|
||||||
|| (*channel_ptr >= 0xE && *channel_ptr <= 0xF))) {
|
|| (*channel_ptr >= 0xE && *channel_ptr <= 0xF))) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Given Channel number '%s' is either invalid or out of range.",
|
"Given Channel number '%s' is either invalid or out of range.",
|
||||||
argv_ptr);
|
argv_ptr);
|
||||||
lprintf(LOG_ERR, "Channel number must be from ranges: <0..7>, <0xE..0xF>");
|
lprintf(LOG_ERR, "Channel number must be from ranges: <0x0..0xB>, <0xE..0xF>");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -759,6 +1067,36 @@ is_ipmi_user_id(const char *argv_ptr, uint8_t *ipmi_uid_ptr)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* is_ipmi_user_priv_limit - check whether given value is valid User Privilege
|
||||||
|
* Limit, eg. IPMI v2 spec, 22.27 Get User Access Command.
|
||||||
|
*
|
||||||
|
* @priv_limit: User Privilege Limit
|
||||||
|
*
|
||||||
|
* returns 0 if Priv Limit is valid
|
||||||
|
* returns (-1) when Priv Limit is invalid
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
is_ipmi_user_priv_limit(const char *argv_ptr, uint8_t *ipmi_priv_limit_ptr)
|
||||||
|
{
|
||||||
|
if (!argv_ptr || !ipmi_priv_limit_ptr) {
|
||||||
|
lprintf(LOG_ERR,
|
||||||
|
"is_ipmi_user_priv_limit(): invalid argument(s).");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
if ((str2uchar(argv_ptr, ipmi_priv_limit_ptr) != 0)
|
||||||
|
|| ((*ipmi_priv_limit_ptr < 0x01
|
||||||
|
|| *ipmi_priv_limit_ptr > 0x05)
|
||||||
|
&& *ipmi_priv_limit_ptr != 0x0F)) {
|
||||||
|
lprintf(LOG_ERR,
|
||||||
|
"Given Privilege Limit '%s' is invalid.",
|
||||||
|
argv_ptr);
|
||||||
|
lprintf(LOG_ERR,
|
||||||
|
"Privilege Limit is limited to <0x1..0x5> and <0xF>.");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t
|
uint16_t
|
||||||
ipmi_get_oem_id(struct ipmi_intf *intf)
|
ipmi_get_oem_id(struct ipmi_intf *intf)
|
||||||
{
|
{
|
||||||
@ -773,11 +1111,11 @@ ipmi_get_oem_id(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Board ID command failed");
|
lprintf(LOG_ERR, "Get Board ID command failed");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Board ID command failed: %#x %s",
|
lprintf(LOG_ERR, "Get Board ID command failed: %#x %s",
|
||||||
rsp->ccode, val2str(rsp->ccode, completion_code_vals));
|
rsp->ccode, val2str(rsp->ccode, completion_code_vals));
|
||||||
return 0;
|
return 0;
|
||||||
@ -787,3 +1125,35 @@ ipmi_get_oem_id(struct ipmi_intf *intf)
|
|||||||
|
|
||||||
return oem_id;
|
return oem_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Parse command line arguments as numeric byte values (dec or hex)
|
||||||
|
* and store them in a \p len sized buffer \p out.
|
||||||
|
*
|
||||||
|
* @param[in] argc Number of arguments
|
||||||
|
* @param[in] argv Array of arguments
|
||||||
|
* @param[out] out The output buffer
|
||||||
|
* @param[in] len Length of the output buffer in bytes (no null-termination
|
||||||
|
* is assumed, the input data is treated as raw byte values,
|
||||||
|
* not as a string.
|
||||||
|
*
|
||||||
|
* @returns A success status indicator
|
||||||
|
* @return false Error
|
||||||
|
* @return true Success
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
args2buf(int argc, char *argv[], uint8_t *out, size_t len)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < len && i < (size_t)argc; ++i) {
|
||||||
|
uint8_t byte;
|
||||||
|
|
||||||
|
if (str2uchar(argv[i], &byte)) {
|
||||||
|
lprintf(LOG_ERR, "Bad byte value: %s", argv[i]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
out[i] = byte;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
16
lib/hpm2.c
16
lib/hpm2.c
@ -30,11 +30,18 @@
|
|||||||
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
* EVEN IF PPS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ipmitool/bswap.h>
|
||||||
#include <ipmitool/hpm2.h>
|
#include <ipmitool/hpm2.h>
|
||||||
#include <ipmitool/ipmi_intf.h>
|
#include <ipmitool/ipmi_intf.h>
|
||||||
#include <ipmitool/log.h>
|
#include <ipmitool/log.h>
|
||||||
#include <ipmitool/bswap.h>
|
#include <ipmitool/bswap.h>
|
||||||
|
|
||||||
|
/* From src/plugins/ipmi_intf.c: */
|
||||||
|
void
|
||||||
|
ipmi_intf_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size);
|
||||||
|
void
|
||||||
|
ipmi_intf_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size);
|
||||||
|
|
||||||
#if HAVE_PRAGMA_PACK
|
#if HAVE_PRAGMA_PACK
|
||||||
# pragma pack(push, 1)
|
# pragma pack(push, 1)
|
||||||
#endif
|
#endif
|
||||||
@ -127,7 +134,7 @@ int hpm2_get_capabilities(struct ipmi_intf * intf,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* check HPM.2 revision */
|
/* check HPM.2 revision */
|
||||||
if (caps->hpm2_revision_id != HPM2_REVISION) {
|
if (caps->hpm2_revision_id == 0) {
|
||||||
lprintf(LOG_NOTICE, "Bad HPM.2 revision, rev=%d",
|
lprintf(LOG_NOTICE, "Bad HPM.2 revision, rev=%d",
|
||||||
caps->hpm2_revision_id);
|
caps->hpm2_revision_id);
|
||||||
return -1;
|
return -1;
|
||||||
@ -212,8 +219,8 @@ int hpm2_get_lan_channel_capabilities(struct ipmi_intf * intf,
|
|||||||
/* send */
|
/* send */
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
|
|
||||||
if (rsp) {
|
if (!rsp) {
|
||||||
lprintf(LOG_NOTICE, "Error sending request");
|
lprintf(LOG_NOTICE, "Error sending request.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -233,7 +240,8 @@ int hpm2_get_lan_channel_capabilities(struct ipmi_intf * intf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check parameter revision */
|
/* check parameter revision */
|
||||||
if (rsp->data[0] != HPM2_LAN_PARAMS_REV) {
|
if (rsp->data[0] !=
|
||||||
|
LAN_PARAM_REV(HPM2_LAN_PARAMS_REV, HPM2_LAN_PARAMS_REV)) {
|
||||||
lprintf(LOG_NOTICE, "Bad HPM.2 LAN parameter revision, rev=%d",
|
lprintf(LOG_NOTICE, "Bad HPM.2 LAN parameter revision, rev=%d",
|
||||||
rsp->data[0]);
|
rsp->data[0]);
|
||||||
return -1;
|
return -1;
|
||||||
|
546
lib/ipmi_cfgp.c
Normal file
546
lib/ipmi_cfgp.c
Normal file
@ -0,0 +1,546 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016 Pentair Technical Products. All right reserved
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistribution of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistribution in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Pentair Technical Products or the names of
|
||||||
|
* contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||||
|
* PENTAIR TECHNICAL SOLUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
#else
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <ipmitool/helper.h>
|
||||||
|
#include <ipmitool/ipmi_cfgp.h>
|
||||||
|
#include <ipmitool/log.h>
|
||||||
|
|
||||||
|
/* ipmi_cfgp_init initialize configuration parameter context
|
||||||
|
* @param ctx context to initialize
|
||||||
|
* @param set array of parameter descriptors
|
||||||
|
* @param count amount of descriptors supplied
|
||||||
|
* @param handler function to do real job on parameters from the set
|
||||||
|
* @param priv private data for the handler
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_cfgp_init(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *set,
|
||||||
|
unsigned int count, const char *cmdname,
|
||||||
|
ipmi_cfgp_handler_t handler, void *priv)
|
||||||
|
{
|
||||||
|
if (!ctx || !set || !handler || !cmdname) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(ctx, 0, sizeof(struct ipmi_cfgp_ctx));
|
||||||
|
|
||||||
|
ctx->set = set;
|
||||||
|
ctx->count = count;
|
||||||
|
ctx->cmdname = cmdname;
|
||||||
|
ctx->handler = handler;
|
||||||
|
ctx->priv = priv;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_cfgp_uninit destroy data list attached to context
|
||||||
|
* @param ctx parameter context to clear
|
||||||
|
* @returns 0 -- list destroyed
|
||||||
|
* -1 -- ctx is NULL
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_cfgp_uninit(struct ipmi_cfgp_ctx *ctx)
|
||||||
|
{
|
||||||
|
struct ipmi_cfgp_data *d;
|
||||||
|
|
||||||
|
if (!ctx) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ctx->v) {
|
||||||
|
d = ctx->v;
|
||||||
|
ctx->v = d->next;
|
||||||
|
free(d);
|
||||||
|
d = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lookup_cfgp -- find a parameter in a set*/
|
||||||
|
static const struct ipmi_cfgp *
|
||||||
|
lookup_cfgp(const struct ipmi_cfgp_ctx *ctx, const char *name)
|
||||||
|
{
|
||||||
|
const struct ipmi_cfgp *p;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ctx->count; i++) {
|
||||||
|
p = &ctx->set[i];
|
||||||
|
|
||||||
|
if (p->name && !strcasecmp(p->name, name)) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_cfgp_parse_sel parse parameter selector
|
||||||
|
* (parameter ID, set selector, block selector) from cmdline.
|
||||||
|
*
|
||||||
|
* @param ctx configuration parameter context to use
|
||||||
|
* @param argc elements left in argv
|
||||||
|
* @param argv array of arguments
|
||||||
|
* @param sel where to store parsed selector
|
||||||
|
*
|
||||||
|
* @returns >=0 number of argv elements used
|
||||||
|
* <0 error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
int argc, const char **argv, struct ipmi_cfgp_sel *sel)
|
||||||
|
{
|
||||||
|
const struct ipmi_cfgp *p;
|
||||||
|
|
||||||
|
if (!ctx || !argv || !sel) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sel->param = -1;
|
||||||
|
sel->set = -1;
|
||||||
|
sel->block = -1;
|
||||||
|
|
||||||
|
if (argc == 0) {
|
||||||
|
/* no parameter specified, good for print, save */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = lookup_cfgp(ctx, argv[0]);
|
||||||
|
if (!p) {
|
||||||
|
lprintf(LOG_ERR, "invalid parameter");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sel->param = p - ctx->set;
|
||||||
|
sel->set = p->is_set ? -1 : 0;
|
||||||
|
sel->block = p->has_blocks ? -1 : 0;
|
||||||
|
|
||||||
|
if (argc == 1 || !p->is_set) {
|
||||||
|
/* No set and block selector applicable or specified */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str2int(argv[1], &sel->set)
|
||||||
|
|| sel->set < 0
|
||||||
|
|| (sel->set == 0 && p->first_set)) {
|
||||||
|
lprintf(LOG_ERR, "invalid set selector");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc == 2 || !p->has_blocks) {
|
||||||
|
/* No block selector applicable or specified */
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str2int(argv[2], &sel->block)
|
||||||
|
|| sel->block < 0
|
||||||
|
|| (sel->block == 0 && p->first_block)) {
|
||||||
|
lprintf(LOG_ERR, "invalid block selector");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cfgp_add_data adds block of data to list in the configuration
|
||||||
|
* parameter context
|
||||||
|
*
|
||||||
|
* @param ctx context to add data to
|
||||||
|
* @param data parameter data
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
cfgp_add_data(struct ipmi_cfgp_ctx *ctx, struct ipmi_cfgp_data *data)
|
||||||
|
{
|
||||||
|
struct ipmi_cfgp_data **pprev = &ctx->v;
|
||||||
|
|
||||||
|
data->next = NULL;
|
||||||
|
|
||||||
|
while (*pprev) {
|
||||||
|
pprev = &(*pprev)->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pprev = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cfgp_usage prints format for configuration parameter
|
||||||
|
*
|
||||||
|
* @param p configuration parameter descriptor
|
||||||
|
* @param write 0 if no value is expected, !=0 otherwise
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
cfgp_usage(const struct ipmi_cfgp *p, int write)
|
||||||
|
{
|
||||||
|
if (!p->name) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (write && !p->format) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" %s%s%s %s\n",
|
||||||
|
p->name, p->is_set ? " <set_sel>" : "",
|
||||||
|
p->has_blocks ? " <block_sel>" : "",
|
||||||
|
write ? p->format : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_cfgp_usage prints format for configuration parameter set
|
||||||
|
*
|
||||||
|
* @param set configuration parameter descriptor array
|
||||||
|
* @param count number of elements in set
|
||||||
|
* @param write 0 if no value is expected, !=0 otherwise
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ipmi_cfgp_usage(const struct ipmi_cfgp *set, int count, int write)
|
||||||
|
{
|
||||||
|
const struct ipmi_cfgp *p;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!set) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
p = &set[i];
|
||||||
|
|
||||||
|
if (write && p->access == CFGP_RDONLY) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!write && p->access == CFGP_WRONLY) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgp_usage(p, write);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_cfgp_parse_data parse parameter data from command line into context
|
||||||
|
* @param ctx context to add data
|
||||||
|
* @param sel parameter selector
|
||||||
|
* @param argc number of elements in argv
|
||||||
|
* @param argv array of unparsed arguments
|
||||||
|
*
|
||||||
|
* @returns 0 on success
|
||||||
|
* <0 on error
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, int argc, const char **argv)
|
||||||
|
{
|
||||||
|
const struct ipmi_cfgp *p;
|
||||||
|
struct ipmi_cfgp_data *data;
|
||||||
|
struct ipmi_cfgp_action action;
|
||||||
|
|
||||||
|
if (!ctx || !sel || !argv) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel->param == -1 || sel->param >= ctx->count) {
|
||||||
|
lprintf(LOG_ERR, "invalid parameter, must be one of:");
|
||||||
|
ipmi_cfgp_usage(ctx->set, ctx->count, 1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel->set == -1) {
|
||||||
|
lprintf(LOG_ERR, "set selector is not specified");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel->block == -1) {
|
||||||
|
lprintf(LOG_ERR, "block selector is not specified");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = &ctx->set[sel->param];
|
||||||
|
|
||||||
|
if (p->size == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = malloc(sizeof(struct ipmi_cfgp_data) + p->size);
|
||||||
|
if (!data) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(data, 0, sizeof(struct ipmi_cfgp_data) + p->size);
|
||||||
|
|
||||||
|
action.type = CFGP_PARSE;
|
||||||
|
action.set = sel->set;
|
||||||
|
action.block = sel->block;
|
||||||
|
action.argc = argc;
|
||||||
|
action.argv = argv;
|
||||||
|
action.file = NULL;
|
||||||
|
|
||||||
|
if (ctx->handler(ctx->priv, p, &action, data->data) != 0) {
|
||||||
|
ipmi_cfgp_usage(p, 1, 1);
|
||||||
|
free(data);
|
||||||
|
data = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->sel = *sel;
|
||||||
|
|
||||||
|
cfgp_add_data(ctx, data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cfgp_get_param -- get parameter data from MC into data list within context
|
||||||
|
*
|
||||||
|
* @param ctx context
|
||||||
|
* @param p parameter descriptor
|
||||||
|
* @param set parameter set selector, can be -1 to scan all set selectors
|
||||||
|
* @param block parameter block selector, can be -1 to get all blocks
|
||||||
|
* @param quiet set to non-zero to continue on errors
|
||||||
|
* (required for -1 to work)
|
||||||
|
* @returns 0 on success, non-zero otherwise
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
cfgp_get_param(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *p,
|
||||||
|
int set, int block, int quiet)
|
||||||
|
{
|
||||||
|
struct ipmi_cfgp_data *data;
|
||||||
|
struct ipmi_cfgp_action action;
|
||||||
|
int cset;
|
||||||
|
int cblock;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (p->size == 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
action.type = CFGP_GET;
|
||||||
|
action.argc = 0;
|
||||||
|
action.argv = NULL;
|
||||||
|
action.file = NULL;
|
||||||
|
|
||||||
|
if (set == -1 && !p->is_set) {
|
||||||
|
set = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (block == -1 && !p->has_blocks) {
|
||||||
|
block = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set == -1) {
|
||||||
|
cset = p->first_set;
|
||||||
|
} else {
|
||||||
|
cset = set;
|
||||||
|
}
|
||||||
|
|
||||||
|
action.quiet = quiet;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (block == -1) {
|
||||||
|
cblock = p->first_block;
|
||||||
|
} else {
|
||||||
|
cblock = block;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
data = malloc(sizeof(struct ipmi_cfgp_data) + p->size);
|
||||||
|
if (!data) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(data, 0, sizeof(struct ipmi_cfgp_data) + p->size);
|
||||||
|
|
||||||
|
action.set = cset;
|
||||||
|
action.block = cblock;
|
||||||
|
|
||||||
|
ret = ctx->handler(ctx->priv, p, &action, data->data);
|
||||||
|
if (ret != 0) {
|
||||||
|
free(data);
|
||||||
|
data = NULL;
|
||||||
|
|
||||||
|
if (!action.quiet) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->sel.param = p - ctx->set;
|
||||||
|
data->sel.set = cset;
|
||||||
|
data->sel.block = cblock;
|
||||||
|
|
||||||
|
cfgp_add_data(ctx, data);
|
||||||
|
|
||||||
|
cblock++;
|
||||||
|
action.quiet = 1;
|
||||||
|
} while (block == -1);
|
||||||
|
|
||||||
|
if (ret != 0 && cblock == p->first_block) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cset++;
|
||||||
|
} while (set == -1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ipmi_cfgp_get -- get parameters data from MC into data list within context
|
||||||
|
*
|
||||||
|
* @param ctx context
|
||||||
|
* @param sel parameter selector
|
||||||
|
* @returns 0 on success, non-zero otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ipmi_cfgp_get(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!ctx || !sel) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel->param != -1) {
|
||||||
|
if (sel->param >= ctx->count) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cfgp_get_param(ctx, &ctx->set[sel->param],
|
||||||
|
sel->set, sel->block, 0);
|
||||||
|
if (ret) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < ctx->count; i++) {
|
||||||
|
if (ctx->set[i].access == CFGP_WRONLY) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfgp_get_param(ctx, &ctx->set[i], sel->set, sel->block, 1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
cfgp_do_action(struct ipmi_cfgp_ctx *ctx, int action_type,
|
||||||
|
const struct ipmi_cfgp_sel *sel, FILE *file, int filter)
|
||||||
|
{
|
||||||
|
const struct ipmi_cfgp *p;
|
||||||
|
struct ipmi_cfgp_data *data;
|
||||||
|
struct ipmi_cfgp_action action;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (!ctx || !sel) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
action.type = action_type;
|
||||||
|
action.argc = 0;
|
||||||
|
action.argv = NULL;
|
||||||
|
action.file = file;
|
||||||
|
|
||||||
|
for (data = ctx->v; data; data = data->next) {
|
||||||
|
if (sel->param != -1 && sel->param != data->sel.param) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sel->set != -1 && sel->set != data->sel.set) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sel->block != -1 && sel->block != data->sel.block) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ctx->set[data->sel.param].access == filter) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = &ctx->set[data->sel.param];
|
||||||
|
|
||||||
|
action.set = data->sel.set;
|
||||||
|
action.block = data->sel.block;
|
||||||
|
|
||||||
|
if (action_type == CFGP_SAVE) {
|
||||||
|
fprintf(file, "%s %s ", ctx->cmdname, p->name);
|
||||||
|
if (p->is_set) {
|
||||||
|
fprintf(file, "%d ", data->sel.set);
|
||||||
|
}
|
||||||
|
if (p->has_blocks) {
|
||||||
|
fprintf(file, "%d ", data->sel.block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ctx->handler(ctx->priv, p, &action, data->data);
|
||||||
|
|
||||||
|
if (action_type == CFGP_SAVE) {
|
||||||
|
fputc('\n', file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ipmi_cfgp_set(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel)
|
||||||
|
{
|
||||||
|
return cfgp_do_action(ctx, CFGP_SET, sel, NULL, CFGP_RDONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ipmi_cfgp_save(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, FILE *file)
|
||||||
|
{
|
||||||
|
if (!file) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfgp_do_action(ctx, CFGP_SAVE, sel, file, CFGP_RDONLY);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ipmi_cfgp_print(struct ipmi_cfgp_ctx *ctx,
|
||||||
|
const struct ipmi_cfgp_sel *sel, FILE *file)
|
||||||
|
{
|
||||||
|
if (!file) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfgp_do_action(ctx, CFGP_PRINT, sel, file, CFGP_RESERVED);
|
||||||
|
}
|
1273
lib/ipmi_channel.c
1273
lib/ipmi_channel.c
File diff suppressed because it is too large
Load Diff
1591
lib/ipmi_chassis.c
1591
lib/ipmi_chassis.c
File diff suppressed because it is too large
Load Diff
2894
lib/ipmi_dcmi.c
Executable file → Normal file
2894
lib/ipmi_dcmi.c
Executable file → Normal file
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
219
lib/ipmi_event.c
219
lib/ipmi_event.c
@ -52,6 +52,14 @@
|
|||||||
#include <ipmitool/ipmi_event.h>
|
#include <ipmitool/ipmi_event.h>
|
||||||
#include <ipmitool/ipmi_sdr.h>
|
#include <ipmitool/ipmi_sdr.h>
|
||||||
|
|
||||||
|
static
|
||||||
|
inline
|
||||||
|
bool
|
||||||
|
is_system(const struct channel_info_t *chinfo)
|
||||||
|
{
|
||||||
|
return (IPMI_CHANNEL_MEDIUM_SYSTEM == chinfo->medium
|
||||||
|
|| CH_SYSTEM == chinfo->channel);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ipmi_event_msg_print(struct ipmi_intf * intf, struct platform_event_msg * pmsg)
|
ipmi_event_msg_print(struct ipmi_intf * intf, struct platform_event_msg * pmsg)
|
||||||
@ -61,7 +69,8 @@ ipmi_event_msg_print(struct ipmi_intf * intf, struct platform_event_msg * pmsg)
|
|||||||
memset(&sel_event, 0, sizeof(struct sel_event_record));
|
memset(&sel_event, 0, sizeof(struct sel_event_record));
|
||||||
|
|
||||||
sel_event.record_id = 0;
|
sel_event.record_id = 0;
|
||||||
sel_event.sel_type.standard_type.gen_id = 2;
|
htoipmi16(EVENT_GENERATOR(SMS, 0),
|
||||||
|
(void *)&sel_event.sel_type.standard_type.gen_id);
|
||||||
|
|
||||||
sel_event.sel_type.standard_type.evm_rev = pmsg->evm_rev;
|
sel_event.sel_type.standard_type.evm_rev = pmsg->evm_rev;
|
||||||
sel_event.sel_type.standard_type.sensor_type = pmsg->sensor_type;
|
sel_event.sel_type.standard_type.sensor_type = pmsg->sensor_type;
|
||||||
@ -83,36 +92,42 @@ ipmi_send_platform_event(struct ipmi_intf * intf, struct platform_event_msg * em
|
|||||||
{
|
{
|
||||||
struct ipmi_rs * rsp;
|
struct ipmi_rs * rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
uint8_t rqdata[8];
|
uint8_t rqdata[PLATFORM_EVENT_DATA_LEN_MAX];
|
||||||
uint8_t chmed;
|
uint8_t *rqdata_start = rqdata;
|
||||||
|
struct channel_info_t chinfo;
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
memset(rqdata, 0, 8);
|
memset(rqdata, 0, sizeof(rqdata));
|
||||||
|
|
||||||
req.msg.netfn = IPMI_NETFN_SE;
|
req.msg.netfn = IPMI_NETFN_SE;
|
||||||
req.msg.cmd = 0x02;
|
req.msg.cmd = IPMI_CMD_PLATFORM_EVENT;
|
||||||
req.msg.data = rqdata;
|
req.msg.data = rqdata;
|
||||||
|
req.msg.data_len = PLATFORM_EVENT_DATA_LEN_NON_SI;
|
||||||
|
|
||||||
chmed = ipmi_current_channel_medium(intf);
|
ipmi_current_channel_info(intf, &chinfo);
|
||||||
if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) {
|
if (chinfo.channel == CH_UNKNOWN) {
|
||||||
/* system interface, need extra generator ID */
|
lprintf(LOG_ERR, "Failed to send the platform event "
|
||||||
req.msg.data_len = 8;
|
"via an unknown channel");
|
||||||
rqdata[0] = 0x41; // As per Fig. 29-2 and Table 5-4
|
return -3;
|
||||||
memcpy(rqdata+1, emsg, sizeof(struct platform_event_msg));
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
req.msg.data_len = 7;
|
if (is_system(&chinfo)) {
|
||||||
memcpy(rqdata, emsg, sizeof(struct platform_event_msg));
|
/* system interface, need extra generator ID, see Fig. 29-2 */
|
||||||
|
req.msg.data_len = PLATFORM_EVENT_DATA_LEN_SI;
|
||||||
|
rqdata[0] = EVENT_GENERATOR(SMS, 0);
|
||||||
|
rqdata_start++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memcpy(rqdata_start, emsg, sizeof(struct platform_event_msg));
|
||||||
|
|
||||||
ipmi_event_msg_print(intf, emsg);
|
ipmi_event_msg_print(intf, emsg);
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Platform Event Message command failed");
|
lprintf(LOG_ERR, "Platform Event Message command failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (rsp->ccode > 0) {
|
else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Platform Event Message command failed: %s",
|
lprintf(LOG_ERR, "Platform Event Message command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -206,18 +221,20 @@ ipmi_send_platform_event_num(struct ipmi_intf * intf, int num)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ipmi_event_find_offset(uint8_t code,
|
ipmi_event_find_offset(struct ipmi_intf *intf, uint8_t sensor_type, uint8_t event_type, char *desc)
|
||||||
struct ipmi_event_sensor_types * evt,
|
|
||||||
char * desc)
|
|
||||||
{
|
{
|
||||||
if (desc == NULL || code == 0)
|
const struct ipmi_event_sensor_types *evt;
|
||||||
return 0x00;
|
|
||||||
|
|
||||||
while (evt->type) {
|
if (!desc || sensor_type == 0 || event_type == 0) {
|
||||||
if (evt->code == code && evt->desc != NULL &&
|
return 0x00;
|
||||||
strncasecmp(desc, evt->desc, __maxlen(desc, evt->desc)) == 0)
|
}
|
||||||
|
|
||||||
|
for (evt = ipmi_get_first_event_sensor_type(intf, sensor_type, event_type);
|
||||||
|
evt; evt = ipmi_get_next_event_sensor_type(evt)) {
|
||||||
|
if (evt->desc &&
|
||||||
|
strcasecmp(desc, evt->desc) == 0) {
|
||||||
return evt->offset;
|
return evt->offset;
|
||||||
evt++;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lprintf(LOG_WARN, "Unable to find matching event offset for '%s'", desc);
|
lprintf(LOG_WARN, "Unable to find matching event offset for '%s'", desc);
|
||||||
@ -225,11 +242,11 @@ ipmi_event_find_offset(uint8_t code,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_sensor_states(uint8_t sensor_type, uint8_t event_type)
|
print_sensor_states(struct ipmi_intf *intf, uint8_t sensor_type, uint8_t event_type)
|
||||||
{
|
{
|
||||||
ipmi_sdr_print_discrete_state_mini(
|
ipmi_sdr_print_discrete_state_mini(intf,
|
||||||
"Sensor States: \n ", "\n ", sensor_type,
|
"Sensor States: \n ", "\n ", sensor_type,
|
||||||
event_type, 0xff, 0xff);
|
event_type, 0xff, 0xff);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,7 +260,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
int off;
|
int off;
|
||||||
uint8_t target, lun, channel;
|
uint8_t target, lun, channel;
|
||||||
|
|
||||||
if (id == NULL) {
|
if (!id) {
|
||||||
lprintf(LOG_ERR, "No sensor ID supplied");
|
lprintf(LOG_ERR, "No sensor ID supplied");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -251,11 +268,11 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
memset(&emsg, 0, sizeof(struct platform_event_msg));
|
memset(&emsg, 0, sizeof(struct platform_event_msg));
|
||||||
emsg.evm_rev = 0x04;
|
emsg.evm_rev = 0x04;
|
||||||
|
|
||||||
if (evdir == NULL)
|
if (!evdir)
|
||||||
emsg.event_dir = EVENT_DIR_ASSERT;
|
emsg.event_dir = EVENT_DIR_ASSERT;
|
||||||
else if (strncasecmp(evdir, "assert", 6) == 0)
|
else if (!strcmp(evdir, "assert"))
|
||||||
emsg.event_dir = EVENT_DIR_ASSERT;
|
emsg.event_dir = EVENT_DIR_ASSERT;
|
||||||
else if (strncasecmp(evdir, "deassert", 8) == 0)
|
else if (!strcmp(evdir, "deassert"))
|
||||||
emsg.event_dir = EVENT_DIR_DEASSERT;
|
emsg.event_dir = EVENT_DIR_DEASSERT;
|
||||||
else {
|
else {
|
||||||
lprintf(LOG_ERR, "Invalid event direction %s. Must be 'assert' or 'deassert'", evdir);
|
lprintf(LOG_ERR, "Invalid event direction %s. Must be 'assert' or 'deassert'", evdir);
|
||||||
@ -264,7 +281,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
|
|
||||||
printf("Finding sensor %s... ", id);
|
printf("Finding sensor %s... ", id);
|
||||||
sdr = ipmi_sdr_find_sdr_byid(intf, id);
|
sdr = ipmi_sdr_find_sdr_byid(intf, id);
|
||||||
if (sdr == NULL) {
|
if (!sdr) {
|
||||||
printf("not found!\n");
|
printf("not found!\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -301,7 +318,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
int hilo = 0;
|
int hilo = 0;
|
||||||
off = 1;
|
off = 1;
|
||||||
|
|
||||||
if (state == NULL || strncasecmp(state, "list", 4) == 0) {
|
if (!state || !strcmp(state, "list")) {
|
||||||
printf("Sensor States:\n");
|
printf("Sensor States:\n");
|
||||||
printf(" lnr : Lower Non-Recoverable \n");
|
printf(" lnr : Lower Non-Recoverable \n");
|
||||||
printf(" lcr : Lower Critical\n");
|
printf(" lcr : Lower Critical\n");
|
||||||
@ -312,12 +329,12 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != strncasecmp(state, "lnr", 3) &&
|
if (0 != strcmp(state, "lnr") &&
|
||||||
0 != strncasecmp(state, "lcr", 3) &&
|
0 != strcmp(state, "lcr") &&
|
||||||
0 != strncasecmp(state, "lnc", 3) &&
|
0 != strcmp(state, "lnc") &&
|
||||||
0 != strncasecmp(state, "unc", 3) &&
|
0 != strcmp(state, "unc") &&
|
||||||
0 != strncasecmp(state, "ucr", 3) &&
|
0 != strcmp(state, "ucr") &&
|
||||||
0 != strncasecmp(state, "unr", 3))
|
0 != strcmp(state, "unr"))
|
||||||
{
|
{
|
||||||
lprintf(LOG_ERR, "Invalid threshold identifier %s", state);
|
lprintf(LOG_ERR, "Invalid threshold identifier %s", state);
|
||||||
return -1;
|
return -1;
|
||||||
@ -346,11 +363,11 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
|
|
||||||
rsp = ipmi_sdr_get_sensor_thresholds(intf, emsg.sensor_num,
|
rsp = ipmi_sdr_get_sensor_thresholds(intf, emsg.sensor_num,
|
||||||
target, lun, channel);
|
target, lun, channel);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Command Get Sensor Thresholds failed: invalid response.");
|
"Command Get Sensor Thresholds failed: invalid response.");
|
||||||
return (-1);
|
return (-1);
|
||||||
} else if (rsp->ccode != 0) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Command Get Sensor Thresholds failed: %s",
|
lprintf(LOG_ERR, "Command Get Sensor Thresholds failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -361,7 +378,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
|
|
||||||
rsp = ipmi_sdr_get_sensor_hysteresis(intf, emsg.sensor_num,
|
rsp = ipmi_sdr_get_sensor_hysteresis(intf, emsg.sensor_num,
|
||||||
target, lun, channel);
|
target, lun, channel);
|
||||||
if (rsp != NULL && rsp->ccode == 0)
|
if (rsp && !rsp->ccode)
|
||||||
off = dir ? rsp->data[0] : rsp->data[1];
|
off = dir ? rsp->data[0] : rsp->data[1];
|
||||||
if (off <= 0)
|
if (off <= 0)
|
||||||
off = 1;
|
off = 1;
|
||||||
@ -398,8 +415,8 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
/*
|
/*
|
||||||
* print list of available states for this sensor
|
* print list of available states for this sensor
|
||||||
*/
|
*/
|
||||||
if (state == NULL || strncasecmp(state, "list", 4) == 0) {
|
if (!state || strcasecmp(state, "list") == 0) {
|
||||||
print_sensor_states(emsg.sensor_type, emsg.event_type);
|
print_sensor_states(intf, emsg.sensor_type, emsg.event_type);
|
||||||
printf("Sensor State Shortcuts:\n");
|
printf("Sensor State Shortcuts:\n");
|
||||||
for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) {
|
for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) {
|
||||||
printf(" %-9s %-9s\n", digi_on[x], digi_off[x]);
|
printf(" %-9s %-9s\n", digi_on[x], digi_off[x]);
|
||||||
@ -409,20 +426,20 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
|
|
||||||
off = 0;
|
off = 0;
|
||||||
for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) {
|
for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) {
|
||||||
if (strncasecmp(state, digi_on[x], strlen(digi_on[x])) == 0) {
|
if (strcasecmp(state, digi_on[x]) == 0) {
|
||||||
emsg.event_data[0] = 1;
|
emsg.event_data[0] = 1;
|
||||||
off = 1;
|
off = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (strncasecmp(state, digi_off[x], strlen(digi_off[x])) == 0) {
|
else if (strcasecmp(state, digi_off[x]) == 0) {
|
||||||
emsg.event_data[0] = 0;
|
emsg.event_data[0] = 0;
|
||||||
off = 1;
|
off = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (off == 0) {
|
if (off == 0) {
|
||||||
off = ipmi_event_find_offset(
|
off = ipmi_event_find_offset(intf,
|
||||||
emsg.event_type, generic_event_types, state);
|
emsg.sensor_type, emsg.event_type, state);
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
return -1;
|
return -1;
|
||||||
emsg.event_data[0] = off;
|
emsg.event_data[0] = off;
|
||||||
@ -438,12 +455,12 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
/*
|
/*
|
||||||
* print list of available states for this sensor
|
* print list of available states for this sensor
|
||||||
*/
|
*/
|
||||||
if (state == NULL || strncasecmp(state, "list", 4) == 0) {
|
if (!state || strcasecmp(state, "list") == 0) {
|
||||||
print_sensor_states(emsg.sensor_type, emsg.event_type);
|
print_sensor_states(intf, emsg.sensor_type, emsg.event_type);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
off = ipmi_event_find_offset(
|
off = ipmi_event_find_offset(intf,
|
||||||
emsg.event_type, generic_event_types, state);
|
emsg.sensor_type, emsg.event_type, state);
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
return -1;
|
return -1;
|
||||||
emsg.event_data[0] = off;
|
emsg.event_data[0] = off;
|
||||||
@ -458,12 +475,12 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e
|
|||||||
/*
|
/*
|
||||||
* print list of available states for this sensor
|
* print list of available states for this sensor
|
||||||
*/
|
*/
|
||||||
if (state == NULL || strncasecmp(state, "list", 4) == 0) {
|
if (!state || strcasecmp(state, "list") == 0) {
|
||||||
print_sensor_states(emsg.sensor_type, emsg.event_type);
|
print_sensor_states(intf, emsg.sensor_type, emsg.event_type);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
off = ipmi_event_find_offset(
|
off = ipmi_event_find_offset(intf,
|
||||||
emsg.sensor_type, sensor_specific_types, state);
|
emsg.sensor_type, emsg.event_type, state);
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
return -1;
|
return -1;
|
||||||
emsg.event_data[0] = off;
|
emsg.event_data[0] = off;
|
||||||
@ -482,43 +499,30 @@ static int
|
|||||||
ipmi_event_fromfile(struct ipmi_intf * intf, char * file)
|
ipmi_event_fromfile(struct ipmi_intf * intf, char * file)
|
||||||
{
|
{
|
||||||
FILE * fp;
|
FILE * fp;
|
||||||
struct ipmi_rs * rsp;
|
/* For ease of filling in from file data */
|
||||||
struct ipmi_rq req;
|
union {
|
||||||
struct sel_event_record sel_event;
|
struct platform_event_msg emsg;
|
||||||
uint8_t rqdata[8];
|
uint8_t bytes[sizeof(struct platform_event_msg)];
|
||||||
|
} __attribute__ ((packed)) rqdata;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
char * ptr, * tok;
|
char * ptr, * tok;
|
||||||
int i, j;
|
|
||||||
uint8_t chmed;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (file == NULL)
|
if (!file)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
memset(rqdata, 0, 8);
|
|
||||||
|
|
||||||
/* setup Platform Event Message command */
|
|
||||||
memset(&req, 0, sizeof(req));
|
|
||||||
req.msg.netfn = IPMI_NETFN_SE;
|
|
||||||
req.msg.cmd = 0x02;
|
|
||||||
req.msg.data = rqdata;
|
|
||||||
req.msg.data_len = 7;
|
|
||||||
|
|
||||||
chmed = ipmi_current_channel_medium(intf);
|
|
||||||
if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) {
|
|
||||||
/* system interface, need extra generator ID */
|
|
||||||
rqdata[0] = 0x41; // As per Fig. 29-2 and Table 5-4
|
|
||||||
req.msg.data_len = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
fp = ipmi_open_file_read(file);
|
fp = ipmi_open_file_read(file);
|
||||||
if (fp == NULL)
|
if (!fp)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (feof(fp) == 0) {
|
while (feof(fp) == 0) {
|
||||||
if (fgets(buf, 1024, fp) == NULL)
|
size_t count = 0;
|
||||||
|
if (!fgets(buf, 1024, fp))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* Each line is a new event */
|
||||||
|
memset(&rqdata, 0, sizeof(rqdata));
|
||||||
|
|
||||||
/* clip off optional comment tail indicated by # */
|
/* clip off optional comment tail indicated by # */
|
||||||
ptr = strchr(buf, '#');
|
ptr = strchr(buf, '#');
|
||||||
if (ptr)
|
if (ptr)
|
||||||
@ -538,49 +542,28 @@ ipmi_event_fromfile(struct ipmi_intf * intf, char * file)
|
|||||||
|
|
||||||
/* parse the event, 7 bytes with optional comment */
|
/* parse the event, 7 bytes with optional comment */
|
||||||
/* 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # event */
|
/* 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # event */
|
||||||
i = 0;
|
|
||||||
tok = strtok(ptr, " ");
|
tok = strtok(ptr, " ");
|
||||||
while (tok) {
|
while (tok) {
|
||||||
if (i == 7)
|
if (count == sizeof(struct platform_event_msg))
|
||||||
break;
|
break;
|
||||||
j = i++;
|
if (0 > str2uchar(tok, &rqdata.bytes[count])) {
|
||||||
if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM)
|
lprintf(LOG_ERR, "Invalid token in file: [%s]", tok);
|
||||||
j++;
|
rc = -1;
|
||||||
rqdata[j] = (uint8_t)strtol(tok, NULL, 0);
|
break;
|
||||||
|
}
|
||||||
tok = strtok(NULL, " ");
|
tok = strtok(NULL, " ");
|
||||||
|
++count;
|
||||||
}
|
}
|
||||||
if (i < 7) {
|
if (count < sizeof(struct platform_event_msg)) {
|
||||||
lprintf(LOG_ERR, "Invalid Event: %s",
|
lprintf(LOG_ERR, "Invalid Event: %s",
|
||||||
buf2str(rqdata, sizeof(rqdata)));
|
buf2str(rqdata.bytes, sizeof(rqdata.bytes)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&sel_event, 0, sizeof(struct sel_event_record));
|
/* Now actually send it, failures will be logged by the sender */
|
||||||
sel_event.record_id = 0;
|
rc = ipmi_send_platform_event(intf, &rqdata.emsg);
|
||||||
sel_event.sel_type.standard_type.gen_id = 2;
|
if (IPMI_CC_OK != rc)
|
||||||
|
break;
|
||||||
j = (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) ? 1 : 0;
|
|
||||||
sel_event.sel_type.standard_type.evm_rev = rqdata[j++];
|
|
||||||
sel_event.sel_type.standard_type.sensor_type = rqdata[j++];
|
|
||||||
sel_event.sel_type.standard_type.sensor_num = rqdata[j++];
|
|
||||||
sel_event.sel_type.standard_type.event_type = rqdata[j] & 0x7f;
|
|
||||||
sel_event.sel_type.standard_type.event_dir = (rqdata[j++] & 0x80) >> 7;
|
|
||||||
sel_event.sel_type.standard_type.event_data[0] = rqdata[j++];
|
|
||||||
sel_event.sel_type.standard_type.event_data[1] = rqdata[j++];
|
|
||||||
sel_event.sel_type.standard_type.event_data[2] = rqdata[j++];
|
|
||||||
|
|
||||||
ipmi_sel_print_std_entry(intf, &sel_event);
|
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
|
||||||
if (rsp == NULL) {
|
|
||||||
lprintf(LOG_ERR, "Platform Event Message command failed");
|
|
||||||
rc = -1;
|
|
||||||
}
|
|
||||||
else if (rsp->ccode > 0) {
|
|
||||||
lprintf(LOG_ERR, "Platform Event Message command failed: %s",
|
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
|
||||||
rc = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
@ -613,11 +596,11 @@ ipmi_event_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (argc == 0 || strncmp(argv[0], "help", 4) == 0) {
|
if (argc == 0 || !strcmp(argv[0], "help")) {
|
||||||
ipmi_event_usage();
|
ipmi_event_usage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strncmp(argv[0], "file", 4) == 0) {
|
if (!strcmp(argv[0], "file")) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
ipmi_event_usage();
|
ipmi_event_usage();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -128,7 +128,7 @@ ipmi_firewall_parse_args(int argc, char ** argv, struct ipmi_function_params * p
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (i=0; i<argc; i++) {
|
for (i=0; i<argc; i++) {
|
||||||
if (strncmp(argv[i], "channel", 7) == 0 && (++i < argc)) {
|
if (!strcmp(argv[i], "channel") && (++i < argc)) {
|
||||||
uint8_t channel_tmp = 0;
|
uint8_t channel_tmp = 0;
|
||||||
if (is_ipmi_channel_num(argv[i], &channel_tmp) != 0) {
|
if (is_ipmi_channel_num(argv[i], &channel_tmp) != 0) {
|
||||||
conv_err = 1;
|
conv_err = 1;
|
||||||
@ -137,31 +137,31 @@ ipmi_firewall_parse_args(int argc, char ** argv, struct ipmi_function_params * p
|
|||||||
p->channel = channel_tmp;
|
p->channel = channel_tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[i], "lun", 3) == 0 && (++i < argc)) {
|
else if (!strcmp(argv[i], "lun") && (++i < argc)) {
|
||||||
if (str2int(argv[i], &(p->lun)) != 0) {
|
if (str2int(argv[i], &(p->lun)) != 0) {
|
||||||
lprintf(LOG_ERR, "Given lun '%s' is invalid.", argv[i]);
|
lprintf(LOG_ERR, "Given lun '%s' is invalid.", argv[i]);
|
||||||
conv_err = 1;
|
conv_err = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[i], "force", 5) == 0) {
|
else if (!strcmp(argv[i], "force")) {
|
||||||
p->force = 1;
|
p->force = 1;
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[i], "netfn", 5) == 0 && (++i < argc)) {
|
else if (!strcmp(argv[i], "netfn") && (++i < argc)) {
|
||||||
if (str2int(argv[i], &(p->netfn)) != 0) {
|
if (str2int(argv[i], &(p->netfn)) != 0) {
|
||||||
lprintf(LOG_ERR, "Given netfn '%s' is invalid.", argv[i]);
|
lprintf(LOG_ERR, "Given netfn '%s' is invalid.", argv[i]);
|
||||||
conv_err = 1;
|
conv_err = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[i], "command", 7) == 0 && (++i < argc)) {
|
else if (!strcmp(argv[i], "command") && (++i < argc)) {
|
||||||
if (str2int(argv[i], &(p->command)) != 0) {
|
if (str2int(argv[i], &(p->command)) != 0) {
|
||||||
lprintf(LOG_ERR, "Given command '%s' is invalid.", argv[i]);
|
lprintf(LOG_ERR, "Given command '%s' is invalid.", argv[i]);
|
||||||
conv_err = 1;
|
conv_err = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[i], "subfn", 5) == 0 && (++i < argc)) {
|
else if (!strcmp(argv[i], "subfn") && (++i < argc)) {
|
||||||
if (str2int(argv[i], &(p->subfn)) != 0) {
|
if (str2int(argv[i], &(p->subfn)) != 0) {
|
||||||
lprintf(LOG_ERR, "Given subfn '%s' is invalid.", argv[i]);
|
lprintf(LOG_ERR, "Given subfn '%s' is invalid.", argv[i]);
|
||||||
conv_err = 1;
|
conv_err = 1;
|
||||||
@ -235,11 +235,11 @@ _get_netfn_support(struct ipmi_intf * intf, int channel, unsigned char * lun, un
|
|||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get NetFn Support command failed");
|
lprintf(LOG_ERR, "Get NetFn Support command failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get NetFn Support command failed: %s",
|
lprintf(LOG_ERR, "Get NetFn Support command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -289,11 +289,11 @@ _get_command_support(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -316,11 +316,11 @@ _get_command_support(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -368,11 +368,11 @@ _get_command_configurable(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -395,11 +395,11 @@ _get_command_configurable(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -447,11 +447,11 @@ _get_command_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -474,11 +474,11 @@ _get_command_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 3;
|
req.msg.data_len = 3;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -512,7 +512,7 @@ _set_command_enables(struct ipmi_intf * intf,
|
|||||||
{
|
{
|
||||||
struct ipmi_rs * rsp;
|
struct ipmi_rs * rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
unsigned char * d, rqdata[19];
|
unsigned char rqdata[19];
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
|
|
||||||
if (!p || !lnfn) {
|
if (!p || !lnfn) {
|
||||||
@ -558,18 +558,16 @@ _set_command_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 19;
|
req.msg.data_len = 19;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
d = rsp->data;
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = IPMI_NETFN_APP;
|
req.msg.netfn = IPMI_NETFN_APP;
|
||||||
req.msg.cmd = BMC_SET_COMMAND_ENABLES;
|
req.msg.cmd = BMC_SET_COMMAND_ENABLES;
|
||||||
@ -581,17 +579,16 @@ _set_command_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 19;
|
req.msg.data_len = 19;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s",
|
||||||
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
d = rsp->data;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -628,11 +625,11 @@ _get_subfn_support(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
||||||
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -675,11 +672,11 @@ _get_subfn_configurable(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
||||||
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -722,11 +719,11 @@ _get_subfn_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 4;
|
req.msg.data_len = 4;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
||||||
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -790,11 +787,11 @@ _set_subfn_enables(struct ipmi_intf * intf,
|
|||||||
req.msg.data_len = 8;
|
req.msg.data_len = 8;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s",
|
||||||
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -891,7 +888,7 @@ static int _gather_info(struct ipmi_intf * intf, struct ipmi_function_params * p
|
|||||||
|
|
||||||
/* ipmi_firewall_info - print out info for firewall functions
|
/* ipmi_firewall_info - print out info for firewall functions
|
||||||
*
|
*
|
||||||
* @intf: ipmi inteface
|
* @intf: ipmi interface
|
||||||
* @argc: argument count
|
* @argc: argument count
|
||||||
* @argv: argument list
|
* @argv: argument list
|
||||||
*
|
*
|
||||||
@ -902,11 +899,11 @@ static int
|
|||||||
ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv)
|
ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct ipmi_function_params p = {0xe, -1, -1, -1, -1};
|
struct ipmi_function_params p = {0xe, -1, -1, -1, -1, 0};
|
||||||
struct bmc_fn_support * bmc_fn_support;
|
struct bmc_fn_support * bmc_fn_support;
|
||||||
unsigned int l, n, c;
|
unsigned int l, n, c;
|
||||||
|
|
||||||
if ((argc > 0 && strncmp(argv[0], "help", 4) == 0) || ipmi_firewall_parse_args(argc, argv, &p) < 0)
|
if ((argc > 0 && !strcmp(argv[0], "help")) || ipmi_firewall_parse_args(argc, argv, &p) < 0)
|
||||||
{
|
{
|
||||||
printf_firewall_info_usage();
|
printf_firewall_info_usage();
|
||||||
return 0;
|
return 0;
|
||||||
@ -1004,7 +1001,7 @@ ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
|
|
||||||
/* ipmi_firewall_enable_disable - enable/disable BMC functions
|
/* ipmi_firewall_enable_disable - enable/disable BMC functions
|
||||||
*
|
*
|
||||||
* @intf: ipmi inteface
|
* @intf: ipmi interface
|
||||||
* @enable: whether to enable or disable
|
* @enable: whether to enable or disable
|
||||||
* @argc: argument count
|
* @argc: argument count
|
||||||
* @argv: argument list
|
* @argv: argument list
|
||||||
@ -1015,12 +1012,13 @@ ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
static int
|
static int
|
||||||
ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char ** argv)
|
ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char ** argv)
|
||||||
{
|
{
|
||||||
struct ipmi_function_params p = {0xe, -1, -1, -1, -1};
|
struct ipmi_function_params p = {0xe, -1, -1, -1, -1, 0};
|
||||||
struct bmc_fn_support * bmc_fn_support;
|
struct bmc_fn_support * bmc_fn_support;
|
||||||
unsigned int l, n, c, ret;
|
int ret;
|
||||||
|
unsigned int l, n, c;
|
||||||
unsigned char enables[MAX_COMMAND_BYTES];
|
unsigned char enables[MAX_COMMAND_BYTES];
|
||||||
|
|
||||||
if (argc < 1 || strncmp(argv[0], "help", 4) == 0) {
|
if (argc < 1 || !strcmp(argv[0], "help")) {
|
||||||
char * s1 = enable?"en":"dis";
|
char * s1 = enable?"en":"dis";
|
||||||
char * s2 = enable?"":" [force]";
|
char * s2 = enable?"":" [force]";
|
||||||
printf("%sable [channel H] lun L netfn N%s\n", s1, s2);
|
printf("%sable [channel H] lun L netfn N%s\n", s1, s2);
|
||||||
@ -1057,7 +1055,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char
|
|||||||
c = p.command;
|
c = p.command;
|
||||||
if (p.subfn >= 0) {
|
if (p.subfn >= 0) {
|
||||||
// firewall (en|dis)able [channel c] lun l netfn n command m subfn s
|
// firewall (en|dis)able [channel c] lun l netfn n command m subfn s
|
||||||
// (en|dis)able this sub-function for this commnad on this lun/netfn pair
|
// (en|dis)able this sub-function for this command on this lun/netfn pair
|
||||||
memcpy(enables,
|
memcpy(enables,
|
||||||
bmc_fn_support->lun[l].netfn[n].command[c].subfn_enable,
|
bmc_fn_support->lun[l].netfn[n].command[c].subfn_enable,
|
||||||
MAX_SUBFN_BYTES);
|
MAX_SUBFN_BYTES);
|
||||||
@ -1067,7 +1065,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char
|
|||||||
|
|
||||||
} else if (p.command >= 0) {
|
} else if (p.command >= 0) {
|
||||||
// firewall (en|dis)able [channel c] lun l netfn n command m
|
// firewall (en|dis)able [channel c] lun l netfn n command m
|
||||||
// (en|dis)able all subfn and command for this commnad on this lun/netfn pair
|
// (en|dis)able all subfn and command for this command on this lun/netfn pair
|
||||||
memset(enables, enable?0xff:0, MAX_SUBFN_BYTES);
|
memset(enables, enable?0xff:0, MAX_SUBFN_BYTES);
|
||||||
ret = _set_subfn_enables(intf, &p,
|
ret = _set_subfn_enables(intf, &p,
|
||||||
&bmc_fn_support->lun[l].netfn[n].command[c], enables);
|
&bmc_fn_support->lun[l].netfn[n].command[c], enables);
|
||||||
@ -1078,14 +1076,14 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char
|
|||||||
&bmc_fn_support->lun[l].netfn[n], enables, p.force);
|
&bmc_fn_support->lun[l].netfn[n], enables, p.force);
|
||||||
} else if (p.netfn >= 0) {
|
} else if (p.netfn >= 0) {
|
||||||
// firewall (en|dis)able [channel c] lun l netfn n
|
// firewall (en|dis)able [channel c] lun l netfn n
|
||||||
// (en|dis)able all commnads on this lun/netfn pair
|
// (en|dis)able all command on this lun/netfn pair
|
||||||
memset(enables, enable?0xff:0, sizeof(enables));
|
memset(enables, enable?0xff:0, sizeof(enables));
|
||||||
ret = _set_command_enables(intf, &p,
|
ret = _set_command_enables(intf, &p,
|
||||||
&bmc_fn_support->lun[l].netfn[n], enables, p.force);
|
&bmc_fn_support->lun[l].netfn[n], enables, p.force);
|
||||||
/*
|
/*
|
||||||
} else if (p.lun >= 0) {
|
} else if (p.lun >= 0) {
|
||||||
// firewall (en|dis)able [channel c] lun l
|
// firewall (en|dis)able [channel c] lun l
|
||||||
// (en|dis)able all commnads on all netfn pairs for this lun
|
// (en|dis)able all command on all netfn pairs for this lun
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
free(bmc_fn_support);
|
free(bmc_fn_support);
|
||||||
@ -1095,7 +1093,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char
|
|||||||
|
|
||||||
/* ipmi_firewall_reset - reset firmware firewall to enable everything
|
/* ipmi_firewall_reset - reset firmware firewall to enable everything
|
||||||
*
|
*
|
||||||
* @intf: ipmi inteface
|
* @intf: ipmi interface
|
||||||
* @argc: argument count
|
* @argc: argument count
|
||||||
* @argv: argument list
|
* @argv: argument list
|
||||||
*
|
*
|
||||||
@ -1105,12 +1103,17 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char
|
|||||||
static int
|
static int
|
||||||
ipmi_firewall_reset(struct ipmi_intf * intf, int argc, char ** argv)
|
ipmi_firewall_reset(struct ipmi_intf * intf, int argc, char ** argv)
|
||||||
{
|
{
|
||||||
struct ipmi_function_params p = {0xe, -1, -1, -1, -1};
|
struct ipmi_function_params p = {0xe, -1, -1, -1, -1, 0};
|
||||||
struct bmc_fn_support * bmc_fn_support;
|
struct bmc_fn_support * bmc_fn_support;
|
||||||
unsigned int l, n, c, ret;
|
int ret;
|
||||||
|
unsigned int l, n, c;
|
||||||
unsigned char enables[MAX_COMMAND_BYTES];
|
unsigned char enables[MAX_COMMAND_BYTES];
|
||||||
|
|
||||||
if (argc > 0 || (argc > 0 && strncmp(argv[0], "help", 4) == 0)) {
|
if (argc < 1) {
|
||||||
|
lprintf(LOG_ERR, "Not enough parameters given.");
|
||||||
|
printf_firewall_usage();
|
||||||
|
return (-1);
|
||||||
|
} else if (argc > 0 && !strcmp(argv[0], "help")) {
|
||||||
printf_firewall_usage();
|
printf_firewall_usage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1132,8 +1135,8 @@ ipmi_firewall_reset(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
|
|
||||||
for (l=0; l<MAX_LUN; l++) {
|
for (l=0; l<MAX_LUN; l++) {
|
||||||
p.lun = l;
|
p.lun = l;
|
||||||
for (n=0; n<MAX_NETFN; n+=2) {
|
for (n=0; n<MAX_NETFN_PAIR; n++) {
|
||||||
p.netfn = n;
|
p.netfn = n*2;
|
||||||
for (c=0; c<MAX_COMMAND; c++) {
|
for (c=0; c<MAX_COMMAND; c++) {
|
||||||
p.command = c;
|
p.command = c;
|
||||||
printf("reset lun %d, netfn %d, command %d, subfn\n", l, n, c);
|
printf("reset lun %d, netfn %d, command %d, subfn\n", l, n, c);
|
||||||
@ -1168,19 +1171,19 @@ ipmi_firewall_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
if (argc < 1 || strncmp(argv[0], "help", 4) == 0) {
|
if (argc < 1 || !strcmp(argv[0], "help")) {
|
||||||
printf_firewall_usage();
|
printf_firewall_usage();
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[0], "info", 4) == 0) {
|
else if (!strcmp(argv[0], "info")) {
|
||||||
rc = ipmi_firewall_info(intf, argc-1, &(argv[1]));
|
rc = ipmi_firewall_info(intf, argc-1, &(argv[1]));
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[0], "enable", 6) == 0) {
|
else if (!strcmp(argv[0], "enable")) {
|
||||||
rc = ipmi_firewall_enable_disable(intf, 1, argc-1, &(argv[1]));
|
rc = ipmi_firewall_enable_disable(intf, 1, argc-1, &(argv[1]));
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[0], "disable", 7) == 0) {
|
else if (!strcmp(argv[0], "disable")) {
|
||||||
rc = ipmi_firewall_enable_disable(intf, 0, argc-1, &(argv[1]));
|
rc = ipmi_firewall_enable_disable(intf, 0, argc-1, &(argv[1]));
|
||||||
}
|
}
|
||||||
else if (strncmp(argv[0], "reset", 5) == 0) {
|
else if (!strcmp(argv[0], "reset")) {
|
||||||
rc = ipmi_firewall_reset(intf, argc-1, &(argv[1]));
|
rc = ipmi_firewall_reset(intf, argc-1, &(argv[1]));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
1301
lib/ipmi_fru.c
1301
lib/ipmi_fru.c
File diff suppressed because it is too large
Load Diff
@ -151,16 +151,16 @@ ipmi_fwum_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
printf_kfwum_help();
|
printf_kfwum_help();
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (strncmp(argv[0], "help", 4) == 0) {
|
if (!strcmp(argv[0], "help")) {
|
||||||
printf_kfwum_help();
|
printf_kfwum_help();
|
||||||
rc = 0;
|
rc = 0;
|
||||||
} else if (strncmp(argv[0], "info", 4) == 0) {
|
} else if (!strcmp(argv[0], "info")) {
|
||||||
rc = ipmi_fwum_info(intf);
|
rc = ipmi_fwum_info(intf);
|
||||||
} else if (strncmp(argv[0], "status", 6) == 0) {
|
} else if (!strcmp(argv[0], "status")) {
|
||||||
rc = ipmi_fwum_status(intf);
|
rc = ipmi_fwum_status(intf);
|
||||||
} else if (strncmp(argv[0], "rollback", 8) == 0) {
|
} else if (!strcmp(argv[0], "rollback")) {
|
||||||
rc = KfwumManualRollback(intf);
|
rc = KfwumManualRollback(intf);
|
||||||
} else if (strncmp(argv[0], "download", 8) == 0) {
|
} else if (!strcmp(argv[0], "download")) {
|
||||||
if ((argc < 2) || (strlen(argv[1]) < 1)) {
|
if ((argc < 2) || (strlen(argv[1]) < 1)) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Path and file name must be specified.");
|
"Path and file name must be specified.");
|
||||||
@ -168,14 +168,14 @@ ipmi_fwum_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
}
|
}
|
||||||
printf("Firmware File Name : %s\n", argv[1]);
|
printf("Firmware File Name : %s\n", argv[1]);
|
||||||
rc = ipmi_fwum_fwupgrade(intf, argv[1], 0);
|
rc = ipmi_fwum_fwupgrade(intf, argv[1], 0);
|
||||||
} else if (strncmp(argv[0], "upgrade", 7) == 0) {
|
} else if (!strcmp(argv[0], "upgrade")) {
|
||||||
if ((argc >= 2) && (strlen(argv[1]) > 0)) {
|
if ((argc >= 2) && (strlen(argv[1]) > 0)) {
|
||||||
printf("Upgrading using file name %s\n", argv[1]);
|
printf("Upgrading using file name %s\n", argv[1]);
|
||||||
rc = ipmi_fwum_fwupgrade(intf, argv[1], 1);
|
rc = ipmi_fwum_fwupgrade(intf, argv[1], 1);
|
||||||
} else {
|
} else {
|
||||||
rc = KfwumStartFirmwareUpgrade(intf);
|
rc = KfwumStartFirmwareUpgrade(intf);
|
||||||
}
|
}
|
||||||
} else if (strncmp(argv[0], "tracelog", 8) == 0) {
|
} else if (!strcmp(argv[0], "tracelog")) {
|
||||||
rc = KfwumGetTraceLog(intf);
|
rc = KfwumGetTraceLog(intf);
|
||||||
} else {
|
} else {
|
||||||
lprintf(LOG_ERR, "Invalid KFWUM command: %s", argv[0]);
|
lprintf(LOG_ERR, "Invalid KFWUM command: %s", argv[0]);
|
||||||
@ -258,7 +258,7 @@ ipmi_fwum_fwupgrade(struct ipmi_intf *intf, char *file, int action)
|
|||||||
unsigned short padding;
|
unsigned short padding;
|
||||||
unsigned long fsize = 0;
|
unsigned long fsize = 0;
|
||||||
unsigned char not_used;
|
unsigned char not_used;
|
||||||
if (file == NULL) {
|
if (!file) {
|
||||||
lprintf(LOG_ERR, "No file given.");
|
lprintf(LOG_ERR, "No file given.");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
@ -312,7 +312,7 @@ KfwumGetFileSize(const char *pFileName, unsigned long *pFileSize)
|
|||||||
{
|
{
|
||||||
FILE *pFileHandle = NULL;
|
FILE *pFileHandle = NULL;
|
||||||
pFileHandle = fopen(pFileName, "rb");
|
pFileHandle = fopen(pFileName, "rb");
|
||||||
if (pFileHandle == NULL) {
|
if (!pFileHandle) {
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (fseek(pFileHandle, 0L , SEEK_END) == 0) {
|
if (fseek(pFileHandle, 0L , SEEK_END) == 0) {
|
||||||
@ -342,7 +342,7 @@ KfwumSetupBuffersFromFile(const char *pFileName, unsigned long fileSize)
|
|||||||
int qty = 0;
|
int qty = 0;
|
||||||
|
|
||||||
pFileHandle = fopen(pFileName, "rb");
|
pFileHandle = fopen(pFileName, "rb");
|
||||||
if (pFileHandle == NULL) {
|
if (!pFileHandle) {
|
||||||
lprintf(LOG_ERR, "Failed to open '%s' for reading.",
|
lprintf(LOG_ERR, "Failed to open '%s' for reading.",
|
||||||
pFileName);
|
pFileName);
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -454,7 +454,7 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output,
|
|||||||
if (!rsp) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in FWUM Firmware Get Info Command.");
|
lprintf(LOG_ERR, "Error in FWUM Firmware Get Info Command.");
|
||||||
return (-1);
|
return (-1);
|
||||||
} else if (rsp->ccode != 0) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "FWUM Firmware Get Info returned %x",
|
lprintf(LOG_ERR, "FWUM Firmware Get Info returned %x",
|
||||||
rsp->ccode);
|
rsp->ccode);
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -479,7 +479,7 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output,
|
|||||||
printf("Number Of Memory Bank : %u\n", pGetInfo->numBank);
|
printf("Number Of Memory Bank : %u\n", pGetInfo->numBank);
|
||||||
}
|
}
|
||||||
*pNumBank = pGetInfo->numBank;
|
*pNumBank = pGetInfo->numBank;
|
||||||
/* Determine wich type of download to use: */
|
/* Determine which type of download to use: */
|
||||||
/* Old FWUM or Old IPMC fw (data_len < 7)
|
/* Old FWUM or Old IPMC fw (data_len < 7)
|
||||||
* --> Address with small buffer size
|
* --> Address with small buffer size
|
||||||
*/
|
*/
|
||||||
@ -501,14 +501,14 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output,
|
|||||||
printf("Protocol Revision :");
|
printf("Protocol Revision :");
|
||||||
printf(" > 5 optimizing buffers\n");
|
printf(" > 5 optimizing buffers\n");
|
||||||
}
|
}
|
||||||
if (strstr(intf->name,"lan") != NULL) {
|
if (strstr(intf->name,"lan")) {
|
||||||
/* also covers lanplus */
|
/* also covers lanplus */
|
||||||
save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER;
|
save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER;
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf("IOL payload size : %d\n",
|
printf("IOL payload size : %d\n",
|
||||||
save_fw_nfo.bufferSize);
|
save_fw_nfo.bufferSize);
|
||||||
}
|
}
|
||||||
} else if ((strstr(intf->name,"open")!= NULL)
|
} else if (strstr(intf->name,"open")
|
||||||
&& intf->target_addr != IPMI_BMC_SLAVE_ADDR
|
&& intf->target_addr != IPMI_BMC_SLAVE_ADDR
|
||||||
&& (intf->target_addr != intf->my_addr)) {
|
&& (intf->target_addr != intf->my_addr)) {
|
||||||
save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER;
|
save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER;
|
||||||
@ -549,10 +549,10 @@ KfwumGetDeviceInfo(struct ipmi_intf *intf, unsigned char output,
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in Get Device Id Command");
|
lprintf(LOG_ERR, "Error in Get Device Id Command");
|
||||||
return (-1);
|
return (-1);
|
||||||
} else if (rsp->ccode != 0) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Device Id returned %x",
|
lprintf(LOG_ERR, "Get Device Id returned %x",
|
||||||
rsp->ccode);
|
rsp->ccode);
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -571,7 +571,7 @@ KfwumGetDeviceInfo(struct ipmi_intf *intf, unsigned char output,
|
|||||||
pGetDevId->fw_rev1, pGetDevId->fw_rev2 >> 4,
|
pGetDevId->fw_rev1, pGetDevId->fw_rev2 >> 4,
|
||||||
pGetDevId->fw_rev2 & 0x0f);
|
pGetDevId->fw_rev2 & 0x0f);
|
||||||
if (((pBoardInfo->iana == IPMI_OEM_KONTRON)
|
if (((pBoardInfo->iana == IPMI_OEM_KONTRON)
|
||||||
&& (pBoardInfo->boardId = KFWUM_BOARD_KONTRON_5002))) {
|
&& (pBoardInfo->boardId == KFWUM_BOARD_KONTRON_5002))) {
|
||||||
printf(" SDR %u", pGetDevId->aux_fw_rev[0]);
|
printf(" SDR %u", pGetDevId->aux_fw_rev[0]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
@ -598,19 +598,19 @@ KfwumGetStatus(struct ipmi_intf * intf)
|
|||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf(" Getting Status!\n");
|
printf(" Getting Status!\n");
|
||||||
}
|
}
|
||||||
/* Retreive the number of bank */
|
/* Retrieve the number of bank */
|
||||||
rc = KfwumGetInfo(intf, 0, &numBank);
|
rc = KfwumGetInfo(intf, 0, &numBank);
|
||||||
for(counter = 0;
|
for(counter = 0;
|
||||||
(counter < numBank) && (rc == 0);
|
(counter < numBank) && (rc == 0);
|
||||||
counter ++) {
|
counter ++) {
|
||||||
/* Retreive the status of each bank */
|
/* Retrieve the status of each bank */
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = IPMI_NETFN_FIRMWARE;
|
req.msg.netfn = IPMI_NETFN_FIRMWARE;
|
||||||
req.msg.cmd = KFWUM_CMD_ID_GET_FIRMWARE_STATUS;
|
req.msg.cmd = KFWUM_CMD_ID_GET_FIRMWARE_STATUS;
|
||||||
req.msg.data = &counter;
|
req.msg.data = &counter;
|
||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Firmware Get Status Command.");
|
"Error in FWUM Firmware Get Status Command.");
|
||||||
rc = (-1);
|
rc = (-1);
|
||||||
@ -668,10 +668,10 @@ KfwumManualRollback(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in FWUM Manual Rollback Command.");
|
lprintf(LOG_ERR, "Error in FWUM Manual Rollback Command.");
|
||||||
return (-1);
|
return (-1);
|
||||||
} else if (rsp->ccode != 0) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Manual Rollback Command returned %x",
|
"Error in FWUM Manual Rollback Command returned %x",
|
||||||
rsp->ccode);
|
rsp->ccode);
|
||||||
@ -707,7 +707,7 @@ KfwumStartFirmwareImage(struct ipmi_intf *intf, unsigned long length,
|
|||||||
req.msg.data_len = 6;
|
req.msg.data_len = 6;
|
||||||
}
|
}
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Firmware Start Firmware Image Download Command.");
|
"Error in FWUM Firmware Start Firmware Image Download Command.");
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -755,13 +755,13 @@ KfwumSaveFirmwareImage(struct ipmi_intf *intf, unsigned char sequenceNumber,
|
|||||||
/* + 1 => sequenceNumber*/
|
/* + 1 => sequenceNumber*/
|
||||||
}
|
}
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Firmware Save Firmware Image Download Command.");
|
"Error in FWUM Firmware Save Firmware Image Download Command.");
|
||||||
/* We don't receive "C7" on errors with IOL,
|
/* We don't receive "C7" on errors with IOL,
|
||||||
* instead we receive nothing
|
* instead we receive nothing
|
||||||
*/
|
*/
|
||||||
if (strstr(intf->name, "lan") != NULL) {
|
if (strstr(intf->name, "lan")) {
|
||||||
no_rsp++;
|
no_rsp++;
|
||||||
if (no_rsp < FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT) {
|
if (no_rsp < FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT) {
|
||||||
*pInBufLength -= 1;
|
*pInBufLength -= 1;
|
||||||
@ -772,7 +772,7 @@ KfwumSaveFirmwareImage(struct ipmi_intf *intf, unsigned char sequenceNumber,
|
|||||||
*pInBufLength = 0;
|
*pInBufLength = 0;
|
||||||
break;
|
break;
|
||||||
} /* For other interface keep trying */
|
} /* For other interface keep trying */
|
||||||
} else if (rsp->ccode != 0) {
|
} else if (rsp->ccode) {
|
||||||
if (rsp->ccode == 0xc0) {
|
if (rsp->ccode == 0xc0) {
|
||||||
sleep(1);
|
sleep(1);
|
||||||
} else if ((rsp->ccode == 0xc7)
|
} else if ((rsp->ccode == 0xc7)
|
||||||
@ -836,12 +836,9 @@ KfwumFinishFirmwareImage(struct ipmi_intf *intf, tKFWUM_InFirmwareInfo firmInfo)
|
|||||||
/* Infinite loop if BMC doesn't reply or replies 0xc0 every time. */
|
/* Infinite loop if BMC doesn't reply or replies 0xc0 every time. */
|
||||||
do {
|
do {
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
} while (rsp == NULL || rsp->ccode == 0xc0);
|
} while (!rsp || rsp->ccode == 0xc0);
|
||||||
if (!rsp) {
|
|
||||||
lprintf(LOG_ERR,
|
if (rsp->ccode) {
|
||||||
"Error in FWUM Firmware Finish Firmware Image Download Command.");
|
|
||||||
return (-1);
|
|
||||||
} else if (rsp->ccode != 0) {
|
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"FWUM Firmware Finish Firmware Image Download returned %x",
|
"FWUM Firmware Finish Firmware Image Download returned %x",
|
||||||
rsp->ccode);
|
rsp->ccode);
|
||||||
@ -861,7 +858,6 @@ KfwumUploadFirmware(struct ipmi_intf *intf, unsigned char *pBuffer,
|
|||||||
unsigned long lastAddress = 0;
|
unsigned long lastAddress = 0;
|
||||||
unsigned char sequenceNumber = 0;
|
unsigned char sequenceNumber = 0;
|
||||||
unsigned char retry = FWUM_MAX_UPLOAD_RETRY;
|
unsigned char retry = FWUM_MAX_UPLOAD_RETRY;
|
||||||
unsigned char isLengthValid = 1;
|
|
||||||
do {
|
do {
|
||||||
writeSize = save_fw_nfo.bufferSize - save_fw_nfo.overheadSize;
|
writeSize = save_fw_nfo.bufferSize - save_fw_nfo.overheadSize;
|
||||||
/* Reach the end */
|
/* Reach the end */
|
||||||
@ -892,14 +888,14 @@ KfwumUploadFirmware(struct ipmi_intf *intf, unsigned char *pBuffer,
|
|||||||
}
|
}
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
if ((address % 1024) == 0) {
|
if ((address % 1024) == 0) {
|
||||||
KfwumShowProgress("Writting Firmware in Flash",
|
KfwumShowProgress("Writing Firmware in Flash",
|
||||||
address, totalSize);
|
address, totalSize);
|
||||||
}
|
}
|
||||||
sequenceNumber++;
|
sequenceNumber++;
|
||||||
}
|
}
|
||||||
} while ((rc == 0) && (address < totalSize));
|
} while ((rc == 0) && (address < totalSize));
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
KfwumShowProgress("Writting Firmware in Flash",
|
KfwumShowProgress("Writing Firmware in Flash",
|
||||||
100, 100);
|
100, 100);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
@ -921,7 +917,7 @@ KfwumStartFirmwareUpgrade(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Firmware Start Firmware Upgrade Command");
|
"Error in FWUM Firmware Start Firmware Upgrade Command");
|
||||||
rc = (-1);
|
rc = (-1);
|
||||||
@ -954,7 +950,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf)
|
|||||||
(chunkIdx < TRACE_LOG_CHUNK_COUNT)
|
(chunkIdx < TRACE_LOG_CHUNK_COUNT)
|
||||||
&& (rc == 0);
|
&& (rc == 0);
|
||||||
chunkIdx++) {
|
chunkIdx++) {
|
||||||
/* Retreive each log chunk and print it */
|
/* Retrieve each log chunk and print it */
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = IPMI_NETFN_FIRMWARE;
|
req.msg.netfn = IPMI_NETFN_FIRMWARE;
|
||||||
req.msg.cmd = KFWUM_CMD_ID_GET_TRACE_LOG;
|
req.msg.cmd = KFWUM_CMD_ID_GET_TRACE_LOG;
|
||||||
@ -962,7 +958,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 1;
|
req.msg.data_len = 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error in FWUM Firmware Get Trace Log Command");
|
"Error in FWUM Firmware Get Trace Log Command");
|
||||||
rc = (-1);
|
rc = (-1);
|
||||||
@ -975,7 +971,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (cmdIdx=0; cmdIdx < TRACE_LOG_CHUNK_SIZE; cmdIdx++) {
|
for (cmdIdx=0; cmdIdx < TRACE_LOG_CHUNK_SIZE; cmdIdx++) {
|
||||||
/* Don't diplay commands with an invalid state */
|
/* Don't display commands with an invalid state */
|
||||||
if ((rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx + 1] != 0)
|
if ((rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx + 1] != 0)
|
||||||
&& (rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx] < KFWUM_CMD_ID_STD_MAX_CMD)) {
|
&& (rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx] < KFWUM_CMD_ID_STD_MAX_CMD)) {
|
||||||
printf(" Cmd ID: %17s -- CmdState: %10s -- CompCode: %2x\n",
|
printf(" Cmd ID: %17s -- CmdState: %10s -- CompCode: %2x\n",
|
||||||
@ -1005,7 +1001,7 @@ KfwumGetInfoFromFirmware(unsigned char *pBuf, unsigned long bufSize,
|
|||||||
}
|
}
|
||||||
offset = IN_FIRMWARE_INFO_OFFSET_LOCATION;
|
offset = IN_FIRMWARE_INFO_OFFSET_LOCATION;
|
||||||
|
|
||||||
/* Now, fill the structure with read informations */
|
/* Now, fill the structure with read information */
|
||||||
pInfo->checksum = (unsigned short)KWUM_GET_BYTE_AT_OFFSET(pBuf,
|
pInfo->checksum = (unsigned short)KWUM_GET_BYTE_AT_OFFSET(pBuf,
|
||||||
offset + 0 + IN_FIRMWARE_INFO_OFFSET_CHECKSUM ) << 8;
|
offset + 0 + IN_FIRMWARE_INFO_OFFSET_CHECKSUM ) << 8;
|
||||||
|
|
||||||
|
@ -71,7 +71,6 @@ typedef struct gendev_eeprom_info
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
ipmi_gendev_get_eeprom_size(
|
ipmi_gendev_get_eeprom_size(
|
||||||
struct ipmi_intf *intf,
|
|
||||||
struct sdr_record_generic_locator *dev,
|
struct sdr_record_generic_locator *dev,
|
||||||
t_gendev_eeprom_info *info
|
t_gendev_eeprom_info *info
|
||||||
)
|
)
|
||||||
@ -88,8 +87,7 @@ ipmi_gendev_get_eeprom_size(
|
|||||||
lprintf(LOG_ERR, "DevType : %x", dev->dev_type);
|
lprintf(LOG_ERR, "DevType : %x", dev->dev_type);
|
||||||
lprintf(LOG_ERR, "DevType Mod: %x", dev->dev_type_modifier);
|
lprintf(LOG_ERR, "DevType Mod: %x", dev->dev_type_modifier);
|
||||||
*/
|
*/
|
||||||
if( info != NULL)
|
if (info) {
|
||||||
{
|
|
||||||
switch(dev->dev_type)
|
switch(dev->dev_type)
|
||||||
{
|
{
|
||||||
case 0x08: // 24C01
|
case 0x08: // 24C01
|
||||||
@ -192,7 +190,7 @@ ipmi_gendev_read_file(
|
|||||||
int eeprom_size;
|
int eeprom_size;
|
||||||
t_gendev_eeprom_info eeprom_info;
|
t_gendev_eeprom_info eeprom_info;
|
||||||
|
|
||||||
eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info);
|
eeprom_size = ipmi_gendev_get_eeprom_size(dev, &eeprom_info);
|
||||||
|
|
||||||
if(eeprom_size > 0)
|
if(eeprom_size > 0)
|
||||||
{
|
{
|
||||||
@ -280,8 +278,7 @@ ipmi_gendev_read_file(
|
|||||||
msize
|
msize
|
||||||
);
|
);
|
||||||
|
|
||||||
if (rsp != NULL)
|
if (rsp) {
|
||||||
{
|
|
||||||
retryCounter = GENDEV_RETRY_COUNT;
|
retryCounter = GENDEV_RETRY_COUNT;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
@ -364,7 +361,7 @@ ipmi_gendev_write_file(
|
|||||||
int eeprom_size;
|
int eeprom_size;
|
||||||
t_gendev_eeprom_info eeprom_info;
|
t_gendev_eeprom_info eeprom_info;
|
||||||
|
|
||||||
eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info);
|
eeprom_size = ipmi_gendev_get_eeprom_size(dev, &eeprom_info);
|
||||||
|
|
||||||
if(eeprom_size > 0)
|
if(eeprom_size > 0)
|
||||||
{
|
{
|
||||||
@ -376,7 +373,7 @@ ipmi_gendev_write_file(
|
|||||||
|
|
||||||
if(fp)
|
if(fp)
|
||||||
{
|
{
|
||||||
/* Retreive file length, check if it's fits the Eeprom Size */
|
/* Retrieve file length, check if it's fits the Eeprom Size */
|
||||||
fseek(fp, 0 ,SEEK_END);
|
fseek(fp, 0 ,SEEK_END);
|
||||||
fileLength = ftell(fp);
|
fileLength = ftell(fp);
|
||||||
|
|
||||||
@ -457,8 +454,6 @@ ipmi_gendev_write_file(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(
|
for(
|
||||||
retryCounter = 0;
|
retryCounter = 0;
|
||||||
retryCounter<GENDEV_RETRY_COUNT;
|
retryCounter<GENDEV_RETRY_COUNT;
|
||||||
@ -476,8 +471,7 @@ ipmi_gendev_write_file(
|
|||||||
i2caddr+= (((eeprom_info.size) % address_span_size) * 2);
|
i2caddr+= (((eeprom_info.size) % address_span_size) * 2);
|
||||||
|
|
||||||
rsp = ipmi_master_write_read(intf, i2cbus, i2caddr, (uint8_t *) wrByte, eeprom_info.address_length+msize, 0);
|
rsp = ipmi_master_write_read(intf, i2cbus, i2caddr, (uint8_t *) wrByte, eeprom_info.address_length+msize, 0);
|
||||||
if (rsp != NULL)
|
if (rsp) {
|
||||||
{
|
|
||||||
retryCounter = GENDEV_RETRY_COUNT;
|
retryCounter = GENDEV_RETRY_COUNT;
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
@ -495,8 +489,7 @@ ipmi_gendev_write_file(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( rc == 0 )
|
if (!rc) {
|
||||||
{
|
|
||||||
static uint8_t previousCompleted = 101;
|
static uint8_t previousCompleted = 101;
|
||||||
percentCompleted = ((counter * 100) / eeprom_info.size );
|
percentCompleted = ((counter * 100) / eeprom_info.size );
|
||||||
|
|
||||||
@ -548,11 +541,7 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
|
|
||||||
lprintf(LOG_ERR, "Rx gendev command: %s", argv[0]);
|
lprintf(LOG_ERR, "Rx gendev command: %s", argv[0]);
|
||||||
|
|
||||||
if (
|
if (!argc || !strcmp(argv[0], "help"))
|
||||||
(argc == 0)
|
|
||||||
||
|
|
||||||
(strncmp(argv[0], "help", 4) == 0)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"SDR Commands: list read write");
|
"SDR Commands: list read write");
|
||||||
@ -562,18 +551,12 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
" read <sdr name> <file> Read to file eeprom specify by Generic Device Locators");
|
" read <sdr name> <file> Read to file eeprom specify by Generic Device Locators");
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
" write <sdr name> <file> Write from file eeprom specify by Generic Device Locators");
|
" write <sdr name> <file> Write from file eeprom specify by Generic Device Locators");
|
||||||
}
|
} else if (!strcmp(argv[0], "list")) {
|
||||||
else if ( strncmp(argv[0], "list", 4) == 0)
|
rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR);
|
||||||
{
|
} else if (!strcmp(argv[0], "read")) {
|
||||||
rc = ipmi_sdr_print_sdr(intf,
|
|
||||||
SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR);
|
|
||||||
}
|
|
||||||
else if (strncmp(argv[0], "read", 4) == 0)
|
|
||||||
{
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
lprintf(LOG_ERR, "usage: gendev read <gendev> <filename>");
|
lprintf(LOG_ERR, "usage: gendev read <gendev> <filename>");
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
struct sdr_record_list *sdr;
|
struct sdr_record_list *sdr;
|
||||||
|
|
||||||
lprintf(LOG_ERR, "Gendev read sdr name : %s", argv[1]);
|
lprintf(LOG_ERR, "Gendev read sdr name : %s", argv[1]);
|
||||||
@ -582,14 +565,12 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
|
|
||||||
/* lookup by sensor name */
|
/* lookup by sensor name */
|
||||||
sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
|
sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
|
||||||
if (sdr == NULL)
|
if (!sdr) {
|
||||||
{
|
|
||||||
lprintf(LOG_ERR, "Sensor data record not found!");
|
lprintf(LOG_ERR, "Sensor data record not found!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) {
|
||||||
{
|
|
||||||
lprintf(LOG_ERR, "Target SDR is not a generic device locator");
|
lprintf(LOG_ERR, "Target SDR is not a generic device locator");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -598,13 +579,10 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
ipmi_gendev_read_file(intf, sdr->record.genloc, argv[2]);
|
ipmi_gendev_read_file(intf, sdr->record.genloc, argv[2]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
} else if (!strcmp(argv[0], "write")) {
|
||||||
else if (strncmp(argv[0], "write", 5) == 0)
|
|
||||||
{
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
lprintf(LOG_ERR, "usage: gendev write <gendev> <filename>");
|
lprintf(LOG_ERR, "usage: gendev write <gendev> <filename>");
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
struct sdr_record_list *sdr;
|
struct sdr_record_list *sdr;
|
||||||
|
|
||||||
lprintf(LOG_ERR, "Gendev write sdr name : %s", argv[1]);
|
lprintf(LOG_ERR, "Gendev write sdr name : %s", argv[1]);
|
||||||
@ -613,25 +591,20 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
|
|
||||||
/* lookup by sensor name */
|
/* lookup by sensor name */
|
||||||
sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
|
sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
|
||||||
if (sdr == NULL)
|
if (!sdr) {
|
||||||
{
|
|
||||||
lprintf(LOG_ERR, "Sensor data record not found!");
|
lprintf(LOG_ERR, "Sensor data record not found!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR)
|
if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) {
|
||||||
{
|
|
||||||
lprintf(LOG_ERR, "Target SDR is not a generic device locator");
|
lprintf(LOG_ERR, "Target SDR is not a generic device locator");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
lprintf(LOG_ERR, "Gendev write file name: %s", argv[2]);
|
lprintf(LOG_ERR, "Gendev write file name: %s", argv[2]);
|
||||||
ipmi_gendev_write_file(intf, sdr->record.genloc, argv[2]);
|
ipmi_gendev_write_file(intf, sdr->record.genloc, argv[2]);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
lprintf(LOG_ERR, "Invalid gendev command: %s", argv[0]);
|
lprintf(LOG_ERR, "Invalid gendev command: %s", argv[0]);
|
||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2006 Kontron Canada, Inc. All Rights Reserved.
|
* Copyright (c) 2006 Kontron Canada, Inc. All Rights Reserved.
|
||||||
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* Copyright 2020 Joyent, Inc.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@ -38,16 +39,37 @@
|
|||||||
#include <ipmitool/ipmi_strings.h>
|
#include <ipmitool/ipmi_strings.h>
|
||||||
#include <ipmitool/log.h>
|
#include <ipmitool/log.h>
|
||||||
#include "../src/plugins/lan/md5.h"
|
#include "../src/plugins/lan/md5.h"
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#if HAVE_CONFIG_H
|
#if HAVE_CONFIG_H
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
extern int verbose;
|
extern int verbose;
|
||||||
|
|
||||||
|
VERSIONINFO gVersionInfo[HPMFWUPG_COMPONENT_ID_MAX];
|
||||||
|
|
||||||
int HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename,
|
int HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename,
|
||||||
int activate, int, int);
|
int activate, int, int);
|
||||||
int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx *pFwupgCtx);
|
int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx *pFwupgCtx);
|
||||||
@ -106,6 +128,10 @@ int HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
struct ipmi_intf *intf,
|
struct ipmi_intf *intf,
|
||||||
int option,
|
int option,
|
||||||
int *pFlagColdReset);
|
int *pFlagColdReset);
|
||||||
|
int
|
||||||
|
HpmfwupgPreUpgradeCheck(
|
||||||
|
struct HpmfwupgUpgradeCtx *pFwupgCtx,
|
||||||
|
int componentMask, int option);
|
||||||
|
|
||||||
/* HpmGetuserInput - get input from user
|
/* HpmGetuserInput - get input from user
|
||||||
*
|
*
|
||||||
@ -294,7 +320,6 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option)
|
|||||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
||||||
int rc = HPMFWUPG_SUCCESS;
|
int rc = HPMFWUPG_SUCCESS;
|
||||||
int componentId = 0;
|
int componentId = 0;
|
||||||
int flagColdReset = FALSE;
|
|
||||||
struct ipm_devid_rsp devIdrsp;
|
struct ipm_devid_rsp devIdrsp;
|
||||||
struct HpmfwupgGetComponentPropertiesCtx getCompProp;
|
struct HpmfwupgGetComponentPropertiesCtx getCompProp;
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
@ -344,6 +369,8 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option)
|
|||||||
generalPropResp.GeneralCompProperties.bitfield.rollbackBackup;
|
generalPropResp.GeneralCompProperties.bitfield.rollbackBackup;
|
||||||
gVersionInfo[componentId].coldResetRequired = getCompProp.resp.Response.
|
gVersionInfo[componentId].coldResetRequired = getCompProp.resp.Response.
|
||||||
generalPropResp.GeneralCompProperties.bitfield.payloadColdReset;
|
generalPropResp.GeneralCompProperties.bitfield.payloadColdReset;
|
||||||
|
gVersionInfo[componentId].deferredActivationSupported = getCompProp.resp.Response.
|
||||||
|
generalPropResp.GeneralCompProperties.bitfield.deferredActivation;
|
||||||
getCompProp.req.selector = HPMFWUPG_COMP_DESCRIPTION_STRING;
|
getCompProp.req.selector = HPMFWUPG_COMP_DESCRIPTION_STRING;
|
||||||
rc = HpmfwupgGetComponentProperties(intf, &getCompProp);
|
rc = HpmfwupgGetComponentProperties(intf, &getCompProp);
|
||||||
if (rc != HPMFWUPG_SUCCESS) {
|
if (rc != HPMFWUPG_SUCCESS) {
|
||||||
@ -395,6 +422,16 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option)
|
|||||||
gVersionInfo[componentId].rollbackAux[2] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[4];
|
gVersionInfo[componentId].rollbackAux[2] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[4];
|
||||||
gVersionInfo[componentId].rollbackAux[3] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[5];
|
gVersionInfo[componentId].rollbackAux[3] = getCompProp.resp.Response.rollbackFwVersionResp.rollbackFwVersion[5];
|
||||||
}
|
}
|
||||||
|
mode |= ROLLBACK_VER;
|
||||||
|
} else {
|
||||||
|
gVersionInfo[componentId].rollbackMajor = 0xff;
|
||||||
|
gVersionInfo[componentId].rollbackMinor = 0xff;
|
||||||
|
gVersionInfo[componentId].rollbackAux[0] = 0xff;
|
||||||
|
gVersionInfo[componentId].rollbackAux[1] = 0xff;
|
||||||
|
gVersionInfo[componentId].rollbackAux[2] = 0xff;
|
||||||
|
gVersionInfo[componentId].rollbackAux[3] = 0xff;
|
||||||
|
}
|
||||||
|
if (gVersionInfo[componentId].deferredActivationSupported) {
|
||||||
getCompProp.req.selector = HPMFWUPG_COMP_DEFERRED_FIRMWARE_VERSION;
|
getCompProp.req.selector = HPMFWUPG_COMP_DEFERRED_FIRMWARE_VERSION;
|
||||||
rc = HpmfwupgGetComponentProperties(intf, &getCompProp);
|
rc = HpmfwupgGetComponentProperties(intf, &getCompProp);
|
||||||
if (rc != HPMFWUPG_SUCCESS) {
|
if (rc != HPMFWUPG_SUCCESS) {
|
||||||
@ -411,14 +448,7 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option)
|
|||||||
gVersionInfo[componentId].deferredAux[2] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[4];
|
gVersionInfo[componentId].deferredAux[2] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[4];
|
||||||
gVersionInfo[componentId].deferredAux[3] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[5];
|
gVersionInfo[componentId].deferredAux[3] = getCompProp.resp.Response.deferredFwVersionResp.deferredFwVersion[5];
|
||||||
}
|
}
|
||||||
mode |= ROLLBACK_VER;
|
|
||||||
} else {
|
} else {
|
||||||
gVersionInfo[componentId].rollbackMajor = 0xff;
|
|
||||||
gVersionInfo[componentId].rollbackMinor = 0xff;
|
|
||||||
gVersionInfo[componentId].rollbackAux[0] = 0xff;
|
|
||||||
gVersionInfo[componentId].rollbackAux[1] = 0xff;
|
|
||||||
gVersionInfo[componentId].rollbackAux[2] = 0xff;
|
|
||||||
gVersionInfo[componentId].rollbackAux[3] = 0xff;
|
|
||||||
gVersionInfo[componentId].deferredMajor = 0xff;
|
gVersionInfo[componentId].deferredMajor = 0xff;
|
||||||
gVersionInfo[componentId].deferredMinor = 0xff;
|
gVersionInfo[componentId].deferredMinor = 0xff;
|
||||||
gVersionInfo[componentId].deferredAux[0] = 0xff;
|
gVersionInfo[componentId].deferredAux[0] = 0xff;
|
||||||
@ -426,13 +456,6 @@ HpmfwupgTargetCheck(struct ipmi_intf *intf, int option)
|
|||||||
gVersionInfo[componentId].deferredAux[2] = 0xff;
|
gVersionInfo[componentId].deferredAux[2] = 0xff;
|
||||||
gVersionInfo[componentId].deferredAux[3] = 0xff;
|
gVersionInfo[componentId].deferredAux[3] = 0xff;
|
||||||
}
|
}
|
||||||
if (gVersionInfo[componentId].coldResetRequired) {
|
|
||||||
/*
|
|
||||||
* If any of the component indicates that the Payload Cold reset is required
|
|
||||||
* then set the flag
|
|
||||||
*/
|
|
||||||
flagColdReset = TRUE;
|
|
||||||
}
|
|
||||||
if (option & VIEW_MODE) {
|
if (option & VIEW_MODE) {
|
||||||
HpmDisplayVersion(mode,
|
HpmDisplayVersion(mode,
|
||||||
&gVersionInfo[componentId],
|
&gVersionInfo[componentId],
|
||||||
@ -496,10 +519,9 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate,
|
|||||||
lprintf(LOG_NOTICE, "\nPerforming upgrade stage:");
|
lprintf(LOG_NOTICE, "\nPerforming upgrade stage:");
|
||||||
}
|
}
|
||||||
if (option & VIEW_MODE) {
|
if (option & VIEW_MODE) {
|
||||||
rc = HpmfwupgPreUpgradeCheck(intf,
|
rc = HpmfwupgPreUpgradeCheck(&fwupgCtx,componentMask, VIEW_MODE);
|
||||||
&fwupgCtx,componentMask, VIEW_MODE);
|
|
||||||
} else {
|
} else {
|
||||||
rc = HpmfwupgPreUpgradeCheck(intf, &fwupgCtx,
|
rc = HpmfwupgPreUpgradeCheck(&fwupgCtx,
|
||||||
componentMask, option);
|
componentMask, option);
|
||||||
if (rc == HPMFWUPG_SUCCESS) {
|
if (rc == HPMFWUPG_SUCCESS) {
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
@ -523,7 +545,7 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate,
|
|||||||
}
|
}
|
||||||
if (rc == HPMFWUPG_SUCCESS) {
|
if (rc == HPMFWUPG_SUCCESS) {
|
||||||
if (option & VIEW_MODE) {
|
if (option & VIEW_MODE) {
|
||||||
/* Dont display anything here in case we are just viewing it */
|
/* Don't display anything here in case we are just viewing it */
|
||||||
lprintf(LOG_NOTICE," ");
|
lprintf(LOG_NOTICE," ");
|
||||||
} else if (option & COMPARE_MODE) {
|
} else if (option & COMPARE_MODE) {
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
@ -533,7 +555,7 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate,
|
|||||||
"\nFirmware upgrade procedure successful\n");
|
"\nFirmware upgrade procedure successful\n");
|
||||||
}
|
}
|
||||||
} else if (option & VIEW_MODE) {
|
} else if (option & VIEW_MODE) {
|
||||||
/* Dont display anything here in case we are just viewing it */
|
/* Don't display anything here in case we are just viewing it */
|
||||||
lprintf(LOG_NOTICE," ");
|
lprintf(LOG_NOTICE," ");
|
||||||
} else if (option & COMPARE_MODE) {
|
} else if (option & COMPARE_MODE) {
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
@ -642,7 +664,7 @@ HpmfwupgPreparationStage(struct ipmi_intf *intf,
|
|||||||
if (rc != HPMFWUPG_SUCCESS) {
|
if (rc != HPMFWUPG_SUCCESS) {
|
||||||
/* Giving one more chance to user to check whether its OK to continue even if the
|
/* Giving one more chance to user to check whether its OK to continue even if the
|
||||||
* product ID does not match. This is helpful as sometimes we just want to update
|
* product ID does not match. This is helpful as sometimes we just want to update
|
||||||
* and dont care whether we have a different product Id. If the user says NO then
|
* and don't care whether we have a different product Id. If the user says NO then
|
||||||
* we need to just bail out from here
|
* we need to just bail out from here
|
||||||
*/
|
*/
|
||||||
if (!((option & FORCE_MODE) || (option & VIEW_MODE))) {
|
if (!((option & FORCE_MODE) || (option & VIEW_MODE))) {
|
||||||
@ -714,7 +736,7 @@ HpmfwupgPreparationStage(struct ipmi_intf *intf,
|
|||||||
"\n Some components present in the image file are not supported by the IPMC");
|
"\n Some components present in the image file are not supported by the IPMC");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
/* Make sure the upgrade is desirable rigth now */
|
/* Make sure the upgrade is desirable right now */
|
||||||
if (pFwupgCtx->targetCap.GlobalCapabilities.bitField.fwUpgUndesirable == 1) {
|
if (pFwupgCtx->targetCap.GlobalCapabilities.bitField.fwUpgUndesirable == 1) {
|
||||||
lprintf(LOG_NOTICE, "\n Upgrade undesirable at this moment");
|
lprintf(LOG_NOTICE, "\n Upgrade undesirable at this moment");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
@ -823,7 +845,7 @@ HpmfwupgValidateActionRecordChecksum(struct HpmfwupgActionRecord *pActionRecord)
|
|||||||
* is same as target version.
|
* is same as target version.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
HpmfwupgPreUpgradeCheck(struct ipmi_intf *intf,
|
HpmfwupgPreUpgradeCheck(
|
||||||
struct HpmfwupgUpgradeCtx *pFwupgCtx,
|
struct HpmfwupgUpgradeCtx *pFwupgCtx,
|
||||||
int componentMask, int option)
|
int componentMask, int option)
|
||||||
{
|
{
|
||||||
@ -991,15 +1013,11 @@ HpmfwupgUpgradeStage(struct ipmi_intf *intf,
|
|||||||
struct HpmfwupgActionRecord* pActionRecord;
|
struct HpmfwupgActionRecord* pActionRecord;
|
||||||
int rc = HPMFWUPG_SUCCESS;
|
int rc = HPMFWUPG_SUCCESS;
|
||||||
unsigned char *pImagePtr;
|
unsigned char *pImagePtr;
|
||||||
unsigned int actionsSize;
|
|
||||||
int flagColdReset = FALSE;
|
int flagColdReset = FALSE;
|
||||||
time_t start,end;
|
|
||||||
/* Put pointer after image header */
|
/* Put pointer after image header */
|
||||||
pImagePtr = (unsigned char*)
|
pImagePtr = (unsigned char*)
|
||||||
(pFwupgCtx->pImageData + sizeof(struct HpmfwupgImageHeader) +
|
(pFwupgCtx->pImageData + sizeof(struct HpmfwupgImageHeader) +
|
||||||
pImageHeader->oemDataLength + sizeof(unsigned char)/*checksum*/);
|
pImageHeader->oemDataLength + sizeof(unsigned char)/*checksum*/);
|
||||||
/* Deternime actions size */
|
|
||||||
actionsSize = pFwupgCtx->imageSize - sizeof(struct HpmfwupgImageHeader);
|
|
||||||
if (!(option & VIEW_MODE)) {
|
if (!(option & VIEW_MODE)) {
|
||||||
HpmDisplayUpgradeHeader();
|
HpmDisplayUpgradeHeader();
|
||||||
}
|
}
|
||||||
@ -1195,7 +1213,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
} else {
|
} else {
|
||||||
count = (unsigned short)((pDataTemp+lengthOfBlock) - pData);
|
count = (unsigned short)((pDataTemp+lengthOfBlock) - pData);
|
||||||
}
|
}
|
||||||
memcpy(&uploadCmd.req->data, pData, bufLength);
|
memcpy(&uploadCmd.req->data, pData, count);
|
||||||
imageOffset = 0x00;
|
imageOffset = 0x00;
|
||||||
blockLength = 0x00;
|
blockLength = 0x00;
|
||||||
numTxPkts++;
|
numTxPkts++;
|
||||||
@ -1206,7 +1224,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
if (rc == HPMFWUPG_UPLOAD_BLOCK_LENGTH && !bufLengthIsSet) {
|
if (rc == HPMFWUPG_UPLOAD_BLOCK_LENGTH && !bufLengthIsSet) {
|
||||||
rc = HPMFWUPG_SUCCESS;
|
rc = HPMFWUPG_SUCCESS;
|
||||||
/* Retry with a smaller buffer length */
|
/* Retry with a smaller buffer length */
|
||||||
if (strstr(intf->name,"lan") != NULL && bufLength > 8) {
|
if (strstr(intf->name,"lan") && bufLength > 8) {
|
||||||
bufLength-= 8;
|
bufLength-= 8;
|
||||||
lprintf(LOG_INFO,
|
lprintf(LOG_INFO,
|
||||||
"Trying reduced buffer length: %d",
|
"Trying reduced buffer length: %d",
|
||||||
@ -1235,10 +1253,12 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
} else {
|
} else {
|
||||||
/* success, buf length is valid */
|
/* success, buf length is valid */
|
||||||
bufLengthIsSet = 1;
|
bufLengthIsSet = 1;
|
||||||
if (blockLength > firmwareLength) {
|
if (imageOffset + blockLength > firmwareLength ||
|
||||||
|
imageOffset + blockLength < blockLength) {
|
||||||
/*
|
/*
|
||||||
* blockLength is the remaining length of the firmware to upload so
|
* blockLength is the remaining length of the firmware to upload so
|
||||||
* if its greater than the firmware length then its kind of error
|
* if imageOffset and blockLength sum is greater than the firmware
|
||||||
|
* length then its kind of error
|
||||||
*/
|
*/
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
"\n Error in Upload FIRMWARE command [rc=%d]\n",
|
"\n Error in Upload FIRMWARE command [rc=%d]\n",
|
||||||
@ -1247,6 +1267,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
"\n TotalSent:0x%x Img offset:0x%x Blk length:0x%x Fwlen:0x%x\n",
|
"\n TotalSent:0x%x Img offset:0x%x Blk length:0x%x Fwlen:0x%x\n",
|
||||||
totalSent,imageOffset,blockLength,firmwareLength);
|
totalSent,imageOffset,blockLength,firmwareLength);
|
||||||
rc = HPMFWUPG_ERROR;
|
rc = HPMFWUPG_ERROR;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
totalSent += count;
|
totalSent += count;
|
||||||
if (imageOffset != 0x00) {
|
if (imageOffset != 0x00) {
|
||||||
@ -1294,7 +1315,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components,
|
|||||||
HpmDisplayUpgrade(1,0,0,0);
|
HpmDisplayUpgrade(1,0,0,0);
|
||||||
if ((option & COMPARE_MODE)
|
if ((option & COMPARE_MODE)
|
||||||
&& !pFwupgCtx->genCompProp[pFwupgCtx->componentId].GeneralCompProperties.bitfield.comparisonSupport) {
|
&& !pFwupgCtx->genCompProp[pFwupgCtx->componentId].GeneralCompProperties.bitfield.comparisonSupport) {
|
||||||
printf("| |Comparison isn't supported for given compenent. |\n");
|
printf("| |Comparison isn't supported for given component. |\n");
|
||||||
}
|
}
|
||||||
*pImagePtr = pDataInitial + firmwareLength;
|
*pImagePtr = pDataInitial + firmwareLength;
|
||||||
}
|
}
|
||||||
@ -1380,22 +1401,26 @@ int
|
|||||||
HpmfwupgGetBufferFromFile(char *imageFilename,
|
HpmfwupgGetBufferFromFile(char *imageFilename,
|
||||||
struct HpmfwupgUpgradeCtx *pFwupgCtx)
|
struct HpmfwupgUpgradeCtx *pFwupgCtx)
|
||||||
{
|
{
|
||||||
int rc = HPMFWUPG_SUCCESS;
|
int rc = HPMFWUPG_ERROR;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
FILE *pImageFile = fopen(imageFilename, "rb");
|
FILE *pImageFile = fopen(imageFilename, "rb");
|
||||||
if (pImageFile == NULL) {
|
if (!pImageFile) {
|
||||||
lprintf(LOG_ERR, "Cannot open image file '%s'",
|
lprintf(LOG_ERR, "Cannot open image file '%s'",
|
||||||
imageFilename);
|
imageFilename);
|
||||||
return HPMFWUPG_ERROR;
|
goto ret_no_close;
|
||||||
}
|
}
|
||||||
/* Get the raw data in file */
|
/* Get the raw data in file */
|
||||||
fseek(pImageFile, 0, SEEK_END);
|
ret = fseek(pImageFile, 0, SEEK_END);
|
||||||
|
if (ret != 0) {
|
||||||
|
lprintf(LOG_ERR, "Failed to seek in the image file '%s'",
|
||||||
|
imageFilename);
|
||||||
|
goto ret_close;
|
||||||
|
}
|
||||||
pFwupgCtx->imageSize = ftell(pImageFile);
|
pFwupgCtx->imageSize = ftell(pImageFile);
|
||||||
pFwupgCtx->pImageData = malloc(sizeof(unsigned char)*pFwupgCtx->imageSize);
|
pFwupgCtx->pImageData = malloc(sizeof(unsigned char)*pFwupgCtx->imageSize);
|
||||||
if (pFwupgCtx->pImageData == NULL) {
|
if (!pFwupgCtx->pImageData) {
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
fclose(pImageFile);
|
goto ret_close;
|
||||||
return HPMFWUPG_ERROR;
|
|
||||||
}
|
}
|
||||||
rewind(pImageFile);
|
rewind(pImageFile);
|
||||||
ret = fread(pFwupgCtx->pImageData,
|
ret = fread(pFwupgCtx->pImageData,
|
||||||
@ -1407,9 +1432,14 @@ HpmfwupgGetBufferFromFile(char *imageFilename,
|
|||||||
"Failed to read file %s size %d",
|
"Failed to read file %s size %d",
|
||||||
imageFilename,
|
imageFilename,
|
||||||
pFwupgCtx->imageSize);
|
pFwupgCtx->imageSize);
|
||||||
rc = HPMFWUPG_ERROR;
|
goto ret_close;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = HPMFWUPG_SUCCESS;
|
||||||
|
|
||||||
|
ret_close:
|
||||||
fclose(pImageFile);
|
fclose(pImageFile);
|
||||||
|
ret_no_close:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1423,11 +1453,11 @@ HpmfwupgGetDeviceId(struct ipmi_intf *intf, struct ipm_devid_rsp *pGetDevId)
|
|||||||
req.msg.cmd = BMC_GET_DEVICE_ID;
|
req.msg.cmd = BMC_GET_DEVICE_ID;
|
||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error getting device ID.");
|
lprintf(LOG_ERR, "Error getting device ID.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode != 0x00) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error getting device ID.");
|
lprintf(LOG_ERR, "Error getting device ID.");
|
||||||
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
||||||
rsp->ccode,
|
rsp->ccode,
|
||||||
@ -1451,12 +1481,12 @@ HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgGetTargetUpgCapabilitiesReq);
|
req.msg.data_len = sizeof(struct HpmfwupgGetTargetUpgCapabilitiesReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error getting target upgrade capabilities.");
|
"Error getting target upgrade capabilities.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode != 0x00) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
"Error getting target upgrade capabilities, ccode: 0x%x: %s",
|
"Error getting target upgrade capabilities, ccode: 0x%x: %s",
|
||||||
rsp->ccode,
|
rsp->ccode,
|
||||||
@ -1492,7 +1522,7 @@ HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf,
|
|||||||
pCtx->resp.GlobalCapabilities.bitField.autRollbackOverride ? 'y' : 'n');
|
pCtx->resp.GlobalCapabilities.bitField.autRollbackOverride ? 'y' : 'n');
|
||||||
lprintf(LOG_NOTICE, "IPMC degraded...........[%c] ",
|
lprintf(LOG_NOTICE, "IPMC degraded...........[%c] ",
|
||||||
pCtx->resp.GlobalCapabilities.bitField.ipmcDegradedDurinUpg ? 'y' : 'n');
|
pCtx->resp.GlobalCapabilities.bitField.ipmcDegradedDurinUpg ? 'y' : 'n');
|
||||||
lprintf(LOG_NOTICE, "Defered activation......[%c] ",
|
lprintf(LOG_NOTICE, "Deferred activation.....[%c] ",
|
||||||
pCtx->resp.GlobalCapabilities.bitField.deferActivation ? 'y' : 'n');
|
pCtx->resp.GlobalCapabilities.bitField.deferActivation ? 'y' : 'n');
|
||||||
lprintf(LOG_NOTICE, "Service affected........[%c] ",
|
lprintf(LOG_NOTICE, "Service affected........[%c] ",
|
||||||
pCtx->resp.GlobalCapabilities.bitField.servAffectDuringUpg ? 'y' : 'n');
|
pCtx->resp.GlobalCapabilities.bitField.servAffectDuringUpg ? 'y' : 'n');
|
||||||
@ -1528,12 +1558,12 @@ HpmfwupgGetComponentProperties(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgGetComponentPropertiesReq);
|
req.msg.data_len = sizeof(struct HpmfwupgGetComponentPropertiesReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
"Error getting component properties\n");
|
"Error getting component properties\n");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode != 0x00) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
"Error getting component properties");
|
"Error getting component properties");
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
@ -1654,11 +1684,11 @@ HpmfwupgAbortUpgrade(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgAbortUpgradeReq);
|
req.msg.data_len = sizeof(struct HpmfwupgAbortUpgradeReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
rsp = HpmfwupgSendCmd(intf, req, NULL);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error - aborting upgrade.");
|
lprintf(LOG_ERR, "Error - aborting upgrade.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode != 0x00) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error aborting upgrade");
|
lprintf(LOG_ERR, "Error aborting upgrade");
|
||||||
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
||||||
rsp->ccode,
|
rsp->ccode,
|
||||||
@ -1683,14 +1713,14 @@ HpmfwupgInitiateUpgradeAction(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgInitiateUpgradeActionReq);
|
req.msg.data_len = sizeof(struct HpmfwupgInitiateUpgradeActionReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error initiating upgrade action.");
|
lprintf(LOG_ERR, "Error initiating upgrade action.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
/* Long duration command handling */
|
/* Long duration command handling */
|
||||||
if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) {
|
if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) {
|
||||||
rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx);
|
rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx);
|
||||||
} else if (rsp->ccode != 0x00) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_NOTICE,"Error initiating upgrade action");
|
lprintf(LOG_NOTICE,"Error initiating upgrade action");
|
||||||
lprintf(LOG_NOTICE, "compcode=0x%x: %s",
|
lprintf(LOG_NOTICE, "compcode=0x%x: %s",
|
||||||
rsp->ccode,
|
rsp->ccode,
|
||||||
@ -1717,7 +1747,7 @@ HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf,
|
|||||||
/* 2 is the size of the upload struct - data */
|
/* 2 is the size of the upload struct - data */
|
||||||
req.msg.data_len = 2 + count;
|
req.msg.data_len = 2 + count;
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_NOTICE, "Error uploading firmware block.");
|
lprintf(LOG_NOTICE, "Error uploading firmware block.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -1753,7 +1783,7 @@ HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf,
|
|||||||
/* Long duration command handling */
|
/* Long duration command handling */
|
||||||
if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) {
|
if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) {
|
||||||
rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx);
|
rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx);
|
||||||
} else if (rsp->ccode != 0x00) {
|
} else if (rsp->ccode) {
|
||||||
/* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
/* PATCH --> This validation is to handle retryables errors codes on IPMB bus.
|
||||||
* This will be fixed in the next release of open ipmi and this
|
* This will be fixed in the next release of open ipmi and this
|
||||||
* check will have to be removed. (Buggy version = 39)
|
* check will have to be removed. (Buggy version = 39)
|
||||||
@ -1794,7 +1824,7 @@ HpmfwupgFinishFirmwareUpload(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgFinishFirmwareUploadReq);
|
req.msg.data_len = sizeof(struct HpmfwupgFinishFirmwareUploadReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error fininshing firmware upload.");
|
lprintf(LOG_ERR, "Error fininshing firmware upload.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -1831,7 +1861,7 @@ HpmfwupgActivateFirmware(struct ipmi_intf *intf,
|
|||||||
req.msg.data_len = sizeof(struct HpmfwupgActivateFirmwareReq)
|
req.msg.data_len = sizeof(struct HpmfwupgActivateFirmwareReq)
|
||||||
- (!pCtx->req.rollback_override ? 1 : 0);
|
- (!pCtx->req.rollback_override ? 1 : 0);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error activating firmware.");
|
lprintf(LOG_ERR, "Error activating firmware.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -1861,7 +1891,6 @@ HpmfwupgGetUpgradeStatus(struct ipmi_intf *intf,
|
|||||||
struct HpmfwupgUpgradeCtx *pFwupgCtx,
|
struct HpmfwupgUpgradeCtx *pFwupgCtx,
|
||||||
int silent)
|
int silent)
|
||||||
{
|
{
|
||||||
int rc = HPMFWUPG_SUCCESS;
|
|
||||||
struct ipmi_rs *rsp;
|
struct ipmi_rs *rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
pCtx->req.picmgId = HPMFWUPG_PICMG_IDENTIFIER;
|
pCtx->req.picmgId = HPMFWUPG_PICMG_IDENTIFIER;
|
||||||
@ -1933,7 +1962,7 @@ HpmfwupgManualFirmwareRollback(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgManualFirmwareRollbackReq);
|
req.msg.data_len = sizeof(struct HpmfwupgManualFirmwareRollbackReq);
|
||||||
rsp = HpmfwupgSendCmd(intf, req, &fwupgCtx);
|
rsp = HpmfwupgSendCmd(intf, req, &fwupgCtx);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error sending manual rollback.");
|
lprintf(LOG_ERR, "Error sending manual rollback.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -1944,7 +1973,7 @@ HpmfwupgManualFirmwareRollback(struct ipmi_intf *intf,
|
|||||||
printf("Waiting firmware rollback...");
|
printf("Waiting firmware rollback...");
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
rc = HpmfwupgQueryRollbackStatus(intf, &resCmd, &fwupgCtx);
|
rc = HpmfwupgQueryRollbackStatus(intf, &resCmd, &fwupgCtx);
|
||||||
} else if ( rsp->ccode != 0x00 ) {
|
} else if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error sending manual rollback");
|
lprintf(LOG_ERR, "Error sending manual rollback");
|
||||||
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
lprintf(LOG_ERR, "compcode=0x%x: %s",
|
||||||
rsp->ccode,
|
rsp->ccode,
|
||||||
@ -1971,7 +2000,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
|||||||
req.msg.data = (unsigned char*)&pCtx->req;
|
req.msg.data = (unsigned char*)&pCtx->req;
|
||||||
req.msg.data_len = sizeof(struct HpmfwupgQueryRollbackStatusReq);
|
req.msg.data_len = sizeof(struct HpmfwupgQueryRollbackStatusReq);
|
||||||
/* If we are not in upgrade context, we use default timeout values */
|
/* If we are not in upgrade context, we use default timeout values */
|
||||||
if (pFwupgCtx != NULL) {
|
if (pFwupgCtx) {
|
||||||
struct HpmfwupgImageHeader *pImageHeader;
|
struct HpmfwupgImageHeader *pImageHeader;
|
||||||
if (pFwupgCtx->pImageData) {
|
if (pFwupgCtx->pImageData) {
|
||||||
pImageHeader = (struct HpmfwupgImageHeader*)pFwupgCtx->pImageData;
|
pImageHeader = (struct HpmfwupgImageHeader*)pFwupgCtx->pImageData;
|
||||||
@ -1980,7 +2009,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
|||||||
rollbackTimeout = 0;
|
rollbackTimeout = 0;
|
||||||
}
|
}
|
||||||
/* Use the greater of the two timeouts (header and target caps) */
|
/* Use the greater of the two timeouts (header and target caps) */
|
||||||
rollbackTimeout = MAX(rollbackTimeout,
|
rollbackTimeout = __max(rollbackTimeout,
|
||||||
pFwupgCtx->targetCap.rollbackTimeout) * 5;
|
pFwupgCtx->targetCap.rollbackTimeout) * 5;
|
||||||
} else {
|
} else {
|
||||||
rollbackTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
rollbackTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
||||||
@ -2007,7 +2036,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
|||||||
&& ((rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS)
|
&& ((rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS)
|
||||||
|| (rsp->ccode == IPMI_CC_TIMEOUT))
|
|| (rsp->ccode == IPMI_CC_TIMEOUT))
|
||||||
&& (timeoutSec2 - timeoutSec1 < rollbackTimeout));
|
&& (timeoutSec2 - timeoutSec1 < rollbackTimeout));
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error getting upgrade status.");
|
lprintf(LOG_ERR, "Error getting upgrade status.");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -2015,13 +2044,13 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf,
|
|||||||
memcpy(&pCtx->resp, rsp->data,
|
memcpy(&pCtx->resp, rsp->data,
|
||||||
sizeof(struct HpmfwupgQueryRollbackStatusResp));
|
sizeof(struct HpmfwupgQueryRollbackStatusResp));
|
||||||
if (pCtx->resp.rollbackComp.ComponentBits.byte != 0) {
|
if (pCtx->resp.rollbackComp.ComponentBits.byte != 0) {
|
||||||
/* Rollback occured */
|
/* Rollback occurred */
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
"Rollback occured on component mask: 0x%02x",
|
"Rollback occurred on component mask: 0x%02x",
|
||||||
pCtx->resp.rollbackComp.ComponentBits.byte);
|
pCtx->resp.rollbackComp.ComponentBits.byte);
|
||||||
} else {
|
} else {
|
||||||
lprintf(LOG_NOTICE,
|
lprintf(LOG_NOTICE,
|
||||||
"No Firmware rollback occured");
|
"No Firmware rollback occurred");
|
||||||
}
|
}
|
||||||
} else if (rsp->ccode == 0x81) {
|
} else if (rsp->ccode == 0x81) {
|
||||||
lprintf(LOG_ERR,
|
lprintf(LOG_ERR,
|
||||||
@ -2051,11 +2080,11 @@ HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelftest
|
|||||||
unsigned int timeoutSec1, timeoutSec2;
|
unsigned int timeoutSec1, timeoutSec2;
|
||||||
pCtx->req.picmgId = HPMFWUPG_PICMG_IDENTIFIER;
|
pCtx->req.picmgId = HPMFWUPG_PICMG_IDENTIFIER;
|
||||||
/* If we are not in upgrade context, we use default timeout values */
|
/* If we are not in upgrade context, we use default timeout values */
|
||||||
if (pFwupgCtx != NULL) {
|
if (pFwupgCtx) {
|
||||||
/* Getting selftest timeout from new image */
|
/* Getting selftest timeout from new image */
|
||||||
struct HpmfwupgImageHeader *pImageHeader = (struct HpmfwupgImageHeader*)
|
struct HpmfwupgImageHeader *pImageHeader = (struct HpmfwupgImageHeader*)
|
||||||
pFwupgCtx->pImageData;
|
pFwupgCtx->pImageData;
|
||||||
selfTestTimeout = MAX(pImageHeader->selfTestTimeout,
|
selfTestTimeout = __max(pImageHeader->selfTestTimeout,
|
||||||
pFwupgCtx->targetCap.selftestTimeout) * 5;
|
pFwupgCtx->targetCap.selftestTimeout) * 5;
|
||||||
} else {
|
} else {
|
||||||
selfTestTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
selfTestTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
||||||
@ -2087,7 +2116,7 @@ HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelftest
|
|||||||
} while (rsp
|
} while (rsp
|
||||||
&& (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS)
|
&& (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS)
|
||||||
&& (timeoutSec2 - timeoutSec1 < selfTestTimeout));
|
&& (timeoutSec2 - timeoutSec1 < selfTestTimeout));
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_NOTICE, "Error getting upgrade status\n");
|
lprintf(LOG_NOTICE, "Error getting upgrade status\n");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
@ -2121,14 +2150,14 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
|||||||
unsigned int timeoutSec1, timeoutSec2;
|
unsigned int timeoutSec1, timeoutSec2;
|
||||||
unsigned char retry = 0;
|
unsigned char retry = 0;
|
||||||
/* If we are not in upgrade context, we use default timeout values */
|
/* If we are not in upgrade context, we use default timeout values */
|
||||||
if (pFwupgCtx != NULL) {
|
if (pFwupgCtx) {
|
||||||
inaccessTimeout = pFwupgCtx->targetCap.inaccessTimeout*5;
|
inaccessTimeout = pFwupgCtx->targetCap.inaccessTimeout*5;
|
||||||
upgradeTimeout = pFwupgCtx->targetCap.upgradeTimeout*5;
|
upgradeTimeout = pFwupgCtx->targetCap.upgradeTimeout*5;
|
||||||
} else {
|
} else {
|
||||||
/* keeping the inaccessTimeout to 60 seconds results in almost 2900 retries
|
/* keeping the inaccessTimeout to 60 seconds results in almost 2900 retries
|
||||||
* So if the target is not available it will be retrying the command for 2900
|
* So if the target is not available it will be retrying the command for 2900
|
||||||
* times which is not effecient -So reducing the Timout to 5 seconds which is
|
* times which is not efficient -So reducing the Timeout to 5 seconds which is
|
||||||
* almost 200 retries if it continuously recieves 0xC3 as completion code.
|
* almost 200 retries if it continuously receives 0xC3 as completion code.
|
||||||
*/
|
*/
|
||||||
inaccessTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
inaccessTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
||||||
upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
||||||
@ -2137,10 +2166,10 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
|||||||
do {
|
do {
|
||||||
static unsigned char isValidSize = FALSE;
|
static unsigned char isValidSize = FALSE;
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
#define HPM_LAN_PACKET_RESIZE_LIMIT 6
|
#define HPM_LAN_PACKET_RESIZE_LIMIT 6
|
||||||
/* also covers lanplus */
|
/* also covers lanplus */
|
||||||
if (strstr(intf->name, "lan") != NULL) {
|
if (strstr(intf->name, "lan")) {
|
||||||
static int errorCount=0;
|
static int errorCount=0;
|
||||||
static struct ipmi_rs fakeRsp;
|
static struct ipmi_rs fakeRsp;
|
||||||
lprintf(LOG_DEBUG,
|
lprintf(LOG_DEBUG,
|
||||||
@ -2188,18 +2217,15 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
|||||||
lprintf(LOG_DEBUG, "HPM: try to re-open IOL session");
|
lprintf(LOG_DEBUG, "HPM: try to re-open IOL session");
|
||||||
{
|
{
|
||||||
/* force session re-open */
|
/* force session re-open */
|
||||||
intf->opened = 0;
|
intf->abort = 1;
|
||||||
intf->session->authtype = IPMI_SESSION_AUTHTYPE_NONE;
|
intf->close(intf);
|
||||||
intf->session->session_id = 0;
|
|
||||||
intf->session->in_seq = 0;
|
|
||||||
intf->session->out_seq = 0;
|
|
||||||
intf->session->active = 0;
|
|
||||||
intf->session->retry = 10;
|
|
||||||
while (intf->open(intf) == HPMFWUPG_ERROR
|
while (intf->open(intf) == HPMFWUPG_ERROR
|
||||||
&& inaccessTimeoutCounter < inaccessTimeout) {
|
&& inaccessTimeoutCounter < inaccessTimeout) {
|
||||||
inaccessTimeoutCounter += (time(NULL) - timeoutSec1);
|
inaccessTimeoutCounter += (time(NULL) - timeoutSec1);
|
||||||
timeoutSec1 = time(NULL);
|
timeoutSec1 = time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fake timeout to retry command */
|
/* Fake timeout to retry command */
|
||||||
fakeRsp.ccode = 0xc3;
|
fakeRsp.ccode = 0xc3;
|
||||||
rsp = &fakeRsp;
|
rsp = &fakeRsp;
|
||||||
@ -2208,7 +2234,7 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Handle inaccessibility timeout (rsp = NULL if IOL) */
|
/* Handle inaccessibility timeout (rsp = NULL if IOL) */
|
||||||
if (rsp == NULL || rsp->ccode == 0xff || rsp->ccode == 0xc3 || rsp->ccode == 0xd3) {
|
if (!rsp || rsp->ccode == 0xff || rsp->ccode == 0xc3 || rsp->ccode == 0xd3) {
|
||||||
if (inaccessTimeoutCounter < inaccessTimeout) {
|
if (inaccessTimeoutCounter < inaccessTimeout) {
|
||||||
timeoutSec2 = time(NULL);
|
timeoutSec2 = time(NULL);
|
||||||
if (timeoutSec2 > timeoutSec1) {
|
if (timeoutSec2 > timeoutSec1) {
|
||||||
@ -2261,14 +2287,14 @@ HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf,
|
|||||||
unsigned int timeoutSec1, timeoutSec2;
|
unsigned int timeoutSec1, timeoutSec2;
|
||||||
struct HpmfwupgGetUpgradeStatusCtx upgStatusCmd;
|
struct HpmfwupgGetUpgradeStatusCtx upgStatusCmd;
|
||||||
/* If we are not in upgrade context, we use default timeout values */
|
/* If we are not in upgrade context, we use default timeout values */
|
||||||
if (pFwupgCtx != NULL) {
|
if (pFwupgCtx) {
|
||||||
upgradeTimeout = (unsigned int)(pFwupgCtx->targetCap.upgradeTimeout*5);
|
upgradeTimeout = (unsigned int)(pFwupgCtx->targetCap.upgradeTimeout*5);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf("Use File Upgrade Capabilities: %i seconds\n",
|
printf("Use File Upgrade Capabilities: %i seconds\n",
|
||||||
upgradeTimeout);
|
upgradeTimeout);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Try to retreive from Caps */
|
/* Try to retrieve from Caps */
|
||||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd;
|
||||||
if(HpmfwupgGetTargetUpgCapabilities(intf, &targetCapCmd) != HPMFWUPG_SUCCESS) {
|
if(HpmfwupgGetTargetUpgCapabilities(intf, &targetCapCmd) != HPMFWUPG_SUCCESS) {
|
||||||
upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT;
|
||||||
@ -2284,19 +2310,16 @@ HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rc == HPMFWUPG_SUCCESS) {
|
/* Poll upgrade status until completion or timeout*/
|
||||||
/* Poll upgrade status until completion or timeout*/
|
timeoutSec2 = timeoutSec1 = time(NULL);
|
||||||
timeoutSec1 = time(NULL);
|
rc = HpmfwupgGetUpgradeStatus(intf, &upgStatusCmd, pFwupgCtx, 1);
|
||||||
timeoutSec2 = time(NULL);
|
|
||||||
rc = HpmfwupgGetUpgradeStatus(intf, &upgStatusCmd,
|
|
||||||
pFwupgCtx, 1);
|
|
||||||
}
|
|
||||||
while (
|
while (
|
||||||
/* With KCS: Cover the case where we sometime
|
/* With KCS: Cover the case where we sometime
|
||||||
* receive d5 (on the first get status) from
|
* receive d5 (on the first get status) from
|
||||||
* the ipmi driver.
|
* the ipmi driver.
|
||||||
*/
|
*/
|
||||||
(upgStatusCmd.resp.lastCmdCompCode != 0x00 )
|
(upgStatusCmd.resp.lastCmdCompCode == 0x80 ||
|
||||||
|
upgStatusCmd.resp.lastCmdCompCode == 0xD5)
|
||||||
&& ((timeoutSec2 - timeoutSec1) < upgradeTimeout )
|
&& ((timeoutSec2 - timeoutSec1) < upgradeTimeout )
|
||||||
&& (rc == HPMFWUPG_SUCCESS)) {
|
&& (rc == HPMFWUPG_SUCCESS)) {
|
||||||
/* Must wait at least 1000 ms between status requests */
|
/* Must wait at least 1000 ms between status requests */
|
||||||
@ -2452,12 +2475,12 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
HpmfwupgPrintUsage();
|
HpmfwupgPrintUsage();
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
if (strcmp(argv[0], "help") == 0) {
|
if (!strcmp(argv[0], "help")) {
|
||||||
HpmfwupgPrintUsage();
|
HpmfwupgPrintUsage();
|
||||||
return HPMFWUPG_SUCCESS;
|
return HPMFWUPG_SUCCESS;
|
||||||
} else if ((strcmp(argv[0], "check") == 0)) {
|
} else if (!strcmp(argv[0], "check")) {
|
||||||
/* hpm check */
|
/* hpm check */
|
||||||
if (argv[1] == NULL) {
|
if (!argv[1]) {
|
||||||
rc = HpmfwupgTargetCheck(intf,VIEW_MODE);
|
rc = HpmfwupgTargetCheck(intf,VIEW_MODE);
|
||||||
} else {
|
} else {
|
||||||
/* hpm check <filename> */
|
/* hpm check <filename> */
|
||||||
@ -2467,18 +2490,18 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
0, VIEW_MODE);
|
0, VIEW_MODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[0], "upgrade") == 0) {
|
} else if (!strcmp(argv[0], "upgrade")) {
|
||||||
int i =0;
|
int i =0;
|
||||||
for (i=1; i< argc ; i++) {
|
for (i=1; i< argc ; i++) {
|
||||||
if (strcmp(argv[i],"activate") == 0) {
|
if (!strcmp(argv[i],"activate")) {
|
||||||
activateFlag = 1;
|
activateFlag = 1;
|
||||||
}
|
}
|
||||||
/* hpm upgrade <filename> force */
|
/* hpm upgrade <filename> force */
|
||||||
if (strcmp(argv[i],"force") == 0) {
|
if (!strcmp(argv[i],"force")) {
|
||||||
option |= FORCE_MODE;
|
option |= FORCE_MODE;
|
||||||
}
|
}
|
||||||
/* hpm upgrade <filename> component <comp Id> */
|
/* hpm upgrade <filename> component <comp Id> */
|
||||||
if (strcmp(argv[i],"component") == 0) {
|
if (!strcmp(argv[i],"component")) {
|
||||||
if (i+1 < argc) {
|
if (i+1 < argc) {
|
||||||
/* Error Checking */
|
/* Error Checking */
|
||||||
if (str2int(argv[i+1], &componentId) != 0
|
if (str2int(argv[i+1], &componentId) != 0
|
||||||
@ -2507,7 +2530,7 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strcmp(argv[i],"debug") == 0) {
|
if (!strcmp(argv[i],"debug")) {
|
||||||
option |= DEBUG_MODE;
|
option |= DEBUG_MODE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2517,11 +2540,11 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
rc = HpmfwupgUpgrade(intf, argv[1], activateFlag,
|
rc = HpmfwupgUpgrade(intf, argv[1], activateFlag,
|
||||||
componentMask, option);
|
componentMask, option);
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[0], "compare") == 0) {
|
} else if (!strcmp(argv[0], "compare")) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i=1; i< argc; i++) {
|
for (i=1; i< argc; i++) {
|
||||||
/* hpm compare <file> [component x...] */
|
/* hpm compare <file> [component x...] */
|
||||||
if (strcmp(argv[i],"component") == 0) {
|
if (!strcmp(argv[i],"component")) {
|
||||||
if (i+1 < argc) {
|
if (i+1 < argc) {
|
||||||
/* Error Checking */
|
/* Error Checking */
|
||||||
if (str2int(argv[i+1], &componentId) != 0
|
if (str2int(argv[i+1], &componentId) != 0
|
||||||
@ -2550,7 +2573,7 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
"No component Id provided\n");
|
"No component Id provided\n");
|
||||||
return HPMFWUPG_ERROR;
|
return HPMFWUPG_ERROR;
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i],"debug") == 0) {
|
} else if (!strcmp(argv[i],"debug")) {
|
||||||
option|= DEBUG_MODE;
|
option|= DEBUG_MODE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2560,19 +2583,19 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
rc = HpmfwupgUpgrade(intf, argv[1], 0,
|
rc = HpmfwupgUpgrade(intf, argv[1], 0,
|
||||||
componentMask, option);
|
componentMask, option);
|
||||||
}
|
}
|
||||||
} else if ((argc >= 1) && (strcmp(argv[0], "activate") == 0)) {
|
} else if (argc >= 1 && !strcmp(argv[0], "activate")) {
|
||||||
struct HpmfwupgActivateFirmwareCtx cmdCtx;
|
struct HpmfwupgActivateFirmwareCtx cmdCtx;
|
||||||
if ((argc == 2) && (strcmp(argv[1], "norollback") == 0)) {
|
if (argc == 2 && !strcmp(argv[1], "norollback")) {
|
||||||
cmdCtx.req.rollback_override = 1;
|
cmdCtx.req.rollback_override = 1;
|
||||||
} else {
|
} else {
|
||||||
cmdCtx.req.rollback_override = 0;
|
cmdCtx.req.rollback_override = 0;
|
||||||
}
|
}
|
||||||
rc = HpmfwupgActivateFirmware(intf, &cmdCtx, NULL);
|
rc = HpmfwupgActivateFirmware(intf, &cmdCtx, NULL);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "targetcap") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "targetcap")) {
|
||||||
struct HpmfwupgGetTargetUpgCapabilitiesCtx cmdCtx;
|
struct HpmfwupgGetTargetUpgCapabilitiesCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgGetTargetUpgCapabilities(intf, &cmdCtx);
|
rc = HpmfwupgGetTargetUpgCapabilities(intf, &cmdCtx);
|
||||||
} else if ((argc == 3) && (strcmp(argv[0], "compprop") == 0)) {
|
} else if (argc == 3 && !strcmp(argv[0], "compprop")) {
|
||||||
struct HpmfwupgGetComponentPropertiesCtx cmdCtx;
|
struct HpmfwupgGetComponentPropertiesCtx cmdCtx;
|
||||||
if (str2uchar(argv[1], &(cmdCtx.req.componentId)) != 0
|
if (str2uchar(argv[1], &(cmdCtx.req.componentId)) != 0
|
||||||
|| cmdCtx.req.componentId > 7) {
|
|| cmdCtx.req.componentId > 7) {
|
||||||
@ -2594,23 +2617,23 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv)
|
|||||||
}
|
}
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgGetComponentProperties(intf, &cmdCtx);
|
rc = HpmfwupgGetComponentProperties(intf, &cmdCtx);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "abort") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "abort")) {
|
||||||
struct HpmfwupgAbortUpgradeCtx cmdCtx;
|
struct HpmfwupgAbortUpgradeCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgAbortUpgrade(intf, &cmdCtx);
|
rc = HpmfwupgAbortUpgrade(intf, &cmdCtx);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "upgstatus") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "upgstatus")) {
|
||||||
struct HpmfwupgGetUpgradeStatusCtx cmdCtx;
|
struct HpmfwupgGetUpgradeStatusCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgGetUpgradeStatus(intf, &cmdCtx, NULL, 0);
|
rc = HpmfwupgGetUpgradeStatus(intf, &cmdCtx, NULL, 0);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "rollback") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "rollback")) {
|
||||||
struct HpmfwupgManualFirmwareRollbackCtx cmdCtx;
|
struct HpmfwupgManualFirmwareRollbackCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgManualFirmwareRollback(intf, &cmdCtx);
|
rc = HpmfwupgManualFirmwareRollback(intf, &cmdCtx);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "rollbackstatus") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "rollbackstatus")) {
|
||||||
struct HpmfwupgQueryRollbackStatusCtx cmdCtx;
|
struct HpmfwupgQueryRollbackStatusCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgQueryRollbackStatus(intf, &cmdCtx, NULL);
|
rc = HpmfwupgQueryRollbackStatus(intf, &cmdCtx, NULL);
|
||||||
} else if ((argc == 1) && (strcmp(argv[0], "selftestresult") == 0)) {
|
} else if (argc == 1 && !strcmp(argv[0], "selftestresult")) {
|
||||||
struct HpmfwupgQuerySelftestResultCtx cmdCtx;
|
struct HpmfwupgQuerySelftestResultCtx cmdCtx;
|
||||||
verbose++;
|
verbose++;
|
||||||
rc = HpmfwupgQuerySelftestResult(intf, &cmdCtx, NULL);
|
rc = HpmfwupgQuerySelftestResult(intf, &cmdCtx, NULL);
|
||||||
|
85
lib/ipmi_ime.c
Executable file → Normal file
85
lib/ipmi_ime.c
Executable file → Normal file
@ -202,11 +202,11 @@ static int ImeGetInfo(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Get Device ID command failed");
|
lprintf(LOG_ERR, "Get Device ID command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Get Device ID command failed: %s",
|
lprintf(LOG_ERR, "Get Device ID command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -240,8 +240,7 @@ static int ImeGetInfo(struct ipmi_intf *intf)
|
|||||||
{
|
{
|
||||||
rc = IME_SUCCESS;
|
rc = IME_SUCCESS;
|
||||||
printf("Manufacturer Name : %s\n",
|
printf("Manufacturer Name : %s\n",
|
||||||
val2str( (long)IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id),
|
OEM_MFG_STRING(devid->manufacturer_id));
|
||||||
ipmi_oem_info) );
|
|
||||||
|
|
||||||
printf("Product ID : %u (0x%02x%02x)\n",
|
printf("Product ID : %u (0x%02x%02x)\n",
|
||||||
buf2short((uint8_t *)(devid->product_id)),
|
buf2short((uint8_t *)(devid->product_id)),
|
||||||
@ -251,7 +250,7 @@ static int ImeGetInfo(struct ipmi_intf *intf)
|
|||||||
(devid->product_id[1]<<8)+devid->product_id[0],
|
(devid->product_id[1]<<8)+devid->product_id[0],
|
||||||
ipmi_oem_product_info);
|
ipmi_oem_product_info);
|
||||||
|
|
||||||
if (product!=NULL)
|
if (product)
|
||||||
{
|
{
|
||||||
printf("Product Name : %s\n", product);
|
printf("Product Name : %s\n", product);
|
||||||
}
|
}
|
||||||
@ -357,12 +356,7 @@ static int ImeUpgrade(struct ipmi_intf *intf, char* imageFilename)
|
|||||||
|
|
||||||
rc = ImeImageCtxFromFile(imageFilename, &imgCtx);
|
rc = ImeImageCtxFromFile(imageFilename, &imgCtx);
|
||||||
|
|
||||||
if(
|
if (rc == IME_ERROR || !imgCtx.pData || !imgCtx.size) {
|
||||||
(rc == IME_ERROR) ||
|
|
||||||
(imgCtx.pData == NULL) ||
|
|
||||||
(imgCtx.size == 0)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -430,12 +424,9 @@ static int ImeUpgrade(struct ipmi_intf *intf, char* imageFilename)
|
|||||||
|
|
||||||
if(currentPercent != shownPercent)
|
if(currentPercent != shownPercent)
|
||||||
{
|
{
|
||||||
uint16_t timeElapsedSecond;
|
|
||||||
uint16_t timeRemainingSecond;
|
|
||||||
shownPercent = currentPercent;
|
shownPercent = currentPercent;
|
||||||
printf("Percent: %02i, ", shownPercent);
|
printf("Percent: %02i, ", shownPercent);
|
||||||
time(¤t);
|
time(¤t);
|
||||||
timeElapsedSecond = (current-start) + ((current-start)%60);
|
|
||||||
printf("Elapsed time %02ld:%02ld\r",((current-start)/60), ((current-start)%60));
|
printf("Elapsed time %02ld:%02ld\r",((current-start)/60), ((current-start)%60));
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
@ -513,11 +504,11 @@ static int ImeUpdatePrepare(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -548,11 +539,11 @@ static int ImeUpdateOpenArea(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 2;
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdateOpenArea command failed");
|
lprintf(LOG_ERR, "UpdateOpenArea command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdateOpenArea command failed: %s",
|
lprintf(LOG_ERR, "UpdateOpenArea command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -588,11 +579,11 @@ static int ImeUpdateWriteArea(
|
|||||||
req.msg.data_len = length + 1;
|
req.msg.data_len = length + 1;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdateWriteArea command failed");
|
lprintf(LOG_ERR, "UpdateWriteArea command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdateWriteArea command failed: %s",
|
lprintf(LOG_ERR, "UpdateWriteArea command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
if( rsp->ccode == 0x80) // restart operation
|
if( rsp->ccode == 0x80) // restart operation
|
||||||
@ -635,11 +626,11 @@ static int ImeUpdateCloseArea(
|
|||||||
req.msg.data_len = length;
|
req.msg.data_len = length;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdateCloseArea command failed");
|
lprintf(LOG_ERR, "UpdateCloseArea command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdateCloseArea command failed: %s",
|
lprintf(LOG_ERR, "UpdateCloseArea command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -669,11 +660,11 @@ static int ImeUpdateGetStatus(struct ipmi_intf *intf, tImeStatus *pStatus )
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -742,11 +733,11 @@ static int ImeUpdateGetCapabilities(struct ipmi_intf *intf, tImeCaps *pCaps )
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -782,11 +773,11 @@ static int ImeUpdateRegisterUpdate(struct ipmi_intf *intf, tImeUpdateType type)
|
|||||||
req.msg.data_len = 2;
|
req.msg.data_len = 2;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed");
|
lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed: %s",
|
lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -813,11 +804,11 @@ static int ImeUpdateShowStatus(struct ipmi_intf *intf)
|
|||||||
req.msg.data_len = 0;
|
req.msg.data_len = 0;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
lprintf(LOG_ERR, "UpdatePrepare command failed");
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
lprintf(LOG_ERR, "UpdatePrepare command failed: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return IME_ERROR;
|
return IME_ERROR;
|
||||||
@ -883,14 +874,12 @@ static int ImeImageCtxFromFile(
|
|||||||
int rc = IME_SUCCESS;
|
int rc = IME_SUCCESS;
|
||||||
FILE* pImageFile = fopen(imageFilename, "rb");
|
FILE* pImageFile = fopen(imageFilename, "rb");
|
||||||
|
|
||||||
if ( pImageFile == NULL )
|
if (!pImageFile) {
|
||||||
{
|
|
||||||
lprintf(LOG_NOTICE,"Cannot open image file %s", imageFilename);
|
lprintf(LOG_NOTICE,"Cannot open image file %s", imageFilename);
|
||||||
rc = IME_ERROR;
|
rc = IME_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rc == IME_SUCCESS )
|
if (rc == IME_SUCCESS) {
|
||||||
{
|
|
||||||
/* Get the raw data in file */
|
/* Get the raw data in file */
|
||||||
fseek(pImageFile, 0, SEEK_END);
|
fseek(pImageFile, 0, SEEK_END);
|
||||||
pImageCtx->size = ftell(pImageFile);
|
pImageCtx->size = ftell(pImageFile);
|
||||||
@ -904,13 +893,9 @@ static int ImeImageCtxFromFile(
|
|||||||
pImageCtx->pData = malloc(sizeof(unsigned char)*pImageCtx->size);
|
pImageCtx->pData = malloc(sizeof(unsigned char)*pImageCtx->size);
|
||||||
rewind(pImageFile);
|
rewind(pImageFile);
|
||||||
|
|
||||||
if ( pImageCtx->pData != NULL )
|
if (!pImageCtx->pData
|
||||||
{
|
|| pImageCtx->size < fread(pImageCtx->pData, sizeof(unsigned char),
|
||||||
if (pImageCtx->size < fread(pImageCtx->pData, sizeof(unsigned char),
|
pImageCtx->size, pImageFile))
|
||||||
pImageCtx->size, pImageFile))
|
|
||||||
rc = IME_ERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
rc = IME_ERROR;
|
rc = IME_ERROR;
|
||||||
}
|
}
|
||||||
@ -922,9 +907,7 @@ static int ImeImageCtxFromFile(
|
|||||||
pImageCtx->crc8 = ImeCrc8(pImageCtx->size, pImageCtx->pData);
|
pImageCtx->crc8 = ImeCrc8(pImageCtx->size, pImageCtx->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pImageFile) {
|
||||||
if( pImageFile != NULL)
|
|
||||||
{
|
|
||||||
fclose(pImageFile);
|
fclose(pImageFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -965,8 +948,6 @@ static int ImeManualRollback(struct ipmi_intf *intf)
|
|||||||
{
|
{
|
||||||
int rc = IME_SUCCESS;
|
int rc = IME_SUCCESS;
|
||||||
tImeStatus imeStatus;
|
tImeStatus imeStatus;
|
||||||
time_t start,end,current;
|
|
||||||
|
|
||||||
|
|
||||||
rc = ImeUpdateRegisterUpdate(intf, IME_UPDTYPE_MANUAL_ROLLBACK);
|
rc = ImeUpdateRegisterUpdate(intf, IME_UPDTYPE_MANUAL_ROLLBACK);
|
||||||
ImeUpdateGetStatus(intf,&imeStatus);
|
ImeUpdateGetStatus(intf,&imeStatus);
|
||||||
@ -1007,16 +988,13 @@ int ipmi_ime_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
lprintf(LOG_DEBUG,"ipmi_ime_main()");
|
lprintf(LOG_DEBUG,"ipmi_ime_main()");
|
||||||
|
|
||||||
|
|
||||||
if ( (argc == 0) || (strcmp(argv[0], "help") == 0) )
|
if (!argc || !strcmp(argv[0], "help")) {
|
||||||
{
|
|
||||||
ImePrintUsage();
|
ImePrintUsage();
|
||||||
}
|
}
|
||||||
else if ( (argc == 0) || (strcmp(argv[0], "info") == 0) )
|
else if (!strcmp(argv[0], "info")) {
|
||||||
{
|
|
||||||
rc = ImeGetInfo(intf);
|
rc = ImeGetInfo(intf);
|
||||||
}
|
}
|
||||||
else if ( strcmp(argv[0], "update") == 0)
|
else if (!strcmp(argv[0], "update")) {
|
||||||
{
|
|
||||||
if(argc == 2)
|
if(argc == 2)
|
||||||
{
|
{
|
||||||
lprintf(LOG_NOTICE,"Update using file: %s", argv[1]);
|
lprintf(LOG_NOTICE,"Update using file: %s", argv[1]);
|
||||||
@ -1028,8 +1006,7 @@ int ipmi_ime_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
rc = IME_ERROR;
|
rc = IME_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( (argc == 0) || (strcmp(argv[0], "rollback") == 0) )
|
else if (!strcmp(argv[0], "rollback")) {
|
||||||
{
|
|
||||||
rc = ImeManualRollback(intf);
|
rc = ImeManualRollback(intf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -83,7 +83,7 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf,
|
|||||||
data[3] = 0x00; /* selector */
|
data[3] = 0x00; /* selector */
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -91,7 +91,7 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf,
|
|||||||
lprintf(LOG_ERR, "IPMI v1.5 Serial Over Lan (ISOL) not supported!");
|
lprintf(LOG_ERR, "IPMI v1.5 Serial Over Lan (ISOL) not supported!");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -107,11 +107,11 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf,
|
|||||||
data[3] = 0x00; /* selector */
|
data[3] = 0x00; /* selector */
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -127,11 +127,11 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf,
|
|||||||
data[3] = 0x00; /* selector */
|
data[3] = 0x00; /* selector */
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -192,12 +192,12 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf,
|
|||||||
/*
|
/*
|
||||||
* enabled
|
* enabled
|
||||||
*/
|
*/
|
||||||
if (strcmp(param, "enabled") == 0)
|
if (!strcmp(param, "enabled"))
|
||||||
{
|
{
|
||||||
data[1] = ISOL_ENABLE_PARAM;
|
data[1] = ISOL_ENABLE_PARAM;
|
||||||
if (strcmp(value, "true") == 0)
|
if (!strcmp(value, "true"))
|
||||||
data[2] = 0x01;
|
data[2] = 0x01;
|
||||||
else if (strcmp(value, "false") == 0)
|
else if (!strcmp(value, "false"))
|
||||||
data[2] = 0x00;
|
data[2] = 0x00;
|
||||||
else {
|
else {
|
||||||
lprintf(LOG_ERR, "Invalid value %s for parameter %s",
|
lprintf(LOG_ERR, "Invalid value %s for parameter %s",
|
||||||
@ -210,7 +210,7 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf,
|
|||||||
/*
|
/*
|
||||||
* privilege-level
|
* privilege-level
|
||||||
*/
|
*/
|
||||||
else if (strcmp(param, "privilege-level") == 0)
|
else if (!strcmp(param, "privilege-level"))
|
||||||
{
|
{
|
||||||
data[1] = ISOL_AUTHENTICATION_PARAM;
|
data[1] = ISOL_AUTHENTICATION_PARAM;
|
||||||
if (! strcmp(value, "user"))
|
if (! strcmp(value, "user"))
|
||||||
@ -235,22 +235,22 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf,
|
|||||||
/*
|
/*
|
||||||
* bit-rate
|
* bit-rate
|
||||||
*/
|
*/
|
||||||
else if (strcmp(param, "bit-rate") == 0)
|
else if (!strcmp(param, "bit-rate"))
|
||||||
{
|
{
|
||||||
data[1] = ISOL_BAUD_RATE_PARAM;
|
data[1] = ISOL_BAUD_RATE_PARAM;
|
||||||
if (strncmp(value, "9.6", 3) == 0) {
|
if (!strcmp(value, "9.6")) {
|
||||||
data[2] = 0x06;
|
data[2] = 0x06;
|
||||||
}
|
}
|
||||||
else if (strncmp(value, "19.2", 4) == 0) {
|
else if (!strcmp(value, "19.2")) {
|
||||||
data[2] = 0x07;
|
data[2] = 0x07;
|
||||||
}
|
}
|
||||||
else if (strncmp(value, "38.4", 4) == 0) {
|
else if (!strcmp(value, "38.4")) {
|
||||||
data[2] = 0x08;
|
data[2] = 0x08;
|
||||||
}
|
}
|
||||||
else if (strncmp(value, "57.6", 4) == 0) {
|
else if (!strcmp(value, "57.6")) {
|
||||||
data[2] = 0x09;
|
data[2] = 0x09;
|
||||||
}
|
}
|
||||||
else if (strncmp(value, "115.2", 5) == 0) {
|
else if (!strcmp(value, "115.2")) {
|
||||||
data[2] = 0x0A;
|
data[2] = 0x0A;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -271,11 +271,11 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error setting ISOL parameter '%s'", param);
|
lprintf(LOG_ERR, "Error setting ISOL parameter '%s'", param);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error setting ISOL parameter '%s': %s",
|
lprintf(LOG_ERR, "Error setting ISOL parameter '%s': %s",
|
||||||
param, val2str(rsp->ccode, completion_code_vals));
|
param, val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -413,7 +413,6 @@ ipmi_isol_deactivate(struct ipmi_intf * intf)
|
|||||||
struct ipmi_rs * rsp;
|
struct ipmi_rs * rsp;
|
||||||
struct ipmi_rq req;
|
struct ipmi_rq req;
|
||||||
uint8_t data[6];
|
uint8_t data[6];
|
||||||
struct isol_config_parameters params;
|
|
||||||
|
|
||||||
memset(&req, 0, sizeof(req));
|
memset(&req, 0, sizeof(req));
|
||||||
req.msg.netfn = IPMI_NETFN_ISOL;
|
req.msg.netfn = IPMI_NETFN_ISOL;
|
||||||
@ -429,11 +428,11 @@ ipmi_isol_deactivate(struct ipmi_intf * intf)
|
|||||||
data[5] = 0x00;
|
data[5] = 0x00;
|
||||||
|
|
||||||
rsp = intf->sendrecv(intf, &req);
|
rsp = intf->sendrecv(intf, &req);
|
||||||
if (rsp == NULL) {
|
if (!rsp) {
|
||||||
lprintf(LOG_ERR, "Error deactivating ISOL");
|
lprintf(LOG_ERR, "Error deactivating ISOL");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (rsp->ccode > 0) {
|
if (rsp->ccode) {
|
||||||
lprintf(LOG_ERR, "Error deactivating ISOL: %s",
|
lprintf(LOG_ERR, "Error deactivating ISOL: %s",
|
||||||
val2str(rsp->ccode, completion_code_vals));
|
val2str(rsp->ccode, completion_code_vals));
|
||||||
return -1;
|
return -1;
|
||||||
@ -573,7 +572,7 @@ ipmi_isol_red_pill(struct ipmi_intf * intf)
|
|||||||
int timedout = 0;
|
int timedout = 0;
|
||||||
|
|
||||||
buffer = (char*)malloc(buffer_size);
|
buffer = (char*)malloc(buffer_size);
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -791,20 +790,20 @@ int ipmi_isol_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
/*
|
/*
|
||||||
* Help
|
* Help
|
||||||
*/
|
*/
|
||||||
if (!argc || !strncmp(argv[0], "help", 4))
|
if (!argc || !strcmp(argv[0], "help"))
|
||||||
print_isol_usage();
|
print_isol_usage();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Info
|
* Info
|
||||||
*/
|
*/
|
||||||
else if (!strncmp(argv[0], "info", 4)) {
|
else if (!strcmp(argv[0], "info")) {
|
||||||
ret = ipmi_print_isol_info(intf);
|
ret = ipmi_print_isol_info(intf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set a parameter value
|
* Set a parameter value
|
||||||
*/
|
*/
|
||||||
else if (!strncmp(argv[0], "set", 3)) {
|
else if (!strcmp(argv[0], "set")) {
|
||||||
if (argc < 3) {
|
if (argc < 3) {
|
||||||
print_isol_set_usage();
|
print_isol_set_usage();
|
||||||
return -1;
|
return -1;
|
||||||
@ -815,7 +814,7 @@ int ipmi_isol_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|||||||
/*
|
/*
|
||||||
* Activate
|
* Activate
|
||||||
*/
|
*/
|
||||||
else if (!strncmp(argv[0], "activate", 8)) {
|
else if (!strcmp(argv[0], "activate")) {
|
||||||
ret = ipmi_isol_activate(intf);
|
ret = ipmi_isol_activate(intf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user