1 package org.metricshub.ipmi.core.sm.states;
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.session.GetChannelAuthenticationCapabilities;
26 import org.metricshub.ipmi.core.coding.payload.lan.IpmiLanResponse;
27 import org.metricshub.ipmi.core.coding.protocol.AuthenticationType;
28 import org.metricshub.ipmi.core.coding.protocol.IpmiMessage;
29 import org.metricshub.ipmi.core.coding.protocol.decoder.ProtocolDecoder;
30 import org.metricshub.ipmi.core.coding.protocol.decoder.Protocolv15Decoder;
31 import org.metricshub.ipmi.core.coding.rmcp.RmcpMessage;
32 import org.metricshub.ipmi.core.common.TypeConverter;
33 import org.metricshub.ipmi.core.sm.StateMachine;
34 import org.metricshub.ipmi.core.sm.actions.ErrorAction;
35 import org.metricshub.ipmi.core.sm.actions.ResponseAction;
36 import org.metricshub.ipmi.core.sm.events.DefaultAck;
37 import org.metricshub.ipmi.core.sm.events.StateMachineEvent;
38 import org.metricshub.ipmi.core.sm.events.Timeout;
39
40
41
42
43
44
45 public class AuthcapWaiting extends State {
46
47 private int tag;
48
49
50
51
52
53
54 public AuthcapWaiting(int tag) {
55 this.tag = tag;
56 }
57
58 @Override
59 public void doTransition(StateMachine stateMachine, StateMachineEvent machineEvent) {
60 if (machineEvent instanceof Timeout || machineEvent instanceof DefaultAck) {
61 stateMachine.setCurrent(new Uninitialized());
62 } else {
63 stateMachine.doExternalAction(new ErrorAction(new IllegalArgumentException("Invalid transition")));
64 }
65 }
66
67 @Override
68 public void doAction(StateMachine stateMachine, RmcpMessage message) {
69 if (ProtocolDecoder.decodeAuthenticationType(message) == AuthenticationType.RMCPPlus) {
70 return;
71 }
72 Protocolv15Decoder decoder = new Protocolv15Decoder();
73 IpmiMessage ipmiMessage = null;
74 try {
75 ipmiMessage = decoder.decode(message);
76 GetChannelAuthenticationCapabilities capabilities = new GetChannelAuthenticationCapabilities();
77 if (capabilities.isCommandResponse(ipmiMessage)
78 && TypeConverter.byteToInt(((IpmiLanResponse) ipmiMessage.getPayload()).getSequenceNumber()) == tag) {
79 stateMachine.doExternalAction(new ResponseAction(capabilities.getResponseData(ipmiMessage)));
80 }
81 } catch (Exception e) {
82 stateMachine.setCurrent(new Uninitialized());
83 stateMachine.doExternalAction(new ErrorAction(e));
84 }
85 }
86
87 }