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;
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;
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.
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);
}
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");
}
--- /dev/null
+/*
+ * 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;
+ }
+}
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;
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;
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;
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 {
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));
+ }
}