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.common.types.rev130731.BadActionCodeV10;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCodeV10;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorTypeV10;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCodeV10;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCodeV10;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCodeV10;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCodeV10;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
25 * Translates Error messages (OpenFlow v1.0)
26 * @author michal.polkorab
28 public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
30 private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
31 private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
33 private static OF10ErrorMessageFactory instance;
35 private OF10ErrorMessageFactory() {
36 // do nothing, just singleton
40 * @return singleton factory
42 public static synchronized OF10ErrorMessageFactory getInstance() {
43 if (instance == null) {
44 instance = new OF10ErrorMessageFactory();
50 public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {
51 ErrorMessageBuilder builder = new ErrorMessageBuilder();
52 builder.setVersion(version);
53 builder.setXid(rawMessage.readUnsignedInt());
54 int type = rawMessage.readUnsignedShort();
55 ErrorTypeV10 errorType = ErrorTypeV10.forValue(type);
56 decodeType(builder, errorType, type);
57 decodeCode(rawMessage, builder, errorType);
58 if (rawMessage.readableBytes() > 0) {
59 builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
61 return builder.build();
64 private static void decodeType(ErrorMessageBuilder builder, ErrorTypeV10 type, int readValue) {
66 builder.setType(type.getIntValue());
67 builder.setTypeString(type.name());
69 builder.setType(readValue);
70 builder.setTypeString(UNKNOWN_TYPE);
74 private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
76 int code = rawMessage.readUnsignedShort();
81 HelloFailedCodeV10 errorCode = HelloFailedCodeV10.forValue(code);
82 if (errorCode != null) {
83 setCode(builder, errorCode.getIntValue(), errorCode.name());
85 setUnknownCode(builder, code);
91 BadRequestCodeV10 errorCode = BadRequestCodeV10.forValue(code);
92 if (errorCode != null) {
93 setCode(builder, errorCode.getIntValue(), errorCode.name());
95 setUnknownCode(builder, code);
101 BadActionCodeV10 errorCode = BadActionCodeV10.forValue(code);
102 if (errorCode != null) {
103 setCode(builder, errorCode.getIntValue(), errorCode.name());
105 setUnknownCode(builder, code);
111 FlowModFailedCodeV10 errorCode = FlowModFailedCodeV10.forValue(code);
112 if (errorCode != null) {
113 setCode(builder, errorCode.getIntValue(), errorCode.name());
115 setUnknownCode(builder, code);
121 PortModFailedCodeV10 errorCode = PortModFailedCodeV10.forValue(code);
122 if (errorCode != null) {
123 setCode(builder, errorCode.getIntValue(), errorCode.name());
125 setUnknownCode(builder, code);
131 QueueOpFailedCodeV10 errorCode = QueueOpFailedCodeV10.forValue(code);
132 if (errorCode != null) {
133 setCode(builder, errorCode.getIntValue(), errorCode.name());
135 setUnknownCode(builder, code);
140 setUnknownCode(builder, code);
144 setUnknownCode(builder, code);
148 private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
149 builder.setCode(readValue);
150 builder.setCodeString(UNKNOWN_CODE);
153 private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
154 builder.setCode(code);
155 builder.setCodeString(codeString);