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.AuthenticationCapabilitiesReceived;
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
46 public class AuthcapWaiting extends State {
47
48 private int tag;
49
50
51
52
53
54 public AuthcapWaiting(int tag) {
55 this.tag = tag;
56 }
57
58 @Override
59 public void doTransition(StateMachine stateMachine,
60 StateMachineEvent machineEvent) {
61 if (machineEvent instanceof Timeout) {
62 stateMachine.setCurrent(new Ciphers());
63 } else if (machineEvent instanceof AuthenticationCapabilitiesReceived) {
64 stateMachine.setCurrent(new Authcap());
65 } else {
66 stateMachine.doExternalAction(new ErrorAction(
67 new IllegalArgumentException("Invalid transition")));
68 }
69 }
70
71 @Override
72 public void doAction(StateMachine stateMachine, RmcpMessage message) {
73 if (ProtocolDecoder.decodeAuthenticationType(message) == AuthenticationType.RMCPPlus) {
74 return;
75 }
76 Protocolv15Decoder decoder = new Protocolv15Decoder();
77 IpmiMessage ipmiMessage = null;
78 try {
79 ipmiMessage = decoder.decode(message);
80 GetChannelAuthenticationCapabilities capabilities = new GetChannelAuthenticationCapabilities();
81 if (capabilities.isCommandResponse(ipmiMessage)
82 && TypeConverter.byteToInt(((IpmiLanResponse) ipmiMessage
83 .getPayload()).getSequenceNumber()) == tag) {
84 stateMachine.doExternalAction(new ResponseAction(capabilities
85 .getResponseData(ipmiMessage)));
86 }
87 } catch (Exception e) {
88 stateMachine.doExternalAction(new ErrorAction(e));
89 }
90 }
91
92 }