Bug 608 - implemented parsers/serializers 13/15413/4
authorLadislav Borak <lborak@cisco.com>
Tue, 17 Feb 2015 11:22:37 +0000 (12:22 +0100)
committerLadislav Borak <lborak@cisco.com>
Thu, 19 Feb 2015 09:58:12 +0000 (10:58 +0100)
- 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 <lborak@cisco.com>
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/LinkAttributesParser.java
bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrLinkAttributesParser.java [new file with mode: 0644]
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java

index 64a57ab7c1dd9e3d96ef15124357a03cbdf0a4c8..0f74986d90235c6ca8d280db7a9890e185e06620 100644 (file)
@@ -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 (file)
index 0000000..68bd7d3
--- /dev/null
@@ -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;
+    }
+}
index a8eeabe5686873dcdddfb3fc8f40bfe92f864a7b..afa3ce2be09f1c822f344791f76062e321f6d858 100644 (file)
@@ -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));
+    }
 }