X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=bgp%2Flinkstate%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fprotocol%2Fbgp%2Flinkstate%2Fattribute%2FLinkAttributesParser.java;h=04eb63de455df428769940a040c23458a7c03781;hb=e4f0738f33ad5a5203434fe52b9949a38b458f7d;hp=ee9d727557b8a1dd17abd855cde8a1c168628d07;hpb=7d4a0cf411b9a9f98d866da6928e6ae9b86fc89e;p=bgpcep.git 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 ee9d727557..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 @@ -7,6 +7,7 @@ */ package org.opendaylight.protocol.bgp.linkstate.attribute; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; import com.google.common.collect.Multimap; import io.netty.buffer.ByteBuf; @@ -14,10 +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.TlvUtil; +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; @@ -26,6 +28,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.link import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.Ipv6RouterIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.LinkProtectionType; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.MplsProtocolMask; +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.SrLanAdjId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidth; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidthBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.LinkStateAttribute; @@ -40,17 +44,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class LinkAttributesParser { +@VisibleForTesting +public final class LinkAttributesParser { private static final Logger LOG = LoggerFactory.getLogger(LinkAttributesParser.class); + private LinkAttributesParser() { + throw new UnsupportedOperationException(); + } + private static final int UNRESERVED_BW_COUNT = 8; 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; @@ -66,6 +77,8 @@ final class LinkAttributesParser { private static final int SHARED_RISK_LINK_GROUP = 1096; private static final int LINK_OPAQUE = 1097; private static final int LINK_NAME = 1098; + private static final int SR_ADJ_ID = 1099; + private static final int SR_LAN_ADJ_ID = 1100; /** * Parse Link Attributes. @@ -136,7 +149,7 @@ 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; @@ -161,6 +174,14 @@ final class LinkAttributesParser { builder.setLinkName(name); LOG.debug("Parsed Link Name : {}", name); break; + case SR_ADJ_ID: + final SrAdjId srAdjId = SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value); + builder.setSrAdjId(srAdjId); + LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjId); + case SR_LAN_ADJ_ID: + final SrLanAdjId srLanAdjId = SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(value); + builder.setSrLanAdjId(srLanAdjId); + LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjId); default: LOG.warn("TLV {} is not a valid link attribute, ignoring it", key); } @@ -195,7 +216,7 @@ final class LinkAttributesParser { } // this sub-TLV contains eight 32-bit IEEE floating point numbers final List ubList = linkAttributes.getUnreservedBandwidth(); - if (ubList != null && !ubList.isEmpty()) { + if (ubList != null) { final ByteBuf unreservedBandwithBuf = Unpooled.buffer(); for (final UnreservedBandwidth unreservedBandwidth : ubList) { unreservedBandwithBuf.writeBytes(unreservedBandwidth.getBandwidth().getValue()); @@ -214,7 +235,7 @@ final class LinkAttributesParser { TlvUtil.writeTLV(METRIC, Unpooled.copyMedium(linkAttributes.getMetric().getValue().intValue()), byteAggregator); } final List srlgList = linkAttributes.getSharedRiskLinkGroups(); - if (srlgList != null && !srlgList.isEmpty()) { + if (srlgList != null) { final ByteBuf sharedRLGBuf = Unpooled.buffer(); for (final SrlgId srlgId : srlgList) { sharedRLGBuf.writeInt(srlgId.getValue().intValue()); @@ -224,20 +245,22 @@ final class LinkAttributesParser { if (linkAttributes.getLinkName() != null) { TlvUtil.writeTLV(LINK_NAME, Unpooled.wrappedBuffer(Charsets.UTF_8.encode(linkAttributes.getLinkName())), byteAggregator); } + if (linkAttributes.getSrAdjId() != null) { + TlvUtil.writeTLV(SR_ADJ_ID, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getSrAdjId()), byteAggregator); + } + if (linkAttributes.getSrLanAdjId() != null) { + TlvUtil.writeTLV(SR_LAN_ADJ_ID, SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(linkAttributes.getSrLanAdjId()), byteAggregator); + } LOG.trace("Finished serializing Link Attributes"); } 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); } }