X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fprotocol%2Fimpl%2Fdeserialization%2Ffactories%2FErrorMessageFactory.java;h=3463855bafd1ef70f7a88f83b23054210d72df45;hb=d9bfb084e625240a4d078975169a6a267c9fd3a1;hp=de9ec3e573f23b5efd6264f9b717ad34599a55e0;hpb=d634962cad3b3adc75d452598493044ea7190c47;p=openflowjava.git diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java index de9ec3e5..3463855b 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/ErrorMessageFactory.java @@ -4,17 +4,37 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.factories; import io.netty.buffer.ByteBuf; import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterError; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder; /** + * Translates Error messages * @author michal.polkorab - * + * @author timotej.kubas */ public class ErrorMessageFactory implements OFDeserializer { -private static ErrorMessageFactory instance; + private static final String UNKNOWN_CODE = "UNKNOWN_CODE"; + private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE"; + + private static ErrorMessageFactory instance; private ErrorMessageFactory() { // do nothing, just singleton @@ -35,12 +55,194 @@ private static ErrorMessageFactory instance; ErrorMessageBuilder builder = new ErrorMessageBuilder(); builder.setVersion(version); builder.setXid(rawMessage.readUnsignedInt()); - builder.setType(ErrorType.forValue(rawMessage.readUnsignedShort())); - builder.setCode(rawMessage.readUnsignedShort()); - byte[] data = new byte[rawMessage.readableBytes()]; - rawMessage.readBytes(data); - builder.setData(data); + int type = rawMessage.readUnsignedShort(); + ErrorType errorType = ErrorType.forValue(type); + decodeType(builder, errorType, type); + decodeCode(rawMessage, builder, errorType); + if (rawMessage.readableBytes() > 0) { + builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array()); + } return builder.build(); } + + private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) { + if (type != null) { + builder.setType(type.getIntValue()); + builder.setTypeString(type.name()); + } else { + builder.setType(readValue); + builder.setTypeString(UNKNOWN_TYPE); + } + } + + private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder, + ErrorType type) { + int code = rawMessage.readUnsignedShort(); + if (type != null) { + switch (type) { + case HELLOFAILED: + { + HelloFailedCode errorCode = HelloFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADREQUEST: + { + BadRequestCode errorCode = BadRequestCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADACTION: + { + BadActionCode errorCode = BadActionCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADINSTRUCTION: + { + BadInstructionCode errorCode = BadInstructionCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case BADMATCH: + { + BadMatchCode errorCode = BadMatchCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case FLOWMODFAILED: + { + FlowModFailedCode errorCode = FlowModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case GROUPMODFAILED: + { + GroupModFailedCode errorCode = GroupModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case PORTMODFAILED: + { + PortModFailedCode errorCode = PortModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case TABLEMODFAILED: + { + TableModFailedCode errorCode = TableModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case QUEUEOPFAILED: + { + QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case SWITCHCONFIGFAILED: + { + SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case ROLEREQUESTFAILED: + { + RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case METERMODFAILED: + { + MeterModFailedCode errorCode = MeterModFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case TABLEFEATURESFAILED: + { + TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code); + if (errorCode != null) { + setCode(builder, errorCode.getIntValue(), errorCode.name()); + } else { + setUnknownCode(builder, code); + } + break; + } + case EXPERIMENTER: + ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder(); + expBuilder.setExpType(code); + expBuilder.setExperimenter(rawMessage.readUnsignedInt()); + builder.addAugmentation(ExperimenterError.class, expBuilder.build()); + break; + default: + setUnknownCode(builder, code); + break; + } + } else { + setUnknownCode(builder, code); + } + } + + private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) { + builder.setCode(readValue); + builder.setCodeString(UNKNOWN_CODE); + } + + private static void setCode(ErrorMessageBuilder builder, int code, String codeString) { + builder.setCode(code); + builder.setCodeString(codeString); + } }