View Javadoc
1   package org.metricshub.ipmi.core.sm.states;
2   
3   /*-
4    * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
5    * IPMI Java Client
6    * ჻჻჻჻჻჻
7    * Copyright 2023 Verax Systems, MetricsHub
8    * ჻჻჻჻჻჻
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU Lesser General Public License as
11   * published by the Free Software Foundation, either version 3 of the
12   * License, or (at your option) any later version.
13   *
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Lesser Public License for more details.
18   *
19   * You should have received a copy of the GNU General Lesser Public
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
22   * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
23   */
24  
25  import org.metricshub.ipmi.core.coding.Encoder;
26  import org.metricshub.ipmi.core.coding.commands.IpmiVersion;
27  import org.metricshub.ipmi.core.coding.commands.session.GetChannelAuthenticationCapabilities;
28  import org.metricshub.ipmi.core.coding.commands.session.GetChannelCipherSuites;
29  import org.metricshub.ipmi.core.coding.protocol.encoder.Protocolv15Encoder;
30  import org.metricshub.ipmi.core.coding.protocol.encoder.Protocolv20Encoder;
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.events.Default;
36  import org.metricshub.ipmi.core.sm.events.GetChannelCipherSuitesPending;
37  import org.metricshub.ipmi.core.sm.events.StateMachineEvent;
38  
39  /**
40   * The initial state. Transits to {@link AuthcapWaiting} on {@link Default}, sending Get Channel Authentication
41   * Capabilities in the IPMI v1.5 format, and to {@link CiphersWaiting} on {@link GetChannelCipherSuitesPending}.
42   */
43  public class Uninitialized extends State {
44  
45  	@Override
46  	public void doTransition(StateMachine stateMachine, StateMachineEvent machineEvent) {
47  		if (machineEvent instanceof GetChannelCipherSuitesPending) {
48  			Default event = (GetChannelCipherSuitesPending) machineEvent;
49  			GetChannelCipherSuites cipherSuites = new GetChannelCipherSuites(TypeConverter.intToByte(0xE), (byte) 0);
50  			try {
51  				stateMachine.setCurrent(new CiphersWaiting(0, event.getSequenceNumber()));
52  
53  				stateMachine
54  						.sendMessage(Encoder.encode(new Protocolv20Encoder(), cipherSuites, event.getSequenceNumber(), 0, 0));
55  			} catch (Exception e) {
56  				stateMachine.setCurrent(this);
57  				stateMachine.doExternalAction(new ErrorAction(e));
58  			}
59  		} else if (machineEvent instanceof Default) {
60  			// IPMI 2.0 section 13.13: Get Channel Authentication Capabilities in the IPMI v1.5 format, which every BMC
61  			// answers, with the IPMI v2.0+ extended data (table 22-15), before any RMCP+ packet
62  			Default event = (Default) machineEvent;
63  			GetChannelAuthenticationCapabilities authCap = new GetChannelAuthenticationCapabilities(
64  					IpmiVersion.V15,
65  					IpmiVersion.V20,
66  					event.getCipherSuite(),
67  					event.getPrivilegeLevel(),
68  					TypeConverter.intToByte(0xe));
69  			try {
70  				stateMachine.setCurrent(new AuthcapWaiting(event.getSequenceNumber()));
71  				stateMachine.sendMessage(Encoder.encode(new Protocolv15Encoder(), authCap, event.getSequenceNumber(), 0, 0));
72  			} catch (Exception e) {
73  				stateMachine.setCurrent(this);
74  				stateMachine.doExternalAction(new ErrorAction(e));
75  			}
76  		} else {
77  			stateMachine.doExternalAction(new ErrorAction(new IllegalArgumentException("Invalid transition")));
78  		}
79  	}
80  
81  	@Override
82  	public void doAction(StateMachine stateMachine, RmcpMessage message) {
83  		// No action is needed
84  	}
85  
86  }