From: Dana Kutenicsova Date: Tue, 17 Feb 2015 09:52:30 +0000 (+0100) Subject: BUG-608 : implemented SrPrefix parser/serializers X-Git-Tag: release/lithium~224^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=0abb750cb9e8878eff508a3f2395bd03328f03c4;p=bgpcep.git BUG-608 : implemented SrPrefix parser/serializers Change-Id: I55b6cc996d0fdeb8a77ecaa703f1ce8c9ec2770e Signed-off-by: Dana Kutenicsova --- diff --git a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java index f02ff59763..4218d87744 100644 --- a/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/PrefixAttributesParser.java @@ -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 index 0000000000..f3334cc0d5 --- /dev/null +++ b/bgp/linkstate/src/main/java/org/opendaylight/protocol/bgp/linkstate/attribute/sr/SrPrefixAttributesParser.java @@ -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()); + } +} 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 f6abdea7d5..a8eeabe568 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 @@ -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)); + } }