1 package org.metricshub.ipmi.core.coding.commands.sel;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import org.metricshub.ipmi.core.coding.commands.CommandCodes;
26 import org.metricshub.ipmi.core.coding.commands.IpmiCommandCoder;
27 import org.metricshub.ipmi.core.coding.commands.IpmiVersion;
28 import org.metricshub.ipmi.core.coding.commands.ResponseData;
29 import org.metricshub.ipmi.core.coding.payload.CompletionCode;
30 import org.metricshub.ipmi.core.coding.payload.IpmiPayload;
31 import org.metricshub.ipmi.core.coding.payload.lan.IPMIException;
32 import org.metricshub.ipmi.core.coding.payload.lan.IpmiLanRequest;
33 import org.metricshub.ipmi.core.coding.payload.lan.IpmiLanResponse;
34 import org.metricshub.ipmi.core.coding.payload.lan.NetworkFunction;
35 import org.metricshub.ipmi.core.coding.protocol.AuthenticationType;
36 import org.metricshub.ipmi.core.coding.protocol.IpmiMessage;
37 import org.metricshub.ipmi.core.coding.security.CipherSuite;
38 import org.metricshub.ipmi.core.common.TypeConverter;
39
40 import java.security.InvalidKeyException;
41 import java.security.NoSuchAlgorithmException;
42
43
44
45
46 public class GetSelInfo extends IpmiCommandCoder {
47
48
49
50
51
52
53
54
55
56
57
58
59 public GetSelInfo(IpmiVersion version, CipherSuite cipherSuite,
60 AuthenticationType authenticationType) {
61 super(version, cipherSuite, authenticationType);
62 }
63
64 @Override
65 public byte getCommandCode() {
66 return CommandCodes.GET_SEL_INFO;
67 }
68
69 @Override
70 public NetworkFunction getNetworkFunction() {
71 return NetworkFunction.StorageRequest;
72 }
73
74 @Override
75 protected IpmiPayload preparePayload(int sequenceNumber)
76 throws NoSuchAlgorithmException, InvalidKeyException {
77 return new IpmiLanRequest(getNetworkFunction(), getCommandCode(), null,
78 TypeConverter.intToByte(sequenceNumber));
79 }
80
81 @Override
82 public ResponseData getResponseData(IpmiMessage message) throws IPMIException, NoSuchAlgorithmException, InvalidKeyException {
83 if (!isCommandResponse(message)) {
84 throw new IllegalArgumentException(
85 "This is not a response for Get SEL Info command");
86 }
87 if (!(message.getPayload() instanceof IpmiLanResponse)) {
88 throw new IllegalArgumentException("Invalid response payload");
89 }
90 if (((IpmiLanResponse) message.getPayload()).getCompletionCode() != CompletionCode.Ok) {
91 throw new IPMIException(
92 ((IpmiLanResponse) message.getPayload())
93 .getCompletionCode());
94 }
95
96 byte[] raw = message.getPayload().getIpmiCommandData();
97
98 if (raw == null || raw.length != 14) {
99 throw new IllegalArgumentException("Invalid response payload length: " + (raw != null ? raw.length : "null"));
100 }
101
102 GetSelInfoResponseData responseData = new GetSelInfoResponseData();
103
104 responseData.setSelVersion(TypeConverter
105 .littleEndianBcdByteToInt(raw[0]));
106
107 byte[] buffer = new byte[4];
108
109 buffer[0] = raw[1];
110 buffer[1] = raw[2];
111 buffer[2] = 0;
112 buffer[3] = 0;
113
114 responseData.setEntriesCount(TypeConverter
115 .littleEndianByteArrayToInt(buffer));
116
117 System.arraycopy(raw, 5, buffer, 0, 4);
118
119 responseData.setAdditionTimestamp(TypeConverter
120 .decodeDate(TypeConverter.littleEndianByteArrayToInt(buffer)));
121
122 System.arraycopy(raw, 9, buffer, 0, 4);
123
124 responseData.setEraseTimestamp(TypeConverter.decodeDate(TypeConverter
125 .littleEndianByteArrayToInt(buffer)));
126
127 return responseData;
128 }
129
130 }