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, Rakp1ResponseData rakp1ResponseData, CipherSuite cipherSuite) {
74 this.rakp1 = rakp1;
75 this.rakp1ResponseData = rakp1ResponseData;
76 this.cipherSuite = cipherSuite;
77 this.tag = tag;
78 }
79
80 @Override
81 public void doTransition(StateMachine stateMachine, StateMachineEvent machineEvent) {
82 if (machineEvent instanceof DefaultAck) {
83 stateMachine.setCurrent(new Rakp3Complete());
84 } else if (machineEvent instanceof Timeout) {
85 stateMachine.setCurrent(new Authcap());
86 } else {
87 stateMachine.doExternalAction(new ErrorAction(new IllegalArgumentException("Invalid transition")));
88 }
89 }
90
91 @Override
92 public void doAction(StateMachine stateMachine, RmcpMessage message) {
93 if (ProtocolDecoder.decodeAuthenticationType(message) != AuthenticationType.RMCPPlus) {
94 return;
95 }
96 PlainCommandv20Decoder decoder = new PlainCommandv20Decoder(CipherSuite.getEmpty());
97 if (Protocolv20Decoder.decodePayloadType(message.getData()[1]) != PayloadType.Rakp4) {
98 return;
99 }
100
101 IpmiMessage ipmiMessage = null;
102 Rakp3 rakp3 = new Rakp3(cipherSuite, rakp1, rakp1ResponseData);
103 try {
104 ipmiMessage = decoder.decode(message);
105 if (rakp3.isCommandResponse(ipmiMessage)
106 && TypeConverter.byteToInt(((PlainMessage) ipmiMessage.getPayload()).getPayloadData()[0]) == tag) {
107 stateMachine.doExternalAction(new ResponseAction(rakp3.getResponseData(ipmiMessage)));
108 }
109 } catch (Exception e) {
110 stateMachine.setCurrent(new Authcap());
111 stateMachine.doExternalAction(new ErrorAction(e));
112 }
113 }
114
115 }