BUG-608 : implemented SrPrefix parser/serializers 01/15401/4
authorDana Kutenicsova <dkutenic@cisco.com>
Tue, 17 Feb 2015 09:52:30 +0000 (10:52 +0100)
committerRobert Varga <nite@hq.sk>
Thu, 19 Feb 2015 00:00:56 +0000 (00:00 +0000)
Change-Id: I55b6cc996d0fdeb8a77ecaa703f1ce8c9ec2770e
Signed-off-by: Dana Kutenicsova <dkutenic@cisco.com>
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 [new file with mode: 0644]
bgp/linkstate/src/test/java/org/opendaylight/protocol/bgp/linkstate/SrAttributeParserTest.java

index f02ff597637c3e3e8526e0d18425629f2cf201d4..4218d87744c6fd2174fabc7feb624c678b60d9de 100644 (file)
@@ -15,6 +15,7 @@ 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.ByteArray;
 import org.opendaylight.protocol.util.Ipv4Util;
@@ -24,6 +25,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.IgpBits.UpDown;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.RouteTag;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.IgpBitsBuilder;
+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.update.path.attributes.linkstate.path.attribute.LinkStateAttribute;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.PrefixAttributesCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.PrefixAttributesCaseBuilder;
@@ -49,6 +51,9 @@ final class PrefixAttributesParser {
     private static final int FORWARDING_ADDRESS = 1156;
     private static final int PREFIX_OPAQUE = 1157;
 
+    /* Segment routing TLV */
+    private static final int PREFIX_SID = 1158;
+
     /**
      * Parse prefix attributes.
      *
@@ -97,6 +102,11 @@ final class PrefixAttributesParser {
             case PREFIX_OPAQUE:
                 LOG.debug("Parsed Opaque value: {}, not preserving it", ByteBufUtil.hexDump(value));
                 break;
+            case PREFIX_SID:
+                final SrPrefix prefix = SrPrefixAttributesParser.parseSrPrefix(value);
+                builder.setSrPrefix(prefix);
+                LOG.debug("Parsed SR Prefix: {}", prefix);
+                break;
             default:
                 LOG.warn("TLV {} is not a valid prefix attribute, ignoring it", key);
             }
@@ -151,6 +161,12 @@ final class PrefixAttributesParser {
         if (prefixAtrributes.getPrefixMetric() != null) {
             TlvUtil.writeTLV(PREFIX_METRIC, Unpooled.copyInt(prefixAtrributes.getPrefixMetric().getValue().intValue()), byteAggregator);
         }
+        if (prefixAtrributes.getSrPrefix() != null) {
+            final ByteBuf b = Unpooled.buffer();
+            SrPrefixAttributesParser.serializeSrPrefix(prefixAtrributes.getSrPrefix(), b);
+            TlvUtil.writeTLV(PREFIX_SID, b, byteAggregator);
+        }
+
     }
 
     private static void serializeForwardingAddress(final IpAddress forwardingAddress, final ByteBuf byteAggregator) {
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
new file mode 100644 (file)
index 0000000..f3334cc
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015 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 java.util.BitSet;
+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;
+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.PrefixSid.Flags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel;
+
+public class SrPrefixAttributesParser {
+
+    private static final int FLAGS_SIZE = 1;
+
+    /* 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;
+
+    public static SrPrefix parseSrPrefix(final ByteBuf buffer) {
+        final BitSet flags = BitSet.valueOf(ByteArray.readBytes(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()));
+        builder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
+        return builder.build();
+    }
+
+    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());
+        buffer.writeByte(srPrefix.getAlgorithm().getIntValue());
+        buffer.writeBytes(srPrefix.getSid().getValue());
+    }
+}
index f6abdea7d55362c1f7484197ffae6f123d3a9d41..a8eeabe5686873dcdddfb3fc8f40bfe92f864a7b 100644 (file)
@@ -18,6 +18,7 @@ import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrNodeAttributesParser;
+import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SrPrefixAttributesParser;
 import org.opendaylight.protocol.util.ByteArray;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
@@ -30,6 +31,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.node.state.SrCapabilitiesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.state.SrSidLabel;
 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.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;
@@ -94,4 +97,16 @@ public class SrAttributeParserTest {
         SrNodeAttributesParser.serializeSrCapabilities(caps, b);
         assertArrayEquals(bytes, ByteArray.readAllBytes(b));
     }
+
+    @Test
+    public void testSrPrefix() {
+        final byte[] bytes = { (byte)0xFC, 0, 1, 2, 3, 4 };
+        final SrPrefix p = new SrPrefixBuilder()
+            .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.PrefixSid.Flags(true, true, true, true, true, true))
+            .setAlgorithm(Algorithm.ShortestPathFirst).setSid(new SidLabel(new byte[] {1, 2, 3, 4})).build();
+        assertEquals(p, SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes)));
+        final ByteBuf b = Unpooled.buffer();
+        SrPrefixAttributesParser.serializeSrPrefix(p, b);
+        assertArrayEquals(bytes, ByteArray.readAllBytes(b));
+    }
 }