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
9 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import io.netty.buffer.ByteBuf;
13 import java.util.Objects;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
38 * Translates Error messages.
40 * @author michal.polkorab
41 * @author timotej.kubas
43 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
44 DeserializerRegistryInjector {
46 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
47 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
48 private DeserializerRegistry registry;
51 @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
52 public ErrorMessage deserialize(ByteBuf rawMessage) {
53 Objects.requireNonNull(registry);
55 int startIndex = rawMessage.readerIndex();
56 ErrorMessageBuilder builder = new ErrorMessageBuilder();
57 builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
58 builder.setXid(rawMessage.readUnsignedInt());
59 int type = rawMessage.readUnsignedShort();
60 ErrorType errorType = ErrorType.forValue(type);
61 if (ErrorType.EXPERIMENTER.equals(errorType)) {
62 OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
63 ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
64 EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
65 rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
66 rawMessage.readerIndex(startIndex);
67 return deserializer.deserialize(rawMessage);
69 decodeType(builder, errorType, type);
70 decodeCode(rawMessage, builder, errorType);
71 int remainingBytes = rawMessage.readableBytes();
72 if (remainingBytes > 0) {
73 byte[] data = new byte[remainingBytes];
74 rawMessage.readBytes(data);
75 builder.setData(data);
77 return builder.build();
80 private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
82 builder.setType(type.getIntValue());
83 builder.setTypeString(type.name());
85 builder.setType(readValue);
86 builder.setTypeString(UNKNOWN_TYPE);
90 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
92 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);
107 BadRequestCode errorCode = BadRequestCode.forValue(code);
108 if (errorCode != null) {
109 setCode(builder, errorCode.getIntValue(), errorCode.name());
111 setUnknownCode(builder, code);
117 BadActionCode errorCode = BadActionCode.forValue(code);
118 if (errorCode != null) {
119 setCode(builder, errorCode.getIntValue(), errorCode.name());
121 setUnknownCode(builder, code);
127 BadInstructionCode errorCode = BadInstructionCode.forValue(code);
128 if (errorCode != null) {
129 setCode(builder, errorCode.getIntValue(), errorCode.name());
131 setUnknownCode(builder, code);
137 BadMatchCode errorCode = BadMatchCode.forValue(code);
138 if (errorCode != null) {
139 setCode(builder, errorCode.getIntValue(), errorCode.name());
141 setUnknownCode(builder, code);
147 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
148 if (errorCode != null) {
149 setCode(builder, errorCode.getIntValue(), errorCode.name());
151 setUnknownCode(builder, code);
157 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
158 if (errorCode != null) {
159 setCode(builder, errorCode.getIntValue(), errorCode.name());
161 setUnknownCode(builder, code);
167 PortModFailedCode errorCode = PortModFailedCode.forValue(code);
168 if (errorCode != null) {
169 setCode(builder, errorCode.getIntValue(), errorCode.name());
171 setUnknownCode(builder, code);
177 TableModFailedCode errorCode = TableModFailedCode.forValue(code);
178 if (errorCode != null) {
179 setCode(builder, errorCode.getIntValue(), errorCode.name());
181 setUnknownCode(builder, code);
187 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
188 if (errorCode != null) {
189 setCode(builder, errorCode.getIntValue(), errorCode.name());
191 setUnknownCode(builder, code);
195 case SWITCHCONFIGFAILED:
197 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
198 if (errorCode != null) {
199 setCode(builder, errorCode.getIntValue(), errorCode.name());
201 setUnknownCode(builder, code);
205 case ROLEREQUESTFAILED:
207 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
208 if (errorCode != null) {
209 setCode(builder, errorCode.getIntValue(), errorCode.name());
211 setUnknownCode(builder, code);
217 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
218 if (errorCode != null) {
219 setCode(builder, errorCode.getIntValue(), errorCode.name());
221 setUnknownCode(builder, code);
225 case TABLEFEATURESFAILED:
227 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);
228 if (errorCode != null) {
229 setCode(builder, errorCode.getIntValue(), errorCode.name());
231 setUnknownCode(builder, code);
236 setUnknownCode(builder, code);
240 setUnknownCode(builder, code);
244 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
245 builder.setCode(readValue);
246 builder.setCodeString(UNKNOWN_CODE);
249 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
250 builder.setCode(code);
251 builder.setCodeString(codeString);
255 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
256 this.registry = deserializerRegistry;