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 io.netty.buffer.ByteBuf;
13 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
16 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
17 import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
37 * Translates Error messages
38 * @author michal.polkorab
39 * @author timotej.kubas
41 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
42 DeserializerRegistryInjector {
44 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
45 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
46 private DeserializerRegistry registry;
49 public ErrorMessage deserialize(ByteBuf rawMessage) {
50 int startIndex = rawMessage.readerIndex();
51 ErrorMessageBuilder builder = new ErrorMessageBuilder();
52 builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
53 builder.setXid(rawMessage.readUnsignedInt());
54 int type = rawMessage.readUnsignedShort();
55 ErrorType errorType = ErrorType.forValue(type);
56 if (ErrorType.EXPERIMENTER.equals(errorType)) {
57 OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
58 ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
59 EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
60 rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
61 rawMessage.readerIndex(startIndex);
62 return deserializer.deserialize(rawMessage);
64 decodeType(builder, errorType, type);
65 decodeCode(rawMessage, builder, errorType);
66 int remainingBytes = rawMessage.readableBytes();
67 if (remainingBytes > 0) {
68 byte[] data = new byte[remainingBytes];
69 rawMessage.readBytes(data);
70 builder.setData(data);
72 return builder.build();
75 private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
77 builder.setType(type.getIntValue());
78 builder.setTypeString(type.name());
80 builder.setType(readValue);
81 builder.setTypeString(UNKNOWN_TYPE);
85 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
87 int code = rawMessage.readUnsignedShort();
92 HelloFailedCode errorCode = HelloFailedCode.forValue(code);
93 if (errorCode != null) {
94 setCode(builder, errorCode.getIntValue(), errorCode.name());
96 setUnknownCode(builder, code);
102 BadRequestCode errorCode = BadRequestCode.forValue(code);
103 if (errorCode != null) {
104 setCode(builder, errorCode.getIntValue(), errorCode.name());
106 setUnknownCode(builder, code);
112 BadActionCode errorCode = BadActionCode.forValue(code);
113 if (errorCode != null) {
114 setCode(builder, errorCode.getIntValue(), errorCode.name());
116 setUnknownCode(builder, code);
122 BadInstructionCode errorCode = BadInstructionCode.forValue(code);
123 if (errorCode != null) {
124 setCode(builder, errorCode.getIntValue(), errorCode.name());
126 setUnknownCode(builder, code);
132 BadMatchCode errorCode = BadMatchCode.forValue(code);
133 if (errorCode != null) {
134 setCode(builder, errorCode.getIntValue(), errorCode.name());
136 setUnknownCode(builder, code);
142 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
143 if (errorCode != null) {
144 setCode(builder, errorCode.getIntValue(), errorCode.name());
146 setUnknownCode(builder, code);
152 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
153 if (errorCode != null) {
154 setCode(builder, errorCode.getIntValue(), errorCode.name());
156 setUnknownCode(builder, code);
162 PortModFailedCode errorCode = PortModFailedCode.forValue(code);
163 if (errorCode != null) {
164 setCode(builder, errorCode.getIntValue(), errorCode.name());
166 setUnknownCode(builder, code);
172 TableModFailedCode errorCode = TableModFailedCode.forValue(code);
173 if (errorCode != null) {
174 setCode(builder, errorCode.getIntValue(), errorCode.name());
176 setUnknownCode(builder, code);
182 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
183 if (errorCode != null) {
184 setCode(builder, errorCode.getIntValue(), errorCode.name());
186 setUnknownCode(builder, code);
190 case SWITCHCONFIGFAILED:
192 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
193 if (errorCode != null) {
194 setCode(builder, errorCode.getIntValue(), errorCode.name());
196 setUnknownCode(builder, code);
200 case ROLEREQUESTFAILED:
202 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
203 if (errorCode != null) {
204 setCode(builder, errorCode.getIntValue(), errorCode.name());
206 setUnknownCode(builder, code);
212 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
213 if (errorCode != null) {
214 setCode(builder, errorCode.getIntValue(), errorCode.name());
216 setUnknownCode(builder, code);
220 case TABLEFEATURESFAILED:
222 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);
223 if (errorCode != null) {
224 setCode(builder, errorCode.getIntValue(), errorCode.name());
226 setUnknownCode(builder, code);
231 setUnknownCode(builder, code);
235 setUnknownCode(builder, code);
239 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
240 builder.setCode(readValue);
241 builder.setCodeString(UNKNOWN_CODE);
244 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
245 builder.setCode(code);
246 builder.setCodeString(codeString);
250 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
251 this.registry = deserializerRegistry;