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.impl.deserialization.OFDeserializer;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterError;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
35 * Translates Error messages
36 * @author michal.polkorab
37 * @author timotej.kubas
39 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
41 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
42 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
44 private static ErrorMessageFactory instance;
46 private ErrorMessageFactory() {
47 // do nothing, just singleton
51 * @return singleton factory
53 public static synchronized ErrorMessageFactory getInstance() {
54 if (instance == null) {
55 instance = new ErrorMessageFactory();
61 public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {
62 ErrorMessageBuilder builder = new ErrorMessageBuilder();
63 builder.setVersion(version);
64 builder.setXid(rawMessage.readUnsignedInt());
65 int type = rawMessage.readUnsignedShort();
66 ErrorType errorType = ErrorType.forValue(type);
67 decodeType(builder, errorType, type);
68 decodeCode(rawMessage, builder, errorType);
69 if (rawMessage.readableBytes() > 0) {
70 builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
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 ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();
232 expBuilder.setExpType(code);
233 expBuilder.setExperimenter(rawMessage.readUnsignedInt());
234 builder.addAugmentation(ExperimenterError.class, expBuilder.build());
237 setUnknownCode(builder, code);
241 setUnknownCode(builder, code);
245 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
246 builder.setCode(readValue);
247 builder.setCodeString(UNKNOWN_CODE);
250 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
251 builder.setCode(code);
252 builder.setCodeString(codeString);