X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=pcep%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fpcep%2Fimpl%2Fsubobject%2FXROUnnumberedInterfaceSubobjectParser.java;h=ee52d71260f5d290f158b1f20fdd44a277c1897c;hb=f6bd72924792cc9af69a6c771e95ce0c42d1fa24;hp=9d3c84fbe79afbd59e7f746d5b62a131e4f00955;hpb=ce6991a8596c022555b003e128077a8f5468ec5e;p=bgpcep.git diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/XROUnnumberedInterfaceSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/XROUnnumberedInterfaceSubobjectParser.java index 9d3c84fbe7..ee52d71260 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/XROUnnumberedInterfaceSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/XROUnnumberedInterfaceSubobjectParser.java @@ -7,58 +7,64 @@ */ package org.opendaylight.protocol.pcep.impl.subobject; -import org.opendaylight.protocol.pcep.PCEPDeserializerException; -import org.opendaylight.protocol.pcep.subobject.ExcludeRouteSubobject; -import org.opendaylight.protocol.pcep.subobject.XROUnnumberedInterfaceSubobject; -import org.opendaylight.protocol.util.ByteArray; +import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedByte; +import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt; + +import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.pcep.spi.XROSubobjectParser; +import org.opendaylight.protocol.pcep.spi.XROSubobjectSerializer; +import org.opendaylight.protocol.pcep.spi.XROSubobjectUtil; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.xro.Subobject; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.exclude.route.object.xro.SubobjectBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.ExcludeRouteSubobjects.Attribute; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.UnnumberedSubobject; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.UnnumberedCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.UnnumberedCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.unnumbered._case.UnnumberedBuilder; /** - * Parser for {@link org.opendaylight.protocol.pcep.subobject.XROUnnumberedInterfaceSubobject - * XROUnnumberedInterfaceSubobject} + * Parser for {@link UnnumberedCase} */ -public class XROUnnumberedInterfaceSubobjectParser { - public static final int ATTRIBUTE_LENGTH = 1; - public static final int ROUTER_ID_NUMBER_LENGTH = 4; - public static final int INTERFACE_ID_NUMBER_LENGTH = 4; - - public static final int ATTRIBUTE_OFFSET = 1;// added reserved field of size 1 - public static final int ROUTER_ID_NUMBER_OFFSET = ATTRIBUTE_OFFSET + ATTRIBUTE_LENGTH; - public static final int INTERFACE_ID_NUMBER_OFFSET = ROUTER_ID_NUMBER_OFFSET + ROUTER_ID_NUMBER_LENGTH; - - public static final int CONTENT_LENGTH = INTERFACE_ID_NUMBER_OFFSET + INTERFACE_ID_NUMBER_LENGTH; - - public static XROUnnumberedInterfaceSubobject parse(final byte[] soContentsBytes, final boolean mandatory) - throws PCEPDeserializerException { - if (soContentsBytes == null || soContentsBytes.length == 0) - throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty."); - if (soContentsBytes.length != CONTENT_LENGTH) - throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + soContentsBytes.length + "; Expected: " - + CONTENT_LENGTH + "."); +public class XROUnnumberedInterfaceSubobjectParser implements XROSubobjectParser, XROSubobjectSerializer { - // return new XROUnnumberedInterfaceSubobject(new IPv4Address( - // ByteArray.subByte(soContentsBytes, ROUTER_ID_NUMBER_OFFSET, ROUTER_ID_NUMBER_LENGTH)), new - // UnnumberedInterfaceIdentifier( - // UnsignedInts.toLong(ByteArray.bytesToInt(ByteArray.subByte(soContentsBytes, INTERFACE_ID_NUMBER_OFFSET, - // INTERFACE_ID_NUMBER_LENGTH)))), - // mandatory, XROSubobjectAttributeMapping.getInstance().getFromAttributeIdentifier((short) - // (soContentsBytes[ATTRIBUTE_OFFSET] & 0xFF))); - return null; - } + public static final int TYPE = 4; - public static byte[] put(final ExcludeRouteSubobject objToSerialize) { - if (!(objToSerialize instanceof XROUnnumberedInterfaceSubobject)) - throw new IllegalArgumentException("Unknown PCEPXROSubobject instance. Passed " + objToSerialize.getClass() - + ". Needed XROUnnumberedInterfaceSubobject."); + private static final int RESERVED = 1; - byte[] retBytes; - retBytes = new byte[CONTENT_LENGTH]; - final XROUnnumberedInterfaceSubobject specObj = (XROUnnumberedInterfaceSubobject) objToSerialize; + private static final int CONTENT_LENGTH = 10; - retBytes[ATTRIBUTE_OFFSET] = (byte) XROSubobjectAttributeMapping.getInstance().getFromAttributeEnum(specObj.getAttribute()); - ByteArray.copyWhole(specObj.getRouterID().getAddress(), retBytes, ROUTER_ID_NUMBER_OFFSET); - System.arraycopy(ByteArray.longToBytes(specObj.getInterfaceID().getInterfaceId()), Long.SIZE / Byte.SIZE - - INTERFACE_ID_NUMBER_LENGTH, retBytes, INTERFACE_ID_NUMBER_OFFSET, INTERFACE_ID_NUMBER_LENGTH); + @Override + public Subobject parseSubobject(final ByteBuf buffer, final boolean mandatory) throws PCEPDeserializerException { + Preconditions.checkArgument(buffer != null && buffer.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + if (buffer.readableBytes() != CONTENT_LENGTH) { + throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: " + + CONTENT_LENGTH + "."); + } + buffer.readerIndex(buffer.readerIndex() + RESERVED); + final SubobjectBuilder builder = new SubobjectBuilder(); + builder.setMandatory(mandatory); + builder.setAttribute(Attribute.forValue(buffer.readUnsignedByte())); + final UnnumberedBuilder ubuilder = new UnnumberedBuilder(); + ubuilder.setRouterId(buffer.readUnsignedInt()); + ubuilder.setInterfaceId(buffer.readUnsignedInt()); + builder.setSubobjectType(new UnnumberedCaseBuilder().setUnnumbered(ubuilder.build()).build()); + return builder.build(); + } - return retBytes; - } + @Override + public void serializeSubobject(final Subobject subobject, final ByteBuf buffer) { + Preconditions.checkArgument(subobject.getSubobjectType() instanceof UnnumberedCase, "Unknown subobject instance. Passed %s. Needed UnnumberedCase.", subobject.getSubobjectType().getClass()); + final UnnumberedSubobject specObj = ((UnnumberedCase) subobject.getSubobjectType()).getUnnumbered(); + final ByteBuf body = Unpooled.buffer(CONTENT_LENGTH); + body.writeZero(RESERVED); + writeUnsignedByte(subobject.getAttribute() != null ? (short) subobject.getAttribute().getIntValue() : null, body); + Preconditions.checkArgument(specObj.getRouterId() != null, "RouterId is mandatory."); + writeUnsignedInt(specObj.getRouterId(), body); + Preconditions.checkArgument(specObj.getInterfaceId() != null, "InterfaceId is mandatory."); + writeUnsignedInt(specObj.getInterfaceId(), body); + XROSubobjectUtil.formatSubobject(TYPE, subobject.isMandatory(), body, buffer); + } }