From ccc1462c69bfe75a4574a0920042a961fc5f63e8 Mon Sep 17 00:00:00 2001 From: Ladislav Borak Date: Mon, 2 Mar 2015 13:46:07 +0100 Subject: [PATCH] BUG-2794 : refactored code to use BitArray Change-Id: I8906ec2b9671cd71916f0e3c4225199cf5963bdc Signed-off-by: Dana Kutenicsova Signed-off-by: Ladislav Borak --- .../FSExtendedCommunitiesAttributeParser.java | 18 ++-- .../protocol/bgp/flowspec/FSNlriParser.java | 96 +++++++------------ .../bgp/flowspec/FSNlriParserTest.java | 2 +- .../attribute/LinkAttributesParser.java | 22 ++--- .../attribute/NodeAttributesParser.java | 34 +++---- .../attribute/PrefixAttributesParser.java | 17 ++-- .../attribute/sr/SrLinkAttributesParser.java | 66 +++++-------- .../attribute/sr/SrNodeAttributesParser.java | 40 ++++---- .../sr/SrPrefixAttributesParser.java | 46 ++++----- .../spi/pojo/SimpleAttributeRegistry.java | 10 +- .../CInitiated00LspObjectParser.java | 47 ++++----- .../CInitiated00SrpObjectParser.java | 12 +-- ...nitiated00StatefulCapabilityTlvParser.java | 23 ++--- .../stateful07/Stateful07LspObjectParser.java | 64 +++++-------- .../Stateful07RSVPErrorSpecTlvParser.java | 21 ++-- .../stateful07/Stateful07SrpObjectParser.java | 10 +- ...Stateful07StatefulCapabilityTlvParser.java | 24 ++--- .../pcep/ietf/PCEPObjectParserTest.java | 2 +- .../impl/object/PCEPLspaObjectParser.java | 16 ++-- .../impl/object/PCEPMetricObjectParser.java | 20 ++-- .../object/PCEPMonitoringObjectParser.java | 11 +-- .../impl/object/PCEPNoPathObjectParser.java | 17 ++-- .../impl/object/PCEPProcTimeObjectParser.java | 14 ++- .../PCEPRequestParameterObjectParser.java | 57 ++++------- .../impl/object/PCEPSvecObjectParser.java | 26 ++--- .../subobject/EROLabelSubobjectParser.java | 11 +-- .../RROIpv4PrefixSubobjectParser.java | 21 ++-- .../RROIpv6PrefixSubobjectParser.java | 21 ++-- .../subobject/RROLabelSubobjectParser.java | 11 +-- ...RROUnnumberedInterfaceSubobjectParser.java | 20 ++-- .../pcep/impl/tlv/NoPathVectorTlvParser.java | 50 ++++------ .../segment/routing/SrEroSubobjectParser.java | 26 ++--- .../segment/routing/SrRroSubobjectParser.java | 12 +-- .../routing/SrSubobjectParserUtil.java | 15 +-- .../pcep/spi/AbstractMessageParser.java | 14 +-- .../protocol/pcep/spi/LabelUtil.java | 22 ++--- .../protocol/pcep/spi/ObjectUtil.java | 23 ++--- 37 files changed, 362 insertions(+), 599 deletions(-) diff --git a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSExtendedCommunitiesAttributeParser.java b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSExtendedCommunitiesAttributeParser.java index d62d3f99c3..613f607942 100644 --- a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSExtendedCommunitiesAttributeParser.java +++ b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSExtendedCommunitiesAttributeParser.java @@ -8,10 +8,10 @@ package org.opendaylight.protocol.bgp.flowspec; import io.netty.buffer.ByteBuf; -import java.util.BitSet; import org.opendaylight.protocol.bgp.parser.BGPDocumentedException; import org.opendaylight.protocol.bgp.parser.BGPError; import org.opendaylight.protocol.bgp.parser.impl.message.update.ExtendedCommunitiesAttributeParser; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.ByteBufWriteUtil; import org.opendaylight.protocol.util.ReferenceCache; @@ -58,7 +58,7 @@ public class FSExtendedCommunitiesAttributeParser extends ExtendedCommunitiesAtt private static final int RESERVED = 5; - private static final int FLAGS_SIZE = 1; + private static final int FLAGS_SIZE = 8; private static final int SAMPLE_BIT = 6; @@ -80,7 +80,7 @@ public class FSExtendedCommunitiesAttributeParser extends ExtendedCommunitiesAtt break; case TRAFFIC_ACTION_SUBTYPE: buffer.skipBytes(RESERVED); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); final boolean sample = flags.get(SAMPLE_BIT); final boolean terminal = flags.get(TERMINAL_BIT); c = new TrafficActionExtendedCommunityCaseBuilder().setTrafficActionExtendedCommunity(new TrafficActionExtendedCommunityBuilder().setSample(sample).setTerminalAction(terminal).build()).build(); @@ -117,14 +117,10 @@ public class FSExtendedCommunitiesAttributeParser extends ExtendedCommunitiesAtt else if (ex instanceof TrafficActionExtendedCommunityCase) { final TrafficActionExtendedCommunity trafficAction = ((TrafficActionExtendedCommunityCase) ex).getTrafficActionExtendedCommunity(); buffer.writeZero(RESERVED); - final BitSet flags = new BitSet(FLAGS_SIZE); - if (trafficAction.isSample() != null) { - flags.set(SAMPLE_BIT, trafficAction.isSample()); - } - if (trafficAction.isTerminalAction() != null) { - flags.set(TERMINAL_BIT, trafficAction.isTerminalAction()); - } - ByteBufWriteUtil.writeBitSet(flags, FLAGS_SIZE, buffer); + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(SAMPLE_BIT, trafficAction.isSample()); + flags.set(TERMINAL_BIT, trafficAction.isTerminalAction()); + flags.toByteBuf(buffer); } else if (ex instanceof RedirectExtendedCommunityCase) { final RedirectExtendedCommunity redirect = ((RedirectExtendedCommunityCase) ex).getRedirectExtendedCommunity(); diff --git a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParser.java b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParser.java index 4f5c372334..3910e4364e 100644 --- a/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParser.java +++ b/bgp/flowspec/src/main/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParser.java @@ -14,11 +14,11 @@ import com.google.common.primitives.UnsignedInts; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.util.ArrayList; -import java.util.BitSet; import java.util.List; import org.opendaylight.protocol.bgp.parser.BGPParsingException; import org.opendaylight.protocol.bgp.parser.spi.NlriParser; import org.opendaylight.protocol.bgp.parser.spi.NlriSerializer; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.ByteBufWriteUtil; import org.opendaylight.protocol.util.Ipv4Util; @@ -101,21 +101,23 @@ public class FSNlriParser implements NlriParser, NlriSerializer { */ private static final int LENGTH_MAGIC = 61440; - private static final int END_OF_LIST = 7; - private static final int AND_BIT = 6; + private static final int OPERAND_LENGTH = 8; + + private static final int END_OF_LIST = 0; + private static final int AND_BIT = 1; private static final int LENGTH_BITMASK = 48; private static final int LENGTH_SHIFT = 4; - private static final int LESS_THAN = 2; - private static final int GREATER_THAN = 1; - private static final int EQUAL = 0; + private static final int LESS_THAN = 5; + private static final int GREATER_THAN = 6; + private static final int EQUAL = 7; - private static final int NOT = 1; - private static final int MATCH = 0; + private static final int NOT = 6; + private static final int MATCH = 7; - private static final int LAST_FRAGMENT = 7; - private static final int FIRST_FRAGMENT = 6; - private static final int IS_A_FRAGMENT = 5; - private static final int DONT_FRAGMENT = 4; + private static final int LAST_FRAGMENT = 4; + private static final int FIRST_FRAGMENT = 5; + private static final int IS_A_FRAGMENT = 6; + private static final int DONT_FRAGMENT = 7; private static final int MAX_NLRI_LENGTH = 4095; private static final int MAX_NLRI_LENGTH_ONE_BYTE = 240; @@ -269,42 +271,24 @@ public class FSNlriParser implements NlriParser, NlriSerializer { } private static void serializeNumericOperand(final NumericOperand op, final int length, final ByteBuf buffer) { - final BitSet bs = new BitSet(Byte.SIZE); - if (op.isEndOfList() != null) { - bs.set(END_OF_LIST, op.isEndOfList()); - } - if (op.isAndBit() != null) { - bs.set(AND_BIT, op.isAndBit()); - } - if (op.isLessThan() != null) { - bs.set(LESS_THAN, op.isLessThan()); - } - if (op.isGreaterThan() != null) { - bs.set(GREATER_THAN, op.isGreaterThan()); - } - if (op.isEquals() != null) { - bs.set(EQUAL, op.isEquals()); - } + final BitArray bs = new BitArray(OPERAND_LENGTH); + bs.set(END_OF_LIST, op.isEndOfList()); + bs.set(AND_BIT, op.isAndBit()); + bs.set(LESS_THAN, op.isLessThan()); + bs.set(GREATER_THAN, op.isGreaterThan()); + bs.set(EQUAL, op.isEquals()); final byte len = (byte) (Integer.numberOfTrailingZeros(length) << LENGTH_SHIFT); - buffer.writeByte(bs.toByteArray()[0] | len); + buffer.writeByte(bs.toByte() | len); } private static void serializeBitmaskOperand(final BitmaskOperand op, final int length, final ByteBuf buffer) { - final BitSet bs = new BitSet(Byte.SIZE); - if (op.isEndOfList() != null) { - bs.set(END_OF_LIST, op.isEndOfList()); - } - if (op.isAndBit() != null) { - bs.set(AND_BIT, op.isAndBit()); - } - if (op.isMatch() != null) { - bs.set(MATCH, op.isMatch()); - } - if (op.isNot() != null) { - bs.set(NOT, op.isNot()); - } + final BitArray bs = new BitArray(OPERAND_LENGTH); + bs.set(END_OF_LIST, op.isEndOfList()); + bs.set(AND_BIT, op.isAndBit()); + bs.set(MATCH, op.isMatch()); + bs.set(NOT, op.isNot()); final byte len = (byte) (Integer.numberOfTrailingZeros(length) << LENGTH_SHIFT); - buffer.writeByte(bs.toByteArray()[0] | len); + buffer.writeByte(bs.toByte() | len); } @Override @@ -562,12 +546,12 @@ public class FSNlriParser implements NlriParser, NlriSerializer { } private static NumericOperand parseNumeric(final byte op) { - final BitSet bs = BitSet.valueOf(new long[] {UnsignedBytes.toInt(op)}); + final BitArray bs = BitArray.valueOf(op); return new NumericOperand(bs.get(AND_BIT), bs.get(END_OF_LIST), bs.get(EQUAL), bs.get(GREATER_THAN), bs.get(LESS_THAN)); } private static BitmaskOperand parseBitmask(final byte op) { - final BitSet bs = BitSet.valueOf(new long[] {UnsignedBytes.toInt(op)}); + final BitArray bs = BitArray.valueOf(op); return new BitmaskOperand(bs.get(AND_BIT), bs.get(END_OF_LIST), bs.get(MATCH), bs.get(NOT)); } @@ -577,24 +561,16 @@ public class FSNlriParser implements NlriParser, NlriSerializer { } private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.flowspec.rev150114.Fragment parseFragment(final byte fragment) { - final BitSet bs = BitSet.valueOf(new long[] {UnsignedBytes.toInt(fragment)}); + final BitArray bs = BitArray.valueOf(fragment); return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.flowspec.rev150114.Fragment(bs.get(DONT_FRAGMENT), bs.get(FIRST_FRAGMENT), bs.get(IS_A_FRAGMENT), bs.get(LAST_FRAGMENT)); } private static byte serializeFragment(final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.flowspec.rev150114.Fragment fragment) { - final BitSet bs = new BitSet(Byte.SIZE); - if (fragment.isDoNot() != null) { - bs.set(DONT_FRAGMENT, fragment.isDoNot()); - } - if (fragment.isFirst() != null) { - bs.set(FIRST_FRAGMENT, fragment.isFirst()); - } - if (fragment.isIsA() != null) { - bs.set(IS_A_FRAGMENT, fragment.isIsA()); - } - if (fragment.isLast() != null) { - bs.set(LAST_FRAGMENT, fragment.isLast()); - } - return bs.toByteArray()[0]; + final BitArray bs = new BitArray(Byte.SIZE); + bs.set(DONT_FRAGMENT, fragment.isDoNot()); + bs.set(FIRST_FRAGMENT, fragment.isFirst()); + bs.set(IS_A_FRAGMENT, fragment.isIsA()); + bs.set(LAST_FRAGMENT, fragment.isLast()); + return bs.toByte(); } } diff --git a/bgp/flowspec/src/test/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParserTest.java b/bgp/flowspec/src/test/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParserTest.java index fb7e7e9c26..56f6390a25 100644 --- a/bgp/flowspec/src/test/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParserTest.java +++ b/bgp/flowspec/src/test/java/org/opendaylight/protocol/bgp/flowspec/FSNlriParserTest.java @@ -95,7 +95,7 @@ public class FSNlriParserTest { 0x09, 0x12, 04, 01, (byte)0x91, 0x56, (byte) 0xb1, 0x0a, (byte)0x96, (byte) 0xde, (byte) 0xad, 0x0b, (byte)0x86, 0x2a, - 0x0c, (byte)0x81, (byte)0xf0}; + 0x0c, (byte)0x81, (byte)0x0f}; @Test public void testParseLength() { diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java index e10b832b93..04eb63de45 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java @@ -15,11 +15,11 @@ import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.util.ArrayList; import java.util.Arrays; -import java.util.BitSet; import java.util.List; import java.util.Map.Entry; import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrLinkAttributesParser; import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.protocol.util.Ipv6Util; @@ -58,8 +58,10 @@ public final class LinkAttributesParser { private static final int BANDWIDTH_LENGTH = 4; // MPLS protection mask bits - private static final int LDP_BIT = 7; - private static final int RSVP_BIT = 6; + private static final int FLAGS_SIZE = 8; + + private static final int LDP_BIT = 0; + private static final int RSVP_BIT = 1; /* Link Attribute TLVs */ private static final int REMOTE_IPV4_ROUTER_ID = 1030; @@ -147,7 +149,7 @@ public final class LinkAttributesParser { LOG.debug("Parsed Link Protection Type {}", lpt); break; case MPLS_PROTOCOL: - final BitSet bits = BitSet.valueOf(ByteArray.readAllBytes(value)); + final BitArray bits = BitArray.valueOf(value, FLAGS_SIZE); builder.setMplsProtocol(new MplsProtocolMask(bits.get(LDP_BIT), bits.get(RSVP_BIT))); LOG.debug("Parsed MPLS Protocols: {}", builder.getMplsProtocol()); break; @@ -255,14 +257,10 @@ public final class LinkAttributesParser { private static void serializeMplsProtocolMask(final MplsProtocolMask mplsProtocolMask, final ByteBuf byteAggregator ) { if (mplsProtocolMask != null) { final ByteBuf mplsProtocolMaskBuf = Unpooled.buffer(1); - final BitSet mask = new BitSet(Byte.SIZE); - if (mplsProtocolMask.isLdp() != null) { - mask.set(LDP_BIT, mplsProtocolMask.isLdp()); - } - if (mplsProtocolMask.isRsvpte() != null) { - mask.set(RSVP_BIT, mplsProtocolMask.isRsvpte()); - } - mplsProtocolMaskBuf.writeBytes(mask.toByteArray()); + final BitArray mask = new BitArray(FLAGS_SIZE); + mask.set(LDP_BIT, mplsProtocolMask.isLdp()); + mask.set(RSVP_BIT, mplsProtocolMask.isRsvpte()); + mask.toByteBuf(mplsProtocolMaskBuf); TlvUtil.writeTLV(MPLS_PROTOCOL, mplsProtocolMaskBuf, byteAggregator); } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/NodeAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/NodeAttributesParser.java index 841cc46a6c..f2e15c6713 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/NodeAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/NodeAttributesParser.java @@ -14,11 +14,11 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.util.ArrayList; -import java.util.BitSet; import java.util.List; import java.util.Map.Entry; import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrNodeAttributesParser; import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.protocol.util.Ipv6Util; @@ -47,11 +47,13 @@ public final class NodeAttributesParser { throw new UnsupportedOperationException(); } + private static final int FLAGS_SIZE = 8; + // node flag bits - private static final int OVERLOAD_BIT = 7; - private static final int ATTACHED_BIT = 6; - private static final int EXTERNAL_BIT = 5; - private static final int ABBR_BIT = 4; + private static final int OVERLOAD_BIT = 0; + private static final int ATTACHED_BIT = 1; + private static final int EXTERNAL_BIT = 2; + private static final int ABBR_BIT = 3; /* Node Attribute TLVs */ private static final int NODE_FLAG_BITS = 1024; @@ -87,7 +89,7 @@ public final class NodeAttributesParser { } break; case NODE_FLAG_BITS: - final BitSet flags = BitSet.valueOf(ByteArray.readAllBytes(value)); + final BitArray flags = BitArray.valueOf(value, FLAGS_SIZE); builder.setNodeFlags(new NodeFlagBits(flags.get(OVERLOAD_BIT), flags.get(ATTACHED_BIT), flags.get(EXTERNAL_BIT), flags.get(ABBR_BIT))); LOG.debug("Parsed Overload bit: {}, attached bit: {}, external bit: {}, area border router: {}.", flags.get(OVERLOAD_BIT), flags.get(ATTACHED_BIT), flags.get(EXTERNAL_BIT), flags.get(ABBR_BIT)); @@ -189,20 +191,12 @@ public final class NodeAttributesParser { private static void serializeNodeFlagBits(final NodeFlagBits nodeFlagBits, final ByteBuf byteAggregator) { if (nodeFlagBits != null) { final ByteBuf nodeFlagBuf = Unpooled.buffer(1); - final BitSet flags = new BitSet(Byte.SIZE); - if (nodeFlagBits.isOverload() != null) { - flags.set(OVERLOAD_BIT, nodeFlagBits.isOverload()); - } - if (nodeFlagBits.isAttached() != null) { - flags.set(ATTACHED_BIT, nodeFlagBits.isAttached()); - } - if (nodeFlagBits.isExternal() != null) { - flags.set(EXTERNAL_BIT, nodeFlagBits.isExternal()); - } - if (nodeFlagBits.isAbr() != null) { - flags.set(ABBR_BIT, nodeFlagBits.isAbr()); - } - nodeFlagBuf.writeBytes(flags.toByteArray()); + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(OVERLOAD_BIT, nodeFlagBits.isOverload()); + flags.set(ATTACHED_BIT, nodeFlagBits.isAttached()); + flags.set(EXTERNAL_BIT, nodeFlagBits.isExternal()); + flags.set(ABBR_BIT, nodeFlagBits.isAbr()); + flags.toByteBuf(nodeFlagBuf); TlvUtil.writeTLV(NODE_FLAG_BITS, nodeFlagBuf, byteAggregator); } } diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java index 34045a441e..2297c9483a 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java @@ -13,11 +13,11 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; import java.util.ArrayList; -import java.util.BitSet; import java.util.List; import java.util.Map.Entry; import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser; import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.protocol.util.Ipv6Util; @@ -47,7 +47,9 @@ public final class PrefixAttributesParser { private static final int ROUTE_TAG_LENGTH = 4; private static final int EXTENDED_ROUTE_TAG_LENGTH = 8; - private static final int UP_DOWN_BIT = 7; + + private static final int FLAGS_SIZE = 8; + private static final int UP_DOWN_BIT = 0; /* Prefix Attribute TLVs */ private static final int IGP_FLAGS = 1152; @@ -76,7 +78,7 @@ public final class PrefixAttributesParser { LOG.trace("Prefix attribute TLV {}", key); switch (key) { case IGP_FLAGS: - final BitSet flags = BitSet.valueOf(ByteArray.readAllBytes(value)); + final BitArray flags = BitArray.valueOf(value, FLAGS_SIZE); final boolean upDownBit = flags.get(UP_DOWN_BIT); builder.setIgpBits(new IgpBitsBuilder().setUpDown(new UpDown(upDownBit)).build()); LOG.debug("Parsed IGP flag (up/down bit) : {}", upDownBit); @@ -141,12 +143,9 @@ public final class PrefixAttributesParser { static void serializePrefixAttributes(final PrefixAttributesCase prefixAttributesCase, final ByteBuf byteAggregator) { final PrefixAttributes prefixAtrributes = prefixAttributesCase.getPrefixAttributes(); if (prefixAtrributes.getIgpBits() != null) { - final BitSet igpBit = new BitSet(); - final Boolean bit = prefixAtrributes.getIgpBits().getUpDown().isUpDown(); - if (bit != null) { - igpBit.set(UP_DOWN_BIT, bit); - } - TlvUtil.writeTLV(IGP_FLAGS, Unpooled.wrappedBuffer(igpBit.toByteArray()), byteAggregator); + final BitArray igpBit = new BitArray(FLAGS_SIZE); + igpBit.set(UP_DOWN_BIT, prefixAtrributes.getIgpBits().getUpDown().isUpDown()); + TlvUtil.writeTLV(IGP_FLAGS, Unpooled.wrappedBuffer(igpBit.array()), byteAggregator); } if (prefixAtrributes.getRouteTags() != null) { final ByteBuf routeTagsBuf = Unpooled.buffer(); diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java index 5b010432b3..18845e5d4b 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java @@ -9,7 +9,7 @@ package org.opendaylight.protocol.bgp.linkstate.attribute.sr; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdBuilder; @@ -25,12 +25,12 @@ public final class SrLinkAttributesParser { private static final int ISO_SYSTEM_ID_SIZE = 6; /* Adj-SID flags */ - private static final int ADDRESS_FAMILY_FLAG = 7; - private static final int BACKUP_FLAG = 6; - private static final int VALUE_FLAG = 5; - private static final int LOCAL_FLAG = 4; - private static final int SET_FLAG = 3; - private static final int FLAGS_SIZE = 1; + private static final int ADDRESS_FAMILY_FLAG = 0; + private static final int BACKUP_FLAG = 1; + private static final int VALUE_FLAG = 2; + private static final int LOCAL_FLAG = 3; + private static final int SET_FLAG = 4; + private static final int FLAGS_SIZE = 8; private SrLinkAttributesParser() { throw new UnsupportedOperationException(); @@ -41,7 +41,7 @@ public final class SrLinkAttributesParser { return new SrAdjIdBuilder().build(); } final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder(); - final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); srAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG))); srAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte())); srAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer))); @@ -51,23 +51,13 @@ public final class SrLinkAttributesParser { public static ByteBuf serializeAdjacencySegmentIdentifier(final SrAdjId srAdjId) { final ByteBuf value = Unpooled.buffer(); final AdjacencyFlags srAdjIdFlags = srAdjId.getFlags(); - final BitSet flags = new BitSet(FLAGS_SIZE); - if (srAdjIdFlags.isAddressFamily() != null) { - flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily()); - } - if (srAdjIdFlags.isBackup() != null) { - flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup()); - } - if (srAdjIdFlags.isValue() != null) { - flags.set(VALUE_FLAG, srAdjIdFlags.isValue()); - } - if (srAdjIdFlags.isLocal() != null) { - flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal()); - } - if (srAdjIdFlags.isSetFlag() != null) { - flags.set(SET_FLAG, srAdjIdFlags.isSetFlag()); - } - value.writeBytes(flags.toByteArray()); + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily()); + flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup()); + flags.set(VALUE_FLAG, srAdjIdFlags.isValue()); + flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal()); + flags.set(SET_FLAG, srAdjIdFlags.isSetFlag()); + flags.toByteBuf(value); value.writeByte(srAdjId.getWeight().getValue()); value.writeBytes(srAdjId.getSid().getValue()); return value; @@ -78,7 +68,7 @@ public final class SrLinkAttributesParser { return new SrLanAdjIdBuilder().build(); } final SrLanAdjIdBuilder srLanAdjIdBuilder = new SrLanAdjIdBuilder(); - final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); srLanAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG))); srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte())); srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE))); @@ -89,23 +79,13 @@ public final class SrLinkAttributesParser { public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) { final ByteBuf value = Unpooled.buffer(); final AdjacencyFlags srAdjIdFlags = srLanAdjId.getFlags(); - final BitSet flags = new BitSet(FLAGS_SIZE); - if (srAdjIdFlags.isAddressFamily() != null) { - flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily()); - } - if (srAdjIdFlags.isBackup() != null) { - flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup()); - } - if (srAdjIdFlags.isValue() != null) { - flags.set(VALUE_FLAG, srAdjIdFlags.isValue()); - } - if (srAdjIdFlags.isLocal() != null) { - flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal()); - } - if (srAdjIdFlags.isSetFlag() != null) { - flags.set(SET_FLAG, srAdjIdFlags.isSetFlag()); - } - value.writeBytes(flags.toByteArray()); + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily()); + flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup()); + flags.set(VALUE_FLAG, srAdjIdFlags.isValue()); + flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal()); + flags.set(SET_FLAG, srAdjIdFlags.isSetFlag()); + flags.toByteBuf(value); value.writeByte(srLanAdjId.getWeight().getValue()); value.writeBytes(srLanAdjId.getIsoSystemId().getValue()); value.writeBytes(srLanAdjId.getSid().getValue()); diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrNodeAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrNodeAttributesParser.java index d776aaadf9..f9da528897 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrNodeAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrNodeAttributesParser.java @@ -10,9 +10,9 @@ package org.opendaylight.protocol.bgp.linkstate.attribute.sr; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.util.ArrayList; -import java.util.BitSet; import java.util.List; import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.ByteBufWriteUtil; import org.opendaylight.protocol.util.Ipv4Util; @@ -61,15 +61,15 @@ public final class SrNodeAttributesParser { throw new UnsupportedOperationException(); } - private static final int FLAGS_SIZE = 1; + private static final int FLAGS_SIZE = 8; /* SR Capabilities flags */ - private static final int IPV4 = 7; - private static final int IPV6 = 6; + private static final int IPV4 = 0; + private static final int IPV6 = 1; /* SID Label flags */ - private static final int AFI = 7; - private static final int MIRROR = 6; + private static final int AFI = 0; + private static final int MIRROR = 1; /* SID Label Tlv types */ private static final int SID_TLV_TYPE = 1; @@ -150,7 +150,7 @@ public final class SrNodeAttributesParser { public static SrSidLabel parseSidLabelBinding(final ByteBuf buffer) { final SrSidLabelBuilder builder = new SrSidLabelBuilder(); - final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); builder.setSidLabelFlags(new SidLabelFlags(flags.get(AFI), flags.get(MIRROR))); builder.setWeight(new Weight(buffer.readUnsignedByte())); builder.setValueRange(buffer.readUnsignedShort()); @@ -223,14 +223,10 @@ public final class SrNodeAttributesParser { public static void serializeSidLabelBinding(final SrSidLabel binding, final ByteBuf buffer) { final SidLabelFlags flags = binding.getSidLabelFlags(); - final BitSet bs = new BitSet(FLAGS_SIZE); - if (flags.isAddressFamily() != null) { - bs.set(AFI, flags.isAddressFamily()); - } - if (flags.isMirrorContext() != null) { - bs.set(MIRROR, flags.isMirrorContext()); - } - buffer.writeBytes(bs.toByteArray()); + final BitArray bs = new BitArray(FLAGS_SIZE); + bs.set(AFI, flags.isAddressFamily()); + bs.set(MIRROR, flags.isMirrorContext()); + bs.toByteBuf(buffer); buffer.writeByte(binding.getWeight().getValue()); buffer.writeShort(binding.getValueRange()); final IpPrefix prefix = binding.getFecPrefix(); @@ -246,7 +242,7 @@ public final class SrNodeAttributesParser { public static SrCapabilities parseSrCapabilities(final ByteBuf buffer) { final SrCapabilitiesBuilder builder = new SrCapabilitiesBuilder(); - final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); builder.setFlags(new Flags(flags.get(IPV4), flags.get(IPV6))); builder.setValueRange((long)buffer.readUnsignedMedium()); buffer.skipBytes(2); @@ -256,14 +252,10 @@ public final class SrNodeAttributesParser { public static void serializeSrCapabilities(final SrCapabilities caps, final ByteBuf buffer) { final Flags flags = caps.getFlags(); - final BitSet bs = new BitSet(FLAGS_SIZE); - if (flags.isIpv4() != null) { - bs.set(IPV4, flags.isIpv4()); - } - if (flags.isIpv6() != null) { - bs.set(IPV6, flags.isIpv6()); - } - buffer.writeBytes(bs.toByteArray()); + final BitArray bs = new BitArray(FLAGS_SIZE); + bs.set(IPV4, flags.isIpv4()); + bs.set(IPV6, flags.isIpv6()); + bs.toByteBuf(buffer); buffer.writeMedium(caps.getValueRange().intValue()); buffer.writeByte(SID_TLV_TYPE); final byte[] sid = caps.getSid().getValue(); diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java index 1614cc129b..a28db5df0d 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java @@ -8,7 +8,7 @@ package org.opendaylight.protocol.bgp.linkstate.attribute.sr; import io.netty.buffer.ByteBuf; -import java.util.BitSet; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefixBuilder; @@ -18,22 +18,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segm public final class SrPrefixAttributesParser { - private static final int FLAGS_SIZE = 1; + private static final int FLAGS_SIZE = 8; private SrPrefixAttributesParser() { throw new UnsupportedOperationException(); } /* Flags */ - private static final int RE_ADVERTISEMENT = 7; - private static final int NODE_SID = 6; - private static final int NO_PHP = 5; - private static final int EXPLICIT_NULL = 4; - private static final int VALUE = 3; - private static final int LOCAL = 2; + private static final int RE_ADVERTISEMENT = 0; + private static final int NODE_SID = 1; + private static final int NO_PHP = 2; + private static final int EXPLICIT_NULL = 3; + private static final int VALUE = 4; + private static final int LOCAL = 5; public static SrPrefix parseSrPrefix(final ByteBuf buffer) { - final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); final SrPrefixBuilder builder = new SrPrefixBuilder(); builder.setFlags(new Flags(flags.get(EXPLICIT_NULL), flags.get(LOCAL), flags.get(NO_PHP), flags.get(NODE_SID), flags.get(RE_ADVERTISEMENT), flags.get(VALUE))); builder.setAlgorithm(Algorithm.forValue(buffer.readUnsignedByte())); @@ -43,26 +43,14 @@ public final class SrPrefixAttributesParser { public static void serializeSrPrefix(final SrPrefix srPrefix, final ByteBuf buffer) { final Flags flags = srPrefix.getFlags(); - final BitSet bs = new BitSet(FLAGS_SIZE); - if (flags.isReadvertisement() != null) { - bs.set(RE_ADVERTISEMENT, flags.isReadvertisement()); - } - if (flags.isNodeSid() != null) { - bs.set(NODE_SID, flags.isNodeSid()); - } - if (flags.isNoPhp() != null) { - bs.set(NO_PHP, flags.isNoPhp()); - } - if (flags.isExplicitNull() != null) { - bs.set(EXPLICIT_NULL, flags.isExplicitNull()); - } - if (flags.isValue() != null) { - bs.set(VALUE, flags.isValue()); - } - if (flags.isLocal() != null) { - bs.set(LOCAL, flags.isLocal()); - } - buffer.writeBytes(bs.toByteArray()); + final BitArray bs = new BitArray(FLAGS_SIZE); + bs.set(RE_ADVERTISEMENT, flags.isReadvertisement()); + bs.set(NODE_SID, flags.isNodeSid()); + bs.set(NO_PHP, flags.isNoPhp()); + bs.set(EXPLICIT_NULL, flags.isExplicitNull()); + bs.set(VALUE, flags.isValue()); + bs.set(LOCAL, flags.isLocal()); + bs.toByteBuf(buffer); buffer.writeByte(srPrefix.getAlgorithm().getIntValue()); buffer.writeBytes(srPrefix.getSid().getValue()); } diff --git a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java index ad53046645..f6c4c669ca 100644 --- a/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java +++ b/bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleAttributeRegistry.java @@ -22,7 +22,7 @@ import org.opendaylight.protocol.bgp.parser.spi.AttributeRegistry; import org.opendaylight.protocol.bgp.parser.spi.AttributeSerializer; import org.opendaylight.protocol.concepts.AbstractRegistration; import org.opendaylight.protocol.concepts.HandlerRegistry; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.Values; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributes; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.update.PathAttributesBuilder; @@ -76,16 +76,16 @@ final class SimpleAttributeRegistry implements AttributeRegistry { } private void addAttribute(final ByteBuf buffer, final Map attributes) throws BGPDocumentedException { - final boolean[] flags = ByteArray.parseBits(buffer.readByte()); + final BitArray flags = BitArray.valueOf(buffer.readByte()); final int type = buffer.readUnsignedByte(); - final int len = (flags[EXTENDED_LENGTH_BIT]) ? buffer.readUnsignedShort() : buffer.readUnsignedByte(); + final int len = (flags.get(EXTENDED_LENGTH_BIT)) ? buffer.readUnsignedShort() : buffer.readUnsignedByte(); if (!attributes.containsKey(type)) { final AttributeParser parser = this.handlers.getParser(type); if (parser == null) { - if (!flags[OPTIONAL_BIT]) { + if (!flags.get(OPTIONAL_BIT)) { throw new BGPDocumentedException("Well known attribute not recognized.", BGPError.WELL_KNOWN_ATTR_NOT_RECOGNIZED); } - if (flags[TRANSITIVE_BIT]) { + if (flags.get(TRANSITIVE_BIT)) { // FIXME: transitive attributes need to be preserved LOG.warn("Losing unrecognized transitive attribute {}. Some data might be missing from the output.", type); } else { diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java index cbdb9815b2..bd55317c29 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java @@ -13,13 +13,12 @@ import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspObjectParser; import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvRegistry; import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus; @@ -35,7 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ */ public class CInitiated00LspObjectParser extends Stateful07LspObjectParser { - private static final int CREATE_FLAG_OFFSET = 8; + private static final int CREATE_FLAG_OFFSET = 4; public CInitiated00LspObjectParser(final TlvRegistry tlvReg, final VendorInformationTlvRegistry viTlvReg) { super(tlvReg, viTlvReg); @@ -48,17 +47,17 @@ public class CInitiated00LspObjectParser extends Stateful07LspObjectParser { builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); final int[] plspIdRaw = new int[] { bytes.readUnsignedByte(), bytes.readUnsignedByte(), bytes.getUnsignedByte(2), }; - builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << TWELVE_BITS_SHIFT) | (plspIdRaw[1] << FOUR_BITS_SHIFT) | (plspIdRaw[2] >> FOUR_BITS_SHIFT)))); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, 2)); - builder.setDelegate(flags.get(DELEGATE_FLAG_OFFSET)); - builder.setSync(flags.get(SYNC_FLAG_OFFSET)); - builder.setRemove(flags.get(REMOVE_FLAG_OFFSET)); - builder.setAdministrative(flags.get(ADMINISTRATIVE_FLAG_OFFSET)); + builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << FLAGS_SIZE) | (plspIdRaw[1] << FOUR_BITS_SHIFT) | (plspIdRaw[2] >> FOUR_BITS_SHIFT)))); + final BitArray flags = BitArray.valueOf(bytes, FLAGS_SIZE); + builder.setDelegate(flags.get(DELEGATE)); + builder.setSync(flags.get(SYNC)); + builder.setRemove(flags.get(REMOVE)); + builder.setAdministrative(flags.get(ADMINISTRATIVE)); builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(flags.get(CREATE_FLAG_OFFSET)).build()); short s = 0; - s |= flags.get(OPERATIONAL_OFFSET + 2) ? 1 : 0; - s |= (flags.get(OPERATIONAL_OFFSET + 1) ? 1 : 0) << 1; - s |= (flags.get(OPERATIONAL_OFFSET) ? 1 : 0) << 2; + s |= flags.get(OPERATIONAL + 2) ? 1 : 0; + s |= (flags.get(OPERATIONAL + 1) ? 1 : 0) << 1; + s |= (flags.get(OPERATIONAL) ? 1 : 0) << 2; builder.setOperational(OperationalStatus.forValue(s)); final TlvsBuilder b = new TlvsBuilder(); parseTlvs(b, bytes.slice()); @@ -73,20 +72,12 @@ public class CInitiated00LspObjectParser extends Stateful07LspObjectParser { final ByteBuf body = Unpooled.buffer(); Preconditions.checkArgument(specObj.getPlspId() != null, "PLSP-ID not present"); writeMedium(specObj.getPlspId().getValue().intValue() << FOUR_BITS_SHIFT, body); - final BitSet flags = new BitSet(2 * Byte.SIZE); - if (specObj.isDelegate() != null) { - flags.set(DELEGATE_FLAG_OFFSET, specObj.isDelegate()); - } - if (specObj.isRemove() != null) { - flags.set(REMOVE_FLAG_OFFSET, specObj.isRemove()); - } - if (specObj.isSync() != null) { - flags.set(SYNC_FLAG_OFFSET, specObj.isSync()); - } - if (specObj.isAdministrative() != null) { - flags.set(ADMINISTRATIVE_FLAG_OFFSET, specObj.isAdministrative()); - } - if (specObj.getAugmentation(Lsp1.class) != null && specObj.getAugmentation(Lsp1.class).isCreate() != null) { + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(DELEGATE, specObj.isDelegate()); + flags.set(REMOVE, specObj.isRemove()); + flags.set(SYNC, specObj.isSync()); + flags.set(ADMINISTRATIVE, specObj.isAdministrative()); + if (specObj.getAugmentation(Lsp1.class) != null) { flags.set(CREATE_FLAG_OFFSET, specObj.getAugmentation(Lsp1.class).isCreate()); } byte op = 0; @@ -94,7 +85,9 @@ public class CInitiated00LspObjectParser extends Stateful07LspObjectParser { op = UnsignedBytes.checkedCast(specObj.getOperational().getIntValue()); op = (byte) (op << FOUR_BITS_SHIFT); } - body.writeByte(ByteArray.bitSetToBytes(flags, 2)[1] | op); + final byte[] res = flags.array(); + res[res.length -1] = (byte) (res[res.length -1] | op); + body.writeByte(res[res.length -1]); serializeTlvs(specObj.getTlvs(), body); ObjectUtil.formatSubobject(TYPE, CLASS, object.isProcessingRule(), object.isIgnore(), body, buffer); } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java index f0bca39e42..42c726fa93 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java @@ -7,19 +7,17 @@ */ package org.opendaylight.protocol.pcep.ietf.initiated00; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; 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 java.util.BitSet; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07SrpObjectParser; import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvRegistry; import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber; @@ -50,7 +48,7 @@ public class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser { final SrpBuilder builder = new SrpBuilder(); builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_SIZE)); + final BitArray flags = BitArray.valueOf(bytes, FLAGS_SIZE); builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(flags.get(REMOVE_FLAG)).build()); builder.setOperationId(new SrpIdNumber(bytes.readUnsignedInt())); final TlvsBuilder tlvsBuilder = new TlvsBuilder(); @@ -64,11 +62,11 @@ public class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser { Preconditions.checkArgument(object instanceof Srp, "Wrong instance of PCEPObject. Passed %s. Needed SrpObject.", object.getClass()); final Srp srp = (Srp) object; final ByteBuf body = Unpooled.buffer(); - final BitSet flags = new BitSet(FLAGS_SIZE * Byte.SIZE); - if (srp.getAugmentation(Srp1.class) != null && srp.getAugmentation(Srp1.class).isRemove()) { + final BitArray flags = new BitArray(FLAGS_SIZE); + if (srp.getAugmentation(Srp1.class) != null) { flags.set(REMOVE_FLAG, srp.getAugmentation(Srp1.class).isRemove()); } - writeBitSet(flags, FLAGS_SIZE, body); + flags.toByteBuf(body); Preconditions.checkArgument(srp.getOperationId() != null, "OperationId is mandatory."); writeUnsignedInt(srp.getOperationId().getValue(), body); serializeTlvs(srp.getTlvs(), body); diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00StatefulCapabilityTlvParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00StatefulCapabilityTlvParser.java index 27ce9f9bd3..493b9e7bd3 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00StatefulCapabilityTlvParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00StatefulCapabilityTlvParser.java @@ -7,16 +7,13 @@ */ package org.opendaylight.protocol.pcep.ietf.initiated00; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; - import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07StatefulCapabilityTlvParser; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvUtil; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Stateful1Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.Stateful; @@ -35,15 +32,13 @@ public final class CInitiated00StatefulCapabilityTlvParser extends Stateful07Sta if (buffer == null) { return null; } - if (buffer.readableBytes() < FLAGS_F_LENGTH) { + if (buffer.readableBytes() < FLAGS_F_LENGTH / Byte.SIZE) { throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >= " - + FLAGS_F_LENGTH + "."); + + FLAGS_F_LENGTH / Byte.SIZE + "."); } - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_F_LENGTH)); - + final BitArray flags = BitArray.valueOf(buffer, FLAGS_F_LENGTH); final StatefulBuilder sb = new StatefulBuilder(); sb.setLspUpdateCapability(flags.get(U_FLAG_OFFSET)); - if (flags.get(I_FLAG_OFFSET)) { sb.addAugmentation(Stateful1.class, new Stateful1Builder().setInitiation(Boolean.TRUE).build()); } @@ -54,16 +49,12 @@ public final class CInitiated00StatefulCapabilityTlvParser extends Stateful07Sta public void serializeTlv(final Tlv tlv, final ByteBuf buffer) { Preconditions.checkArgument(tlv instanceof Stateful, "StatefulCapabilityTlv is mandatory."); final Stateful sct = (Stateful) tlv; - final ByteBuf body = Unpooled.buffer(); - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); + final BitArray flags = new BitArray(FLAGS_F_LENGTH); final Stateful1 sfi = sct.getAugmentation(Stateful1.class); if (sfi != null) { flags.set(I_FLAG_OFFSET, sfi.isInitiation()); } - if (sct.isLspUpdateCapability() != null) { - flags.set(U_FLAG_OFFSET, sct.isLspUpdateCapability()); - } - writeBitSet(flags, FLAGS_F_LENGTH, body); - TlvUtil.formatTlv(TYPE, body, buffer); + flags.set(U_FLAG_OFFSET, sct.isLspUpdateCapability()); + TlvUtil.formatTlv(TYPE, Unpooled.wrappedBuffer(flags.array()), buffer); } } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java index c4a3ab5638..824659286f 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java @@ -13,14 +13,13 @@ import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import java.util.List; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvRegistry; import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.error.code.tlv.LspErrorCode; @@ -46,26 +45,17 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser> FOUR_BITS_SHIFT)))); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, 2)); - builder.setDelegate(flags.get(DELEGATE_FLAG_OFFSET)); - builder.setSync(flags.get(SYNC_FLAG_OFFSET)); - builder.setRemove(flags.get(REMOVE_FLAG_OFFSET)); - builder.setAdministrative(flags.get(ADMINISTRATIVE_FLAG_OFFSET)); + builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << FLAGS_SIZE) | (plspIdRaw[1] << FOUR_BITS_SHIFT) | (plspIdRaw[2] >> FOUR_BITS_SHIFT)))); + final BitArray flags = BitArray.valueOf(bytes, FLAGS_SIZE); + builder.setDelegate(flags.get(DELEGATE)); + builder.setSync(flags.get(SYNC)); + builder.setRemove(flags.get(REMOVE)); + builder.setAdministrative(flags.get(ADMINISTRATIVE)); short s = 0; - s |= flags.get(OPERATIONAL_OFFSET + 2) ? 1 : 0; - s |= (flags.get(OPERATIONAL_OFFSET + 1) ? 1 : 0) << 1; - s |= (flags.get(OPERATIONAL_OFFSET) ? 1 : 0) << 2; + s |= flags.get(OPERATIONAL + 2) ? 1 : 0; + s |= (flags.get(OPERATIONAL + 1) ? 1 : 0) << 1; + s |= (flags.get(OPERATIONAL) ? 1 : 0) << 2; builder.setOperational(OperationalStatus.forValue(s)); final TlvsBuilder b = new TlvsBuilder(); parseTlvs(b, bytes.slice()); @@ -117,25 +107,19 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser= " - + FLAGS_F_LENGTH + "."); + + FLAGS_F_LENGTH / Byte.SIZE + "."); } - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_F_LENGTH)); - + final BitArray flags = BitArray.valueOf(buffer, FLAGS_F_LENGTH); final StatefulBuilder sb = new StatefulBuilder(); sb.setLspUpdateCapability(flags.get(U_FLAG_OFFSET)); return sb.build(); @@ -53,12 +49,8 @@ public class Stateful07StatefulCapabilityTlvParser implements TlvParser, TlvSeri public void serializeTlv(final Tlv tlv, final ByteBuf buffer) { Preconditions.checkArgument(tlv instanceof Stateful, "StatefulCapabilityTlv is mandatory."); final Stateful sct = (Stateful) tlv; - final ByteBuf body = Unpooled.buffer(); - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - if (sct.isLspUpdateCapability() != null) { - flags.set(U_FLAG_OFFSET, sct.isLspUpdateCapability()); - } - writeBitSet(flags, FLAGS_F_LENGTH, body); - TlvUtil.formatTlv(TYPE, body, buffer); + final BitArray flags = new BitArray(FLAGS_F_LENGTH); + flags.set(U_FLAG_OFFSET, sct.isLspUpdateCapability()); + TlvUtil.formatTlv(TYPE, Unpooled.wrappedBuffer(flags.array()), buffer); } } diff --git a/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java b/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java index ce4d9f56d6..0abe24da5b 100644 --- a/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java +++ b/pcep/ietf-stateful07/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java @@ -230,7 +230,7 @@ public class PCEPObjectParserTest { /* pst-tlv */ 0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0 }; final CInitiated00SrpObjectParser parser = new CInitiated00SrpObjectParser(this.tlvRegistry, this.viTlvRegistry); - SrpBuilder builder = new SrpBuilder(); + final SrpBuilder builder = new SrpBuilder(); builder.setProcessingRule(false); builder.setIgnore(false); builder.setOperationId(new SrpIdNumber(1L)); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java index 020a0afe4e..6975d56d77 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java @@ -7,21 +7,19 @@ */ package org.opendaylight.protocol.pcep.impl.object; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; 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 java.util.BitSet; import java.util.List; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvRegistry; import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa; @@ -43,7 +41,7 @@ public class PCEPLspaObjectParser extends AbstractObjectWithTlvsParser requestIDs = Lists.newArrayList(); while (bytes.isReadable()) { @@ -93,17 +91,11 @@ public class PCEPSvecObjectParser implements ObjectParser, ObjectSerializer { final Svec svecObj = (Svec) object; final ByteBuf body = Unpooled.buffer(); body.writeZero(FLAGS_F_OFFSET); - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - if (svecObj.isLinkDiverse() != null) { - flags.set(L_FLAG_OFFSET, svecObj.isLinkDiverse()); - } - if (svecObj.isNodeDiverse() != null) { - flags.set(N_FLAG_OFFSET, svecObj.isNodeDiverse()); - } - if (svecObj.isSrlgDiverse() != null) { - flags.set(S_FLAG_OFFSET, svecObj.isSrlgDiverse()); - } - writeBitSet(flags, FLAGS_F_LENGTH, body); + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(L_FLAG_OFFSET, svecObj.isLinkDiverse()); + flags.set(N_FLAG_OFFSET, svecObj.isNodeDiverse()); + flags.set(S_FLAG_OFFSET, svecObj.isSrlgDiverse()); + flags.toByteBuf(body); final List requestIDs = svecObj.getRequestsIds(); assert !(requestIDs.isEmpty()) : "Empty Svec Object - no request ids."; diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/EROLabelSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/EROLabelSubobjectParser.java index f6344ec633..b772daf5da 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/EROLabelSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/EROLabelSubobjectParser.java @@ -10,13 +10,12 @@ package org.opendaylight.protocol.pcep.impl.subobject; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.EROSubobjectParser; import org.opendaylight.protocol.pcep.spi.EROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.EROSubobjectUtil; import org.opendaylight.protocol.pcep.spi.LabelRegistry; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.basic.explicit.route.subobjects.subobject.type.LabelCase; @@ -29,13 +28,11 @@ public class EROLabelSubobjectParser implements EROSubobjectParser, EROSubobject public static final int TYPE = 3; - private static final int RES_F_LENGTH = 1; + private static final int FLAGS_SIZE = 8; private static final int C_TYPE_F_LENGTH = 1; - private static final int RES_F_OFFSET = 0; - - private static final int C_TYPE_F_OFFSET = RES_F_OFFSET + RES_F_LENGTH; + private static final int C_TYPE_F_OFFSET = FLAGS_SIZE / Byte.SIZE; private static final int HEADER_LENGTH = C_TYPE_F_OFFSET + C_TYPE_F_LENGTH; @@ -54,7 +51,7 @@ public class EROLabelSubobjectParser implements EROSubobjectParser, EROSubobject throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >" + HEADER_LENGTH + "."); } - final BitSet reserved = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, RES_F_LENGTH)); + final BitArray reserved = BitArray.valueOf(buffer, FLAGS_SIZE); final short cType = buffer.readUnsignedByte(); final LabelType labelType = this.registry.parseLabel(cType, buffer.slice()); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv4PrefixSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv4PrefixSubobjectParser.java index 0e0788cf08..85ecd63e08 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv4PrefixSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv4PrefixSubobjectParser.java @@ -7,17 +7,16 @@ */ package org.opendaylight.protocol.pcep.impl.subobject; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv4Prefix; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectParser; import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.RROSubobjectUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; @@ -36,11 +35,11 @@ public class RROIpv4PrefixSubobjectParser implements RROSubobjectParser, RROSubo public static final int TYPE = 1; private static final int PREFIX_F_LENGTH = 1; - private static final int FLAGS_F_LENGTH = 1; + private static final int FLAGS_SIZE = 8; private static final int PREFIX4_F_OFFSET = 0 + Ipv4Util.IP4_LENGTH; - private static final int CONTENT4_LENGTH = Ipv4Util.IP4_LENGTH + PREFIX_F_LENGTH + FLAGS_F_LENGTH; + private static final int CONTENT4_LENGTH = Ipv4Util.IP4_LENGTH + PREFIX_F_LENGTH + FLAGS_SIZE / Byte.SIZE; private static final int LPA_F_OFFSET = 7; private static final int LPIU_F_OFFSET = 6; @@ -56,7 +55,7 @@ public class RROIpv4PrefixSubobjectParser implements RROSubobjectParser, RROSubo final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.ip.prefix._case.IpPrefix prefix = new IpPrefixBuilder().setIpPrefix( new IpPrefix(Ipv4Util.prefixForBytes(ByteArray.readBytes(buffer, Ipv4Util.IP4_LENGTH), length))).build(); buffer.skipBytes(PREFIX_F_LENGTH); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_F_LENGTH)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); builder.setProtectionAvailable(flags.get(LPA_F_OFFSET)); builder.setProtectionInUse(flags.get(LPIU_F_OFFSET)); builder.setSubobjectType(new IpPrefixCaseBuilder().setIpPrefix(prefix).build()); @@ -72,17 +71,13 @@ public class RROIpv4PrefixSubobjectParser implements RROSubobjectParser, RROSubo if (prefix.getIpv6Prefix() != null) { new RROIpv6PrefixSubobjectParser().serializeSubobject(subobject, buffer); } else { - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - if (subobject.isProtectionAvailable() != null) { - flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); - } - if (subobject.isProtectionInUse() != null) { - flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); - } + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); + flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); final ByteBuf body = Unpooled.buffer(CONTENT4_LENGTH); Preconditions.checkArgument(prefix.getIpv4Prefix() != null, "Ipv4Prefix is mandatory."); writeIpv4Prefix(prefix.getIpv4Prefix(), body); - writeBitSet(flags, FLAGS_F_LENGTH, body); + flags.toByteBuf(body); RROSubobjectUtil.formatSubobject(TYPE, body, buffer); } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv6PrefixSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv6PrefixSubobjectParser.java index edd17c9683..b39d22f1f7 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv6PrefixSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROIpv6PrefixSubobjectParser.java @@ -7,17 +7,16 @@ */ package org.opendaylight.protocol.pcep.impl.subobject; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv6Prefix; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectParser; import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.RROSubobjectUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.protocol.util.Ipv6Util; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; @@ -36,11 +35,11 @@ public class RROIpv6PrefixSubobjectParser implements RROSubobjectParser, RROSubo public static final int TYPE = 2; private static final int PREFIX_F_LENGTH = 1; - private static final int FLAGS_F_LENGTH = 1; + private static final int FLAGS_SIZE = 8; private static final int PREFIX_F_OFFSET = Ipv6Util.IPV6_LENGTH; - private static final int CONTENT_LENGTH = Ipv6Util.IPV6_LENGTH + PREFIX_F_LENGTH + FLAGS_F_LENGTH; + private static final int CONTENT_LENGTH = Ipv6Util.IPV6_LENGTH + PREFIX_F_LENGTH + FLAGS_SIZE / Byte.SIZE; private static final int LPA_F_OFFSET = 7; private static final int LPIU_F_OFFSET = 6; @@ -56,7 +55,7 @@ public class RROIpv6PrefixSubobjectParser implements RROSubobjectParser, RROSubo final IpPrefixBuilder prefix = new IpPrefixBuilder().setIpPrefix(new IpPrefix(Ipv6Util.prefixForBytes(ByteArray.readBytes(buffer, Ipv6Util.IPV6_LENGTH), length))); buffer.skipBytes(PREFIX_F_LENGTH); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_F_LENGTH)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); builder.setProtectionAvailable(flags.get(LPA_F_OFFSET)); builder.setProtectionInUse(flags.get(LPIU_F_OFFSET)); builder.setSubobjectType(new IpPrefixCaseBuilder().setIpPrefix(prefix.build()).build()); @@ -68,17 +67,13 @@ public class RROIpv6PrefixSubobjectParser implements RROSubobjectParser, RROSubo Preconditions.checkArgument(subobject.getSubobjectType() instanceof IpPrefixCase, "Unknown subobject instance. Passed %s. Needed IpPrefixCase.", subobject.getSubobjectType().getClass()); final IpPrefixSubobject specObj = ((IpPrefixCase) subobject.getSubobjectType()).getIpPrefix(); final IpPrefix prefix = specObj.getIpPrefix(); - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - if (subobject.isProtectionAvailable() != null) { - flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); - } - if (subobject.isProtectionInUse() != null) { - flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); - } + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); + flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); final ByteBuf body = Unpooled.buffer(CONTENT_LENGTH); Preconditions.checkArgument(prefix.getIpv6Prefix() != null, "Ipv6Prefix is mandatory."); writeIpv6Prefix(prefix.getIpv6Prefix(), body); - writeBitSet(flags, FLAGS_F_LENGTH, body); + flags.toByteBuf(body); RROSubobjectUtil.formatSubobject(TYPE, body, buffer); } } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROLabelSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROLabelSubobjectParser.java index 2187fe5cc3..b7da1446b7 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROLabelSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROLabelSubobjectParser.java @@ -10,13 +10,12 @@ package org.opendaylight.protocol.pcep.impl.subobject; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.LabelRegistry; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectParser; import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.RROSubobjectUtil; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.Subobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.label.subobject.LabelType; @@ -29,13 +28,11 @@ public class RROLabelSubobjectParser implements RROSubobjectParser, RROSubobject public static final int TYPE = 3; - public static final int RES_F_LENGTH = 1; + public static final int FLAGS_SIZE = 8; public static final int C_TYPE_F_LENGTH = 1; - public static final int RES_F_OFFSET = 0; - - public static final int C_TYPE_F_OFFSET = RES_F_OFFSET + RES_F_LENGTH; + public static final int C_TYPE_F_OFFSET = FLAGS_SIZE / Byte.SIZE; public static final int HEADER_LENGTH = C_TYPE_F_OFFSET + C_TYPE_F_LENGTH; @@ -55,7 +52,7 @@ public class RROLabelSubobjectParser implements RROSubobjectParser, RROSubobject throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >" + HEADER_LENGTH + "."); } - final BitSet reserved = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, RES_F_LENGTH)); + final BitArray reserved = BitArray.valueOf(buffer, FLAGS_SIZE); final short cType = buffer.readUnsignedByte(); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROUnnumberedInterfaceSubobjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROUnnumberedInterfaceSubobjectParser.java index 0730629607..18b5471fb4 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROUnnumberedInterfaceSubobjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/subobject/RROUnnumberedInterfaceSubobjectParser.java @@ -7,18 +7,16 @@ */ package org.opendaylight.protocol.pcep.impl.subobject; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; 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 java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectParser; import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.RROSubobjectUtil; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.Subobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.UnnumberedSubobject; @@ -33,7 +31,7 @@ public class RROUnnumberedInterfaceSubobjectParser implements RROSubobjectParser public static final int TYPE = 4; - private static final int FLAGS_F_LENGTH = 1; + private static final int FLAGS_SIZE = 8; private static final int RESERVED = 1; private static final int CONTENT_LENGTH = 10; @@ -49,7 +47,7 @@ public class RROUnnumberedInterfaceSubobjectParser implements RROSubobjectParser + CONTENT_LENGTH + "."); } final SubobjectBuilder builder = new SubobjectBuilder(); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(buffer, FLAGS_F_LENGTH)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); builder.setProtectionAvailable(flags.get(LPA_F_OFFSET)); builder.setProtectionInUse(flags.get(LPIU_F_OFFSET)); final UnnumberedBuilder ubuilder = new UnnumberedBuilder(); @@ -64,15 +62,11 @@ public class RROUnnumberedInterfaceSubobjectParser implements RROSubobjectParser 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 BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - if (subobject.isProtectionAvailable() != null) { - flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); - } - if (subobject.isProtectionInUse() != null) { - flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); - } + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(LPA_F_OFFSET, subobject.isProtectionAvailable()); + flags.set(LPIU_F_OFFSET, subobject.isProtectionInUse()); final ByteBuf body = Unpooled.buffer(CONTENT_LENGTH); - writeBitSet(flags, FLAGS_F_LENGTH, body); + flags.toByteBuf(body); body.writeZero(RESERVED); Preconditions.checkArgument(specObj.getRouterId() != null, "RouterId is mandatory."); writeUnsignedInt(specObj.getRouterId(), body); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/NoPathVectorTlvParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/NoPathVectorTlvParser.java index 84ad0f116e..f8822f8efb 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/NoPathVectorTlvParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/tlv/NoPathVectorTlvParser.java @@ -10,13 +10,11 @@ package org.opendaylight.protocol.pcep.impl.tlv; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.TlvParser; import org.opendaylight.protocol.pcep.spi.TlvSerializer; import org.opendaylight.protocol.pcep.spi.TlvUtil; -import org.opendaylight.protocol.util.ByteArray; -import org.opendaylight.protocol.util.ByteBufWriteUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.NoPathVectorTlv.Flags; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.tlvs.NoPathVector; @@ -29,7 +27,7 @@ public class NoPathVectorTlvParser implements TlvParser, TlvSerializer { public static final int TYPE = 1; - private static final int FLAGS_F_LENGTH = 4; + private static final int FLAGS_SIZE = 32; private static final int REACHABLITY_PROBLEM = 24; private static final int NO_GCO_SOLUTION = 25; @@ -45,11 +43,11 @@ public class NoPathVectorTlvParser implements TlvParser, TlvSerializer { if (buffer == null) { return null; } - if (buffer.readableBytes() != FLAGS_F_LENGTH) { + if (buffer.readableBytes() != FLAGS_SIZE / Byte.SIZE) { throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + "; Expected: >=" - + FLAGS_F_LENGTH + "."); + + FLAGS_SIZE / Byte.SIZE + "."); } - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readAllBytes(buffer)); + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); return new NoPathVectorBuilder().setFlags( new Flags(flags.get(CHAIN_UNAVAILABLE), flags.get(NO_GCO_MIGRATION_PATH), flags.get(NO_GCO_SOLUTION), flags.get(REACHABLITY_PROBLEM), flags.get(PATH_KEY), flags.get(PCE_UNAVAILABLE), flags.get(UNKNOWN_DEST), flags.get(UNKNOWN_SRC))).build(); } @@ -59,33 +57,17 @@ public class NoPathVectorTlvParser implements TlvParser, TlvSerializer { Preconditions.checkArgument(tlv instanceof NoPathVector, "NoPathVectorTlv is mandatory."); final NoPathVector noPath = (NoPathVector) tlv; final ByteBuf body = Unpooled.buffer(); - final BitSet flags = new BitSet(FLAGS_F_LENGTH * Byte.SIZE); - Flags f = noPath.getFlags(); - if (f.isP2mpUnreachable() != null) { - flags.set(REACHABLITY_PROBLEM, f.isP2mpUnreachable()); - } - if (f.isNoGcoSolution() != null) { - flags.set(NO_GCO_SOLUTION, f.isNoGcoSolution()); - } - if (f.isNoGcoMigration() != null) { - flags.set(NO_GCO_MIGRATION_PATH, f.isNoGcoMigration()); - } - if (f.isPathKey() != null) { - flags.set(PATH_KEY, f.isPathKey()); - } - if (f.isChainUnavailable() != null) { - flags.set(CHAIN_UNAVAILABLE, f.isChainUnavailable()); - } - if (f.isUnknownSource() != null) { - flags.set(UNKNOWN_SRC, f.isUnknownSource()); - } - if (f.isUnknownDestination() != null) { - flags.set(UNKNOWN_DEST, f.isUnknownDestination()); - } - if (f.isPceUnavailable() != null) { - flags.set(PCE_UNAVAILABLE, f.isPceUnavailable()); - } - ByteBufWriteUtil.writeBitSet(flags, FLAGS_F_LENGTH, body); + final BitArray flags = new BitArray(FLAGS_SIZE); + final Flags f = noPath.getFlags(); + flags.set(REACHABLITY_PROBLEM, f.isP2mpUnreachable()); + flags.set(NO_GCO_SOLUTION, f.isNoGcoSolution()); + flags.set(NO_GCO_MIGRATION_PATH, f.isNoGcoMigration()); + flags.set(PATH_KEY, f.isPathKey()); + flags.set(CHAIN_UNAVAILABLE, f.isChainUnavailable()); + flags.set(UNKNOWN_SRC, f.isUnknownSource()); + flags.set(UNKNOWN_DEST, f.isUnknownDestination()); + flags.set(PCE_UNAVAILABLE, f.isPceUnavailable()); + flags.toByteBuf(body); TlvUtil.formatTlv(TYPE, body, buffer); } } diff --git a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrEroSubobjectParser.java b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrEroSubobjectParser.java index c124e7e649..717d865d0d 100644 --- a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrEroSubobjectParser.java +++ b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrEroSubobjectParser.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.protocol.pcep.segment.routing; import static org.opendaylight.protocol.pcep.segment.routing.SrSubobjectParserUtil.BITSET_LENGTH; @@ -13,11 +12,11 @@ import static org.opendaylight.protocol.pcep.segment.routing.SrSubobjectParserUt import com.google.common.base.Function; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.EROSubobjectParser; import org.opendaylight.protocol.pcep.spi.EROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.EROSubobjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.SrEroSubobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.SrSubobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.add.lsp.input.arguments.ero.subobject.subobject.type.SrEroTypeBuilder; @@ -45,19 +44,14 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer if (srEroSubobject.isMFlag() != null && srEroSubobject.isMFlag() && srEroSubobject.getSid() != null) { builder.setSid(srEroSubobject.getSid() << MPLS_LABEL_OFFSET); } - - final BitSet bits = new BitSet(BITSET_LENGTH); - if (srEroSubobject.isMFlag() != null) { - bits.set(M_FLAG_POSITION, srEroSubobject.isMFlag()); - } - if (srEroSubobject.isCFlags() != null) { - bits.set(C_FLAG_POSITION, srEroSubobject.isCFlags()); - } + final BitArray bits = new BitArray(BITSET_LENGTH); + bits.set(M_FLAG_POSITION, srEroSubobject.isMFlag()); + bits.set(C_FLAG_POSITION, srEroSubobject.isCFlags()); if (srEroSubobject.getSid() == null) { - bits.set(S_FLAG_POSITION); + bits.set(S_FLAG_POSITION, Boolean.TRUE); } if (srEroSubobject.getNai() == null) { - bits.set(F_FLAG_POSITION); + bits.set(F_FLAG_POSITION, Boolean.TRUE); } final ByteBuf body = SrSubobjectParserUtil.serializeSrSubobject(builder.build(), bits); EROSubobjectUtil.formatSubobject(TYPE, subobject.isLoose(), body, buffer); @@ -70,11 +64,10 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer if (buffer.readableBytes() <= SrSubobjectParserUtil.MINIMAL_LENGTH) { throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + ";"); } - - final BitSet flags = new BitSet(BITSET_LENGTH); - final SrSubobject srSubobject = SrSubobjectParserUtil.parseSrSubobject(buffer, new Function() { + final BitArray flags = new BitArray(BITSET_LENGTH); + final SrSubobject srSubobject = SrSubobjectParserUtil.parseSrSubobject(buffer, new Function() { @Override - public Void apply(final BitSet input) { + public Void apply(final BitArray input) { flags.set(C_FLAG_POSITION, input.get(C_FLAG_POSITION)); flags.set(M_FLAG_POSITION, input.get(M_FLAG_POSITION)); return null; @@ -86,7 +79,6 @@ public class SrEroSubobjectParser implements EROSubobjectParser, EROSubobjectSer if (srEroSubobjectBuilder.isMFlag() != null && srEroSubobjectBuilder.isMFlag() && srEroSubobjectBuilder.getSid() != null) { srEroSubobjectBuilder.setSid(srEroSubobjectBuilder.getSid() >> MPLS_LABEL_OFFSET); } - final SubobjectBuilder subobjectBuilder = new SubobjectBuilder(); subobjectBuilder.setLoose(loose); subobjectBuilder.setSubobjectType(srEroSubobjectBuilder.build()); diff --git a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrRroSubobjectParser.java b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrRroSubobjectParser.java index 8496698b50..eae3b391e2 100644 --- a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrRroSubobjectParser.java +++ b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrRroSubobjectParser.java @@ -14,11 +14,11 @@ import static org.opendaylight.protocol.pcep.segment.routing.SrSubobjectParserUt import com.google.common.base.Function; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectParser; import org.opendaylight.protocol.pcep.spi.RROSubobjectSerializer; import org.opendaylight.protocol.pcep.spi.RROSubobjectUtil; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.SrRroSubobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.SrSubobject; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.segment.routing.rev150112.add.lsp.input.arguments.rro.subobject.subobject.type.SrRroTypeBuilder; @@ -39,12 +39,12 @@ public class SrRroSubobjectParser implements RROSubobjectParser, RROSubobjectSer .getClass()); final SrRroSubobject srRroSubobject = (SrRroSubobject) subobject.getSubobjectType(); - final BitSet bits = new BitSet(BITSET_LENGTH); + final BitArray bits = new BitArray(BITSET_LENGTH); if (srRroSubobject.getSid() == null) { - bits.set(S_FLAG_POSITION); + bits.set(S_FLAG_POSITION, Boolean.TRUE); } if (srRroSubobject.getNai() == null) { - bits.set(F_FLAG_POSITION); + bits.set(F_FLAG_POSITION, Boolean.TRUE); } final ByteBuf body = SrSubobjectParserUtil.serializeSrSubobject(srRroSubobject, bits); RROSubobjectUtil.formatSubobject(TYPE, body, buffer); @@ -58,9 +58,9 @@ public class SrRroSubobjectParser implements RROSubobjectParser, RROSubobjectSer throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + buffer.readableBytes() + ";"); } - final SrSubobject srSubobject = SrSubobjectParserUtil.parseSrSubobject(buffer, new Function() { + final SrSubobject srSubobject = SrSubobjectParserUtil.parseSrSubobject(buffer, new Function() { @Override - public Void apply(final BitSet input) { + public Void apply(final BitArray input) { return null; } }, F_FLAG_POSITION, S_FLAG_POSITION); diff --git a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrSubobjectParserUtil.java b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrSubobjectParserUtil.java index da03eecaff..df604152e3 100644 --- a/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrSubobjectParserUtil.java +++ b/pcep/segment-routing/src/main/java/org/opendaylight/protocol/pcep/segment/routing/SrSubobjectParserUtil.java @@ -5,10 +5,8 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.protocol.pcep.segment.routing; -import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeBitSet; import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv4Address; import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeIpv6Address; import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedByte; @@ -18,9 +16,8 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteBufWriteUtil; import org.opendaylight.protocol.util.Ipv4Util; import org.opendaylight.protocol.util.Ipv6Util; @@ -42,20 +39,18 @@ final class SrSubobjectParserUtil { public static final int MINIMAL_LENGTH = 4; public static final int BITSET_LENGTH = 8; - private static final int FLAGS_OFFSET = 1; private static final int SID_TYPE_BITS_OFFSET = 4; private SrSubobjectParserUtil() { throw new UnsupportedOperationException(); } - public static ByteBuf serializeSrSubobject(final SrSubobject srSubobject, final BitSet bits) { + public static ByteBuf serializeSrSubobject(final SrSubobject srSubobject, final BitArray bits) { Preconditions.checkArgument(srSubobject.getNai() != null || srSubobject.getSid() != null, "Both SID and NAI are absent in SR subobject."); final ByteBuf body = Unpooled.buffer(MINIMAL_LENGTH); writeUnsignedByte((short)(srSubobject.getSidType().getIntValue() << SID_TYPE_BITS_OFFSET), body); - - writeBitSet(bits, FLAGS_OFFSET, body); + bits.toByteBuf(body); if (srSubobject.getSid() != null) { writeUnsignedInt(srSubobject.getSid(), body); @@ -91,12 +86,12 @@ final class SrSubobjectParserUtil { return body; } - public static SrSubobject parseSrSubobject(final ByteBuf buffer, final Function getFlags, final int fPosition, final int sPosition) + public static SrSubobject parseSrSubobject(final ByteBuf buffer, final Function getFlags, final int fPosition, final int sPosition) throws PCEPDeserializerException { final int sidTypeByte = buffer.readByte() >> SID_TYPE_BITS_OFFSET; final SidType sidType = SidType.forValue(sidTypeByte); - final BitSet bitSet = ByteArray.bytesToBitSet(new byte[] { buffer.readByte() }); + final BitArray bitSet = BitArray.valueOf(buffer.readByte()); getFlags.apply(bitSet); final boolean f = bitSet.get(fPosition); final boolean s = bitSet.get(sPosition); diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java index 93d548cd05..e4929b2aa7 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java @@ -13,10 +13,10 @@ import com.google.common.primitives.UnsignedBytes; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.Arrays; -import java.util.BitSet; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; +import org.opendaylight.protocol.util.BitArray; import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder; @@ -37,17 +37,15 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer private static final int COMMON_OBJECT_HEADER_LENGTH = 4; private static final int OT_SF_LENGTH = 4; - private static final int FLAGS_SF_LENGTH = 4; /* * offsets of fields inside of multi-field in bits */ private static final int OT_SF_OFFSET = 0; - private static final int FLAGS_SF_OFFSET = OT_SF_OFFSET + OT_SF_LENGTH; /* * flags offsets inside multi-filed */ - private static final int P_FLAG_OFFSET = 6; - private static final int I_FLAG_OFFSET = 7; + private static final int PROCESSED = 6; + private static final int IGNORED = 7; private final ObjectRegistry registry; private final VendorInformationObjectRegistry viRegistry; @@ -85,10 +83,8 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer final int objClass = bytes.readUnsignedByte(); final byte flagsByte = bytes.readByte(); + final BitArray flags = BitArray.valueOf(flagsByte); final int objType = UnsignedBytes.toInt(ByteArray.copyBitsRange(flagsByte, OT_SF_OFFSET, OT_SF_LENGTH)); - final byte[] flagsBytes = { ByteArray.copyBitsRange(flagsByte, FLAGS_SF_OFFSET, FLAGS_SF_LENGTH) }; - final BitSet flags = ByteArray.bytesToBitSet(flagsBytes); - final int objLength = bytes.readUnsignedShort(); if (bytes.readableBytes() < objLength - COMMON_OBJECT_HEADER_LENGTH) { @@ -98,7 +94,7 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer // copy bytes for deeper parsing final ByteBuf bytesToPass = bytes.readSlice(objLength - COMMON_OBJECT_HEADER_LENGTH); - final ObjectHeader header = new ObjectHeaderImpl(flags.get(P_FLAG_OFFSET), flags.get(I_FLAG_OFFSET)); + final ObjectHeader header = new ObjectHeaderImpl(flags.get(PROCESSED), flags.get(IGNORED)); if (VendorInformationUtil.isVendorInformationObject(objClass, objType)) { Preconditions.checkState(this.viRegistry != null); diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/LabelUtil.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/LabelUtil.java index ec9a33a1e5..1144a8b22f 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/LabelUtil.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/LabelUtil.java @@ -8,30 +8,24 @@ package org.opendaylight.protocol.pcep.spi; import io.netty.buffer.ByteBuf; -import java.util.BitSet; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; public final class LabelUtil { - private static final int RES_F_LENGTH = 1; + private static final int FLAGS_SIZE = 8; - private static final int U_FLAG_OFFSET = 0; - - private static final int G_FLAG_OFFSET = 7; + private static final int UNIDIRECTIONAL = 0; + private static final int GLOBAL = 7; private LabelUtil() { throw new UnsupportedOperationException(); } public static void formatLabel(final int type, final Boolean unidirectional, final Boolean global, final ByteBuf body, final ByteBuf buffer) { - final BitSet reserved = new BitSet(RES_F_LENGTH * Byte.SIZE); - if (unidirectional != null) { - reserved.set(U_FLAG_OFFSET, unidirectional); - } - if (global != null) { - reserved.set(G_FLAG_OFFSET, global); - } - buffer.writeBytes(ByteArray.bitSetToBytes(reserved, RES_F_LENGTH)); + final BitArray reserved = new BitArray(FLAGS_SIZE); + reserved.set(UNIDIRECTIONAL, unidirectional); + reserved.set(GLOBAL, global); + reserved.toByteBuf(buffer); buffer.writeByte(type); buffer.writeBytes(body); } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectUtil.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectUtil.java index f96b9ad714..86f6779422 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectUtil.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectUtil.java @@ -8,19 +8,18 @@ package org.opendaylight.protocol.pcep.spi; import io.netty.buffer.ByteBuf; -import java.util.BitSet; -import org.opendaylight.protocol.util.ByteArray; +import org.opendaylight.protocol.util.BitArray; public final class ObjectUtil { private static final int HEADER_SIZE = 4; - private static final int OT_SF_LENGTH = 4; + private static final int FLAGS_SIZE = 4; /* * flags offsets inside multi-field */ - private static final int P_FLAG_OFFSET = 6; - private static final int I_FLAG_OFFSET = 7; + private static final int PROCESSED = 2; + private static final int IGNORED = 3; private ObjectUtil() { throw new UnsupportedOperationException(); @@ -29,15 +28,11 @@ public final class ObjectUtil { public static void formatSubobject(final int objectType, final int objectClass, final Boolean processingRule, final Boolean ignore, final ByteBuf body, final ByteBuf out) { out.writeByte(objectClass); - BitSet flags = new BitSet(Byte.SIZE); - if (ignore != null) { - flags.set(I_FLAG_OFFSET, ignore); - } - if (processingRule != null) { - flags.set(P_FLAG_OFFSET, processingRule); - } - byte[] flagB = ByteArray.bitSetToBytes(flags, 1); - int typeByte = objectType << OT_SF_LENGTH | flagB[0]; + final BitArray flags = new BitArray(FLAGS_SIZE); + flags.set(IGNORED, ignore); + flags.set(PROCESSED, processingRule); + final byte flagB = flags.toByte(); + final int typeByte = objectType << FLAGS_SIZE | flagB; out.writeByte(typeByte); out.writeShort(body.writerIndex() + HEADER_SIZE); out.writeBytes(body); -- 2.36.6