From b6cb7fde17e267b8fc4126663e0e76f8fa724b24 Mon Sep 17 00:00:00 2001 From: Ladislav Borak Date: Tue, 17 Feb 2015 12:22:37 +0100 Subject: [PATCH] Bug 608 - implemented parsers/serializers - for Adjacency Segment Identifier, Lan Adjacency Segment Identifier Conflicts: bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java Change-Id: I18bfb03fb9392076fceae99e33205746f000d33a Signed-off-by: Ladislav Borak --- .../attribute/LinkAttributesParser.java | 19 +++ .../attribute/sr/SrLinkAttributesParser.java | 110 ++++++++++++++++++ .../bgp/linkstate/SrAttributeParserTest.java | 28 +++++ 3 files changed, 157 insertions(+) create mode 100644 bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java 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 64a57ab7c1..0f74986d90 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 @@ -17,6 +17,7 @@ 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.ByteArray; import org.opendaylight.protocol.util.Ipv4Util; @@ -26,6 +27,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; @@ -66,6 +69,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. @@ -161,6 +166,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); } @@ -224,6 +237,12 @@ 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"); } 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 new file mode 100644 index 0000000000..68bd7d33da --- /dev/null +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * 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.bgp.linkstate.attribute.sr; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.util.BitSet; +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; +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.SrLanAdjIdBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencyFlags; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.Weight; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier; + +public class SrLinkAttributesParser { + + private static final int ISO_SYSTEM_ID_SIZE = 6; + + /* Adj-SID flags */ + private static int ADDRESS_FAMILY_FLAG = 7; + private static int BACKUP_FLAG = 6; + private static int VALUE_FLAG = 5; + private static int LOCAL_FLAG = 4; + private static int SET_FLAG = 3; + private static final int FLAGS_SIZE = 1; + + public static SrAdjId parseAdjacencySegmentIdentifier(final ByteBuf buffer) { + if (!buffer.isReadable()) { + return new SrAdjIdBuilder().build(); + } + final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder(); + final BitSet flags = BitSet.valueOf(ByteArray.readBytes(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))); + return srAdjIdBuilder.build(); + } + + 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()); + value.writeByte(srAdjId.getWeight().getValue()); + value.writeBytes(srAdjId.getSid().getValue()); + return value; + } + + public static SrLanAdjId parseLanAdjacencySegmentIdentifier(final ByteBuf buffer) { + if (!buffer.isReadable()) { + return new SrLanAdjIdBuilder().build(); + } + final SrLanAdjIdBuilder srLanAdjIdBuilder = new SrLanAdjIdBuilder(); + final BitSet flags = BitSet.valueOf(ByteArray.readBytes(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))); + srLanAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer))); + return srLanAdjIdBuilder.build(); + } + + 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()); + value.writeByte(srLanAdjId.getWeight().getValue()); + value.writeBytes(srLanAdjId.getIsoSystemId().getValue()); + value.writeBytes(srLanAdjId.getSid().getValue()); + return value; + } +} diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java index a8eeabe568..afa3ce2be0 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.Test; +import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrLinkAttributesParser; import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrNodeAttributesParser; import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser; import org.opendaylight.protocol.util.ByteArray; @@ -25,6 +26,10 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix; +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; +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.SrLanAdjIdBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrAlgorithm; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrAlgorithmBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrCapabilities; @@ -33,6 +38,7 @@ 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.node.state.SrSidLabelBuilder; 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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencyFlags; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.Algorithm; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabelBinding.SidLabelFlags; @@ -44,6 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segm import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ip4EroCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.SidLabelCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.UnnumberedEroCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.TeMetric; public class SrAttributeParserTest { @@ -109,4 +116,25 @@ public class SrAttributeParserTest { SrPrefixAttributesParser.serializeSrPrefix(p, b); assertArrayEquals(bytes, ByteArray.readAllBytes(b)); } + + @Test + public void testSrAdjId() { + final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; + final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; + final SrAdjId srAdjId = new SrAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short) 10)).setSid(new SidLabel(sidLabel)).build(); + final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId); + assertEquals(srAdjId, SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested))); + assertArrayEquals(tested, ByteArray.readAllBytes(serializedData)); + } + + @Test + public void testSrLanAdjId() { + final byte[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; + final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 }; + final byte[] systemId = { 1, 2, 3, 4, 5, 6 }; + final SrLanAdjId srLanAdjId = new SrLanAdjIdBuilder().setFlags(new AdjacencyFlags(Boolean.TRUE, Boolean.FALSE, Boolean.TRUE, Boolean.FALSE, Boolean.TRUE)).setWeight(new Weight((short)10)).setIsoSystemId(new IsoSystemIdentifier(systemId)).setSid(new SidLabel(sidLabel)).build(); + final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId); + assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested))); + assertArrayEquals(tested, ByteArray.readAllBytes(serializedData)); + } } -- 2.36.6