2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
10 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
12 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
13 import io.netty.buffer.ByteBuf;
14 import java.util.Objects;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
39 * Translates Error messages.
41 * @author michal.polkorab
42 * @author timotej.kubas
44 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
45 DeserializerRegistryInjector {
47 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
48 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
49 private DeserializerRegistry registry;
52 @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
53 public ErrorMessage deserialize(ByteBuf rawMessage) {
54 Objects.requireNonNull(registry);
56 int startIndex = rawMessage.readerIndex();
57 ErrorMessageBuilder builder = new ErrorMessageBuilder()
58 .setVersion(EncodeConstants.OF_VERSION_1_3)
59 .setXid(readUint32(rawMessage));
60 int type = rawMessage.readUnsignedShort();
61 ErrorType errorType = ErrorType.forValue(type);
62 if (ErrorType.EXPERIMENTER.equals(errorType)) {
63 OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
64 ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
65 EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
66 rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
67 rawMessage.readerIndex(startIndex);
68 return deserializer.deserialize(rawMessage);
70 decodeType(builder, errorType, type);
71 decodeCode(rawMessage, builder, errorType);
72 int remainingBytes = rawMessage.readableBytes();
73 if (remainingBytes > 0) {
74 byte[] data = new byte[remainingBytes];
75 rawMessage.readBytes(data);
76 builder.setData(data);
78 return builder.build();
81 private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
83 builder.setType(type.getIntValue());
84 builder.setTypeString(type.name());
86 builder.setType(readValue);
87 builder.setTypeString(UNKNOWN_TYPE);
91 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
93 int code = rawMessage.readUnsignedShort();
97 HelloFailedCode errorCode = HelloFailedCode.forValue(code);
98 if (errorCode != null) {
99 setCode(builder, errorCode.getIntValue(), errorCode.name());
101 setUnknownCode(builder, code);
106 BadRequestCode errorCode = BadRequestCode.forValue(code);
107 if (errorCode != null) {
108 setCode(builder, errorCode.getIntValue(), errorCode.name());
110 setUnknownCode(builder, code);
115 BadActionCode errorCode = BadActionCode.forValue(code);
116 if (errorCode != null) {
117 setCode(builder, errorCode.getIntValue(), errorCode.name());
119 setUnknownCode(builder, code);
123 case BADINSTRUCTION: {
124 BadInstructionCode errorCode = BadInstructionCode.forValue(code);
125 if (errorCode != null) {
126 setCode(builder, errorCode.getIntValue(), errorCode.name());
128 setUnknownCode(builder, code);
133 BadMatchCode errorCode = BadMatchCode.forValue(code);
134 if (errorCode != null) {
135 setCode(builder, errorCode.getIntValue(), errorCode.name());
137 setUnknownCode(builder, code);
141 case FLOWMODFAILED: {
142 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
143 if (errorCode != null) {
144 setCode(builder, errorCode.getIntValue(), errorCode.name());
146 setUnknownCode(builder, code);
150 case GROUPMODFAILED: {
151 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
152 if (errorCode != null) {
153 setCode(builder, errorCode.getIntValue(), errorCode.name());
155 setUnknownCode(builder, code);
159 case PORTMODFAILED: {
160 PortModFailedCode errorCode = PortModFailedCode.forValue(code);
161 if (errorCode != null) {
162 setCode(builder, errorCode.getIntValue(), errorCode.name());
164 setUnknownCode(builder, code);
168 case TABLEMODFAILED: {
169 TableModFailedCode errorCode = TableModFailedCode.forValue(code);
170 if (errorCode != null) {
171 setCode(builder, errorCode.getIntValue(), errorCode.name());
173 setUnknownCode(builder, code);
177 case QUEUEOPFAILED: {
178 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
179 if (errorCode != null) {
180 setCode(builder, errorCode.getIntValue(), errorCode.name());
182 setUnknownCode(builder, code);
186 case SWITCHCONFIGFAILED: {
187 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
188 if (errorCode != null) {
189 setCode(builder, errorCode.getIntValue(), errorCode.name());
191 setUnknownCode(builder, code);
195 case ROLEREQUESTFAILED: {
196 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
197 if (errorCode != null) {
198 setCode(builder, errorCode.getIntValue(), errorCode.name());
200 setUnknownCode(builder, code);
204 case METERMODFAILED: {
205 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
206 if (errorCode != null) {
207 setCode(builder, errorCode.getIntValue(), errorCode.name());
209 setUnknownCode(builder, code);
213 case TABLEFEATURESFAILED: {
214 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);
215 if (errorCode != null) {
216 setCode(builder, errorCode.getIntValue(), errorCode.name());
218 setUnknownCode(builder, code);
223 setUnknownCode(builder, code);
227 setUnknownCode(builder, code);
231 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
232 builder.setCode(readValue);
233 builder.setCodeString(UNKNOWN_CODE);
236 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
237 builder.setCode(code);
238 builder.setCodeString(codeString);
242 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
243 this.registry = deserializerRegistry;