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.OFDeserializer;
14 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterError;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
36 * Translates Error messages
37 * @author michal.polkorab
38 * @author timotej.kubas
40 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
42 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
43 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
46 public ErrorMessage deserialize(ByteBuf rawMessage) {
47 ErrorMessageBuilder builder = new ErrorMessageBuilder();
48 builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
49 builder.setXid(rawMessage.readUnsignedInt());
50 int type = rawMessage.readUnsignedShort();
51 ErrorType errorType = ErrorType.forValue(type);
52 decodeType(builder, errorType, type);
53 decodeCode(rawMessage, builder, errorType);
54 if (rawMessage.readableBytes() > 0) {
55 builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
57 return builder.build();
60 private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
62 builder.setType(type.getIntValue());
63 builder.setTypeString(type.name());
65 builder.setType(readValue);
66 builder.setTypeString(UNKNOWN_TYPE);
70 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
72 int code = rawMessage.readUnsignedShort();
77 HelloFailedCode errorCode = HelloFailedCode.forValue(code);
78 if (errorCode != null) {
79 setCode(builder, errorCode.getIntValue(), errorCode.name());
81 setUnknownCode(builder, code);
87 BadRequestCode errorCode = BadRequestCode.forValue(code);
88 if (errorCode != null) {
89 setCode(builder, errorCode.getIntValue(), errorCode.name());
91 setUnknownCode(builder, code);
97 BadActionCode errorCode = BadActionCode.forValue(code);
98 if (errorCode != null) {
99 setCode(builder, errorCode.getIntValue(), errorCode.name());
101 setUnknownCode(builder, code);
107 BadInstructionCode errorCode = BadInstructionCode.forValue(code);
108 if (errorCode != null) {
109 setCode(builder, errorCode.getIntValue(), errorCode.name());
111 setUnknownCode(builder, code);
117 BadMatchCode errorCode = BadMatchCode.forValue(code);
118 if (errorCode != null) {
119 setCode(builder, errorCode.getIntValue(), errorCode.name());
121 setUnknownCode(builder, code);
127 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
128 if (errorCode != null) {
129 setCode(builder, errorCode.getIntValue(), errorCode.name());
131 setUnknownCode(builder, code);
137 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
138 if (errorCode != null) {
139 setCode(builder, errorCode.getIntValue(), errorCode.name());
141 setUnknownCode(builder, code);
147 PortModFailedCode errorCode = PortModFailedCode.forValue(code);
148 if (errorCode != null) {
149 setCode(builder, errorCode.getIntValue(), errorCode.name());
151 setUnknownCode(builder, code);
157 TableModFailedCode errorCode = TableModFailedCode.forValue(code);
158 if (errorCode != null) {
159 setCode(builder, errorCode.getIntValue(), errorCode.name());
161 setUnknownCode(builder, code);
167 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
168 if (errorCode != null) {
169 setCode(builder, errorCode.getIntValue(), errorCode.name());
171 setUnknownCode(builder, code);
175 case SWITCHCONFIGFAILED:
177 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
178 if (errorCode != null) {
179 setCode(builder, errorCode.getIntValue(), errorCode.name());
181 setUnknownCode(builder, code);
185 case ROLEREQUESTFAILED:
187 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
188 if (errorCode != null) {
189 setCode(builder, errorCode.getIntValue(), errorCode.name());
191 setUnknownCode(builder, code);
197 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
198 if (errorCode != null) {
199 setCode(builder, errorCode.getIntValue(), errorCode.name());
201 setUnknownCode(builder, code);
205 case TABLEFEATURESFAILED:
207 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);
208 if (errorCode != null) {
209 setCode(builder, errorCode.getIntValue(), errorCode.name());
211 setUnknownCode(builder, code);
216 ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();
217 expBuilder.setExpType(code);
218 expBuilder.setExperimenter(rawMessage.readUnsignedInt());
219 builder.addAugmentation(ExperimenterError.class, expBuilder.build());
222 setUnknownCode(builder, code);
226 setUnknownCode(builder, code);
230 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
231 builder.setCode(readValue);
232 builder.setCodeString(UNKNOWN_CODE);
235 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
236 builder.setCode(code);
237 builder.setCodeString(codeString);