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