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.Rakp1;
26 import org.metricshub.ipmi.core.coding.payload.PlainMessage;
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.PayloadType;
30 import org.metricshub.ipmi.core.coding.protocol.decoder.PlainCommandv20Decoder;
31 import org.metricshub.ipmi.core.coding.protocol.decoder.ProtocolDecoder;
32 import org.metricshub.ipmi.core.coding.protocol.decoder.Protocolv20Decoder;
33 import org.metricshub.ipmi.core.coding.rmcp.RmcpMessage;
34 import org.metricshub.ipmi.core.coding.security.CipherSuite;
35 import org.metricshub.ipmi.core.common.TypeConverter;
36 import org.metricshub.ipmi.core.sm.StateMachine;
37 import org.metricshub.ipmi.core.sm.actions.ErrorAction;
38 import org.metricshub.ipmi.core.sm.actions.ResponseAction;
39 import org.metricshub.ipmi.core.sm.events.DefaultAck;
40 import org.metricshub.ipmi.core.sm.events.StateMachineEvent;
41 import org.metricshub.ipmi.core.sm.events.Timeout;
42
43
44
45
46
47
48
49
50 public class Rakp1Waiting extends State {
51
52 private Rakp1 rakp1;
53
54 private int tag;
55
56
57
58
59
60
61
62
63 public Rakp1Waiting(int tag, Rakp1 rakp1) {
64 this.tag = tag;
65 this.rakp1 = rakp1;
66 }
67
68 @Override
69 public void doTransition(StateMachine stateMachine, StateMachineEvent machineEvent) {
70 if (machineEvent instanceof DefaultAck) {
71 stateMachine.setCurrent(new Rakp1Complete(rakp1));
72 } else if (machineEvent instanceof Timeout) {
73 stateMachine.setCurrent(new Authcap());
74 } else {
75 stateMachine.doExternalAction(new ErrorAction(new IllegalArgumentException("Invalid transition")));
76 }
77
78 }
79
80 @Override
81 public void doAction(StateMachine stateMachine, RmcpMessage message) {
82 if (ProtocolDecoder.decodeAuthenticationType(message) != AuthenticationType.RMCPPlus) {
83 return;
84 }
85 PlainCommandv20Decoder decoder = new PlainCommandv20Decoder(CipherSuite.getEmpty());
86 if (Protocolv20Decoder.decodePayloadType(message.getData()[1]) != PayloadType.Rakp2) {
87 return;
88 }
89 IpmiMessage ipmiMessage = null;
90 try {
91 ipmiMessage = decoder.decode(message);
92 if (rakp1.isCommandResponse(ipmiMessage)
93 && TypeConverter.byteToInt(((PlainMessage) ipmiMessage.getPayload()).getPayloadData()[0]) == tag) {
94 stateMachine.doExternalAction(new ResponseAction(rakp1.getResponseData(ipmiMessage)));
95 }
96 } catch (Exception e) {
97 stateMachine.setCurrent(new Authcap());
98 stateMachine.doExternalAction(new ErrorAction(e));
99 }
100 }
101 }