From: Iveta Halanova Date: Fri, 26 Jun 2015 09:31:41 +0000 (+0200) Subject: Bug-2848: BGP-LS EPE extension: Peer Sid X-Git-Tag: release/beryllium~271 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=9a5562999af86bf7d10cc489e1e266b9d18724ac;p=bgpcep.git Bug-2848: BGP-LS EPE extension: Peer Sid Parsering/serializing for Peer-SID, Peer-Set-SID Added parsering/serializing of type and length of (Lan)AdjacencySegmentIdentifier Change-Id: I56b4c2c131c205fa727f4261fc9cd06d4b39dd63 Signed-off-by: Iveta Halanova --- 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 1bffae012f..df551647aa 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 @@ -28,7 +28,12 @@ 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.PeerSetSid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSetSidBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.PeerSidBuilder; 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.UnreservedBandwidth; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.UnreservedBandwidthBuilder; @@ -79,6 +84,8 @@ public final class LinkAttributesParser { private static final int LINK_NAME = 1098; private static final int SR_ADJ_ID = 1099; private static final int SR_LAN_ADJ_ID = 1100; + private static final int PEER_SID_CODE = 1036; + private static final int PEER_SET_SID_CODE = 1037; /** * Parse Link Attributes. @@ -175,7 +182,7 @@ public final class LinkAttributesParser { LOG.debug("Parsed Link Name : {}", name); break; case SR_ADJ_ID: - final SrAdjId srAdjId = SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value); + final SrAdjId srAdjId = new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build(); builder.setSrAdjId(srAdjId); LOG.debug("Parsed Adjacency Segment Identifier :{}", srAdjId); break; @@ -184,6 +191,16 @@ public final class LinkAttributesParser { builder.setSrLanAdjId(srLanAdjId); LOG.debug("Parsed Adjacency Segment Identifier :{}", srLanAdjId); break; + case PEER_SID_CODE: + final PeerSid peerSid = new PeerSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build(); + builder.setPeerSid(peerSid); + LOG.debug("Parsed Peer Segment Identifier :{}", peerSid); + break; + case PEER_SET_SID_CODE: + final PeerSetSid peerSetSid = new PeerSetSidBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(value)).build(); + builder.setPeerSetSid(peerSetSid); + LOG.debug("Parsed Peer Set Sid :{}", peerSetSid); + break; default: LOG.warn("TLV {} is not a valid link attribute, ignoring it", key); } @@ -253,6 +270,12 @@ public final class LinkAttributesParser { if (linkAttributes.getSrLanAdjId() != null) { TlvUtil.writeTLV(SR_LAN_ADJ_ID, SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(linkAttributes.getSrLanAdjId()), byteAggregator); } + if (linkAttributes.getPeerSid() != null) { + TlvUtil.writeTLV(PEER_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSid()), byteAggregator); + } + if (linkAttributes.getPeerSetSid() != null) { + TlvUtil.writeTLV(PEER_SET_SID_CODE, SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(linkAttributes.getPeerSetSid()), 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 index 18845e5d4b..955fe6205c 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,18 +9,22 @@ package org.opendaylight.protocol.bgp.linkstate.attribute.sr; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil; 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; 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.AdjacencySegmentIdentifier; 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; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public final class SrLinkAttributesParser { + private static final Logger LOG = LoggerFactory.getLogger(SrLinkAttributesParser.class); private static final int ISO_SYSTEM_ID_SIZE = 6; @@ -31,24 +35,51 @@ public final class SrLinkAttributesParser { private static final int LOCAL_FLAG = 3; private static final int SET_FLAG = 4; private static final int FLAGS_SIZE = 8; + private static final int SID_TYPE = 1; private SrLinkAttributesParser() { throw new UnsupportedOperationException(); } - public static SrAdjId parseAdjacencySegmentIdentifier(final ByteBuf buffer) { - if (!buffer.isReadable()) { - return new SrAdjIdBuilder().build(); + public static AdjacencySegmentIdentifier parseAdjacencySegmentIdentifier(final ByteBuf buffer) { + final AdjacencyFlags adjFlags; + final Weight weight; + final SidLabel sidValue; + if (buffer.isReadable()) { + final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE); + adjFlags = new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)); + weight = new Weight(buffer.readUnsignedByte()); + sidValue = parseSidSubTlv(buffer); + } else { + adjFlags = null; + weight = null; + sidValue = null; } - final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder(); - 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))); - return srAdjIdBuilder.build(); + return new AdjacencySegmentIdentifier() { + + @Override + public Class getImplementedInterface() { + return AdjacencySegmentIdentifier.class; + } + + @Override + public Weight getWeight() { + return weight; + } + + @Override + public SidLabel getSid() { + return sidValue; + } + + @Override + public AdjacencyFlags getFlags() { + return adjFlags; + } + }; } - public static ByteBuf serializeAdjacencySegmentIdentifier(final SrAdjId srAdjId) { + public static ByteBuf serializeAdjacencySegmentIdentifier(final AdjacencySegmentIdentifier srAdjId) { final ByteBuf value = Unpooled.buffer(); final AdjacencyFlags srAdjIdFlags = srAdjId.getFlags(); final BitArray flags = new BitArray(FLAGS_SIZE); @@ -59,7 +90,7 @@ public final class SrLinkAttributesParser { flags.set(SET_FLAG, srAdjIdFlags.isSetFlag()); flags.toByteBuf(value); value.writeByte(srAdjId.getWeight().getValue()); - value.writeBytes(srAdjId.getSid().getValue()); + TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srAdjId.getSid().getValue()), value); return value; } @@ -72,10 +103,22 @@ public final class SrLinkAttributesParser { 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))); + srLanAdjIdBuilder.setSid(new SidLabel(parseSidSubTlv(buffer))); return srLanAdjIdBuilder.build(); } + private static SidLabel parseSidSubTlv(final ByteBuf buffer) { + final SidLabel sidValue; + final int type = buffer.readUnsignedByte(); + final int length = buffer.readUnsignedByte(); + sidValue = new SidLabel(ByteArray.readAllBytes(buffer.readSlice(length))); + if (type != SID_TYPE) { + LOG.warn("Unexpected type in SID/label Sub-TLV, expected {}, actual {}, ignoring it", SID_TYPE, type); + return null; + } + return sidValue; + } + public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) { final ByteBuf value = Unpooled.buffer(); final AdjacencyFlags srAdjIdFlags = srLanAdjId.getFlags(); @@ -88,7 +131,7 @@ public final class SrLinkAttributesParser { flags.toByteBuf(value); value.writeByte(srLanAdjId.getWeight().getValue()); value.writeBytes(srLanAdjId.getIsoSystemId().getValue()); - value.writeBytes(srLanAdjId.getSid().getValue()); + TlvUtil.writeSrTLV(SID_TYPE, Unpooled.wrappedBuffer(srLanAdjId.getSid().getValue()), value); return value; } } diff --git a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java index 3e74b98e0f..bf5088e947 100644 --- a/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java +++ b/bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/LinkstateAttributeParserTest.java @@ -12,7 +12,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; - import com.google.common.collect.Lists; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -63,7 +62,10 @@ public class LinkstateAttributeParserTest { 0x46, 0x43, 0x50, 0, 0x04, 0x43, 0, 0x20, 0x46, 0x43, 0x50, 0, 0x46, 0x43, 0x50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x44, 0, 0x08, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, 0x45, 0, 0x02, 0, 0x08, 0x04, 0x46, 0, 0x01, (byte) 0xc0, 0x04, 0x47, 0, 0x03, 0, 0, 0x0a, 0x04, 0x48, 0, 0x08, 0x12, 0x34, 0x56, 0x78, 0x10, 0x30, 0x50, 0x70, 0x04, 0x4a, - 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, (byte) 0x88, 0, 0x01, 0x0a }; + 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, + 0x04, 0x0c, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0d, + 0x04, 0x0d, 0, 0x08, (byte)0x80, 0x05, 0x01, 0x04, 0x0a, 0x0b, 0x0c, 0x0e, + 0x04, (byte) 0x88, 0, 0x01, 0x0a }; private static final byte[] NODE_ATTR = { 0x01, 0x07, 0, 0x04, 0, 0x2a, 0, 0x2b, 0x04, 0, 0, 0x01, (byte) 0xb0, 0x04, 0x02, 0, 0x05, 0x31, 0x32, 0x4b, 0x2d, 0x32, 0x04, 0x03, 0, 0x01, 0x72, 0x04, 0x03, 0, 0x01, 0x73, 0x04, 0x04, 0, 0x04, @@ -155,6 +157,14 @@ public class LinkstateAttributeParserTest { assertEquals(2, ls.getSharedRiskLinkGroups().size()); assertEquals(305419896, ls.getSharedRiskLinkGroups().get(0).getValue().intValue()); assertEquals("12K-2", ls.getLinkName()); + assertTrue(ls.getPeerSid().getFlags().isAddressFamily()); + assertFalse(ls.getPeerSid().getFlags().isBackup()); + assertTrue(ls.getPeerSetSid().getFlags().isAddressFamily()); + assertFalse(ls.getPeerSetSid().getFlags().isBackup()); + assertArrayEquals(new byte[] {10, 11, 12, 13}, ls.getPeerSid().getSid().getValue()); + assertEquals(new Short("5"), ls.getPeerSid().getWeight().getValue()); + assertArrayEquals(new byte[] {10, 11, 12, 14}, ls.getPeerSetSid().getSid().getValue()); + assertEquals(new Short("5"), ls.getPeerSetSid().getWeight().getValue()); //serialization final ByteBuf buff = Unpooled.buffer(); 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 162b243ae7..448551c922 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 @@ -179,17 +179,17 @@ public class SrAttributeParserTest { @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[] tested = { (byte)-80, 10, 1, 24, 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))); + assertEquals(srAdjId, new SrAdjIdBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(Unpooled.wrappedBuffer(tested))).build()); 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[] tested = { (byte)-80, 10, 1, 2, 3, 4, 5, 6, 1, 24, 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();