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.MessageCodeKey;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdError;
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
39 * @author michal.polkorab
40 * @author timotej.kubas
42 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
43 DeserializerRegistryInjector {
45 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
46 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
47 private DeserializerRegistry registry;
50 public ErrorMessage deserialize(ByteBuf rawMessage) {
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 builder.setType(errorType.getIntValue());
58 OFDeserializer<ExperimenterIdError> deserializer = registry.getDeserializer(new MessageCodeKey(
59 EncodeConstants.OF13_VERSION_ID, EncodeConstants.EXPERIMENTER_VALUE, ErrorMessage.class));
60 ExperimenterIdError error = deserializer.deserialize(rawMessage);
61 builder.addAugmentation(ExperimenterIdError.class, error);
63 decodeType(builder, errorType, type);
64 decodeCode(rawMessage, builder, errorType);
65 if (rawMessage.readableBytes() > 0) {
66 builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
69 return builder.build();
72 private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
74 builder.setType(type.getIntValue());
75 builder.setTypeString(type.name());
77 builder.setType(readValue);
78 builder.setTypeString(UNKNOWN_TYPE);
82 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
84 int code = rawMessage.readUnsignedShort();
89 HelloFailedCode errorCode = HelloFailedCode.forValue(code);
90 if (errorCode != null) {
91 setCode(builder, errorCode.getIntValue(), errorCode.name());
93 setUnknownCode(builder, code);
99 BadRequestCode errorCode = BadRequestCode.forValue(code);
100 if (errorCode != null) {
101 setCode(builder, errorCode.getIntValue(), errorCode.name());
103 setUnknownCode(builder, code);
109 BadActionCode errorCode = BadActionCode.forValue(code);
110 if (errorCode != null) {
111 setCode(builder, errorCode.getIntValue(), errorCode.name());
113 setUnknownCode(builder, code);
119 BadInstructionCode errorCode = BadInstructionCode.forValue(code);
120 if (errorCode != null) {
121 setCode(builder, errorCode.getIntValue(), errorCode.name());
123 setUnknownCode(builder, code);
129 BadMatchCode errorCode = BadMatchCode.forValue(code);
130 if (errorCode != null) {
131 setCode(builder, errorCode.getIntValue(), errorCode.name());
133 setUnknownCode(builder, code);
139 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
140 if (errorCode != null) {
141 setCode(builder, errorCode.getIntValue(), errorCode.name());
143 setUnknownCode(builder, code);
149 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
150 if (errorCode != null) {
151 setCode(builder, errorCode.getIntValue(), errorCode.name());
153 setUnknownCode(builder, code);
159 PortModFailedCode errorCode = PortModFailedCode.forValue(code);
160 if (errorCode != null) {
161 setCode(builder, errorCode.getIntValue(), errorCode.name());
163 setUnknownCode(builder, code);
169 TableModFailedCode errorCode = TableModFailedCode.forValue(code);
170 if (errorCode != null) {
171 setCode(builder, errorCode.getIntValue(), errorCode.name());
173 setUnknownCode(builder, code);
179 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
180 if (errorCode != null) {
181 setCode(builder, errorCode.getIntValue(), errorCode.name());
183 setUnknownCode(builder, code);
187 case SWITCHCONFIGFAILED:
189 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
190 if (errorCode != null) {
191 setCode(builder, errorCode.getIntValue(), errorCode.name());
193 setUnknownCode(builder, code);
197 case ROLEREQUESTFAILED:
199 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
200 if (errorCode != null) {
201 setCode(builder, errorCode.getIntValue(), errorCode.name());
203 setUnknownCode(builder, code);
209 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
210 if (errorCode != null) {
211 setCode(builder, errorCode.getIntValue(), errorCode.name());
213 setUnknownCode(builder, code);
217 case TABLEFEATURESFAILED:
219 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);
220 if (errorCode != null) {
221 setCode(builder, errorCode.getIntValue(), errorCode.name());
223 setUnknownCode(builder, code);
228 setUnknownCode(builder, code);
232 setUnknownCode(builder, code);
236 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
237 builder.setCode(readValue);
238 builder.setCodeString(UNKNOWN_CODE);
241 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
242 builder.setCode(code);
243 builder.setCodeString(codeString);
247 public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
248 this.registry = deserializerRegistry;