1 package org.metricshub.ipmi.core.connection;
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.PayloadCoder;
26 import org.metricshub.ipmi.core.coding.commands.ResponseData;
27 import org.metricshub.ipmi.core.coding.payload.sol.SolAckState;
28 import org.metricshub.ipmi.core.coding.payload.sol.SolInboundMessage;
29 import org.metricshub.ipmi.core.coding.payload.sol.SolMessage;
30 import org.metricshub.ipmi.core.coding.protocol.Ipmiv20Message;
31
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import java.io.IOException;
36
37
38
39
40 public class SolMessageHandler extends MessageHandler {
41
42 private static final Logger logger = LoggerFactory.getLogger(SolMessageHandler.class);
43
44 public SolMessageHandler(Connection connection, int timeout) throws IOException {
45 super(connection, timeout, SolMessage.MIN_SEQUENCE_NUMBER, SolMessage.MAX_SEQUENCE_NUMBER);
46 }
47
48
49
50
51
52
53
54
55 @Override
56 protected void handleIncomingMessageInternal(Ipmiv20Message message) {
57 SolInboundMessage payload = (SolInboundMessage) message.getPayload();
58
59 if (payload.isAcknowledgeMessage()) {
60 handleIncomingAcknowledgeMessage(message, payload);
61 }
62
63 if (payload.isDataCarrier()) {
64 handleIncomingDataMessage(payload);
65 }
66 }
67
68 private void handleIncomingAcknowledgeMessage(Ipmiv20Message message, SolInboundMessage payload) {
69 PayloadCoder coder = messageQueue.getMessageFromQueue(payload.getAckNackSequenceNumber());
70 int tag = payload.getAckNackSequenceNumber();
71
72 logger.debug("Received message with tag " + tag);
73
74 if (coder == null) {
75 logger.debug("No message tagged with " + tag + " in queue. Dropping orphan message.");
76 return;
77 }
78
79 try {
80 ResponseData responseData = coder.getResponseData(message);
81 connection.notifyResponseListeners(connection.getHandle(), tag, responseData, null);
82 } catch (Exception e) {
83 connection.notifyResponseListeners(connection.getHandle(), tag, null, e);
84 }
85
86
87 if (payload.getStatusField().getAckState() == SolAckState.ACK || payload.getAcceptedCharacterCount() > 0) {
88 messageQueue.remove(payload.getAckNackSequenceNumber());
89 }
90 }
91
92 private void handleIncomingDataMessage(SolInboundMessage payload) {
93 connection.notifyRequestListeners(payload);
94 }
95
96 }