import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier;
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.SrCapabilities;
+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.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.NodeAttributesCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.NodeAttributesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.node.attributes._case.NodeAttributes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.update.path.attributes.linkstate.path.attribute.link.state.attribute.node.attributes._case.NodeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabelBinding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
LOG.debug("Parsed IPv6 Router Identifier {}", ip6);
break;
case SID_LABEL_BINDING:
- final SidLabelBinding label = SrNodeAttributesParser.parseSidLabelBinding(value);
- // builder.set
+ final SrSidLabel label = SrNodeAttributesParser.parseSidLabelBinding(value);
+ builder.setSrSidLabel(label);
LOG.debug("Parsed SID Label Binding {}", label);
break;
case SR_CAPABILITIES:
if (nodeAttributes.getIpv6RouterId() != null) {
TlvUtil.writeTLV(TlvUtil.LOCAL_IPV6_ROUTER_ID, Ipv6Util.byteBufForAddress(nodeAttributes.getIpv6RouterId()), byteAggregator);
}
+ if (nodeAttributes.getSrSidLabel() != null) {
+ final ByteBuf sidBuffer = Unpooled.buffer();
+ SrNodeAttributesParser.serializeSidLabelBinding(nodeAttributes.getSrSidLabel(), sidBuffer);
+ TlvUtil.writeTLV(SID_LABEL_BINDING, sidBuffer, byteAggregator);
+ }
+ if (nodeAttributes.getSrCapabilities() != null) {
+ final ByteBuf capBuffer = Unpooled.buffer();
+ SrNodeAttributesParser.serializeSrCapabilities(nodeAttributes.getSrCapabilities(), capBuffer);
+ TlvUtil.writeTLV(SR_CAPABILITIES, capBuffer, byteAggregator);
+ }
+ if (nodeAttributes.getSrAlgorithm() != null) {
+ final ByteBuf capBuffer = Unpooled.buffer();
+ SrNodeAttributesParser.serializeSrAlgorithms(nodeAttributes.getSrAlgorithm(), capBuffer);
+ TlvUtil.writeTLV(SR_ALGORITHMS, capBuffer, byteAggregator);
+ }
LOG.trace("Finished serializing Node Attributes");
}
package org.opendaylight.protocol.bgp.linkstate.attribute.sr;
import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
+import org.opendaylight.protocol.bgp.linkstate.TlvUtil;
import org.opendaylight.protocol.util.ByteArray;
+import org.opendaylight.protocol.util.ByteBufWriteUtil;
+import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.protocol.util.Ipv6Util;
+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;
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.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.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.SrCapabilities.Flags;
+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.bgp.segment.routing.rev150206.sid.label.binding.SubTlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.label.binding.SubTlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.SubtlvType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.EroMetricCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.EroMetricCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ip4EroBackupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ip4EroBackupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ip4EroCase;
+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.Ipv6EroBackupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ipv6EroBackupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ipv6EroCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.Ipv6EroCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.SidLabelCase;
+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.UnnumberedEroBackupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.UnnumberedEroBackupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.UnnumberedEroCase;
+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.TeMetric;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public final class SrNodeAttributesParser {
- private static final int FLAGS_SIZE = 1;
+ private static final Logger LOG = LoggerFactory.getLogger(SrNodeAttributesParser.class);
- private static final int SID_TLV_TYPE = 1;
+ private static final int FLAGS_SIZE = 1;
/* SR Capabilities flags */
private static final int IPV4 = 7;
private static final int IPV6 = 6;
+ /* SID Label flags */
+ private static final int AFI = 7;
+ private static final int MIRROR = 6;
+
+ /* SID Label Tlv types */
+ private static final int SID_TLV_TYPE = 1;
+ private static final int ERO_METRIC = 2;
+ private static final int ERO_IPV4 = 3;
+ private static final int ERO_IPV6 = 4;
+ private static final int UNNUMBERED_ERO = 5;
+ private static final int BACKUP_IPV4 = 6;
+ private static final int BACKUP_IPV6 = 7;
+ private static final int UNNUMBERED_BACKUP_ERO = 8;
+
+ private static final int UNNUMBERED_4_SIZE = 8;
+
+ private static List<SubTlvs> parseSidSubtlvs(final ByteBuf buffer) {
+ final List<SubTlvs> subs = new ArrayList<>();
+ while (buffer.isReadable()) {
+ final int type = buffer.readUnsignedByte();
+ final int length = buffer.readUnsignedByte();
+ final ByteBuf value = buffer.readSlice(length);
+ SubtlvType sub = null;
+ switch (type) {
+ case SID_TLV_TYPE:
+ sub = new SidLabelCaseBuilder().setSid(new SidLabel(ByteArray.readAllBytes(value))).build();
+ break;
+ case ERO_METRIC:
+ sub = new EroMetricCaseBuilder().setEroMetric(new TeMetric(value.readUnsignedInt())).build();
+ break;
+ case ERO_IPV4:
+ final Ip4EroCaseBuilder ero4 = new Ip4EroCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ ero4.setAddress(new IpAddress(Ipv4Util.addressForByteBuf(value)));
+ sub = ero4.build();
+ break;
+ case ERO_IPV6:
+ final Ipv6EroCaseBuilder ero6 = new Ipv6EroCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ ero6.setAddress(new IpAddress(Ipv6Util.addressForByteBuf(value)));
+ sub = ero6.build();
+ break;
+ case UNNUMBERED_ERO:
+ final UnnumberedEroCaseBuilder un = new UnnumberedEroCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ if (value.readableBytes() == UNNUMBERED_4_SIZE) {
+ un.setRouterId(ByteArray.readBytes(value, Ipv4Util.IP4_LENGTH));
+ } else {
+ un.setRouterId(ByteArray.readBytes(value, Ipv6Util.IPV6_LENGTH));
+ }
+ un.setInterfaceId(value.readUnsignedInt());
+ sub = un.build();
+ break;
+ case BACKUP_IPV4:
+ final Ip4EroBackupCaseBuilder erob4 = new Ip4EroBackupCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ erob4.setAddress(new IpAddress(Ipv4Util.addressForByteBuf(value)));
+ sub = erob4.build();
+ break;
+ case BACKUP_IPV6:
+ final Ipv6EroBackupCaseBuilder erob6 = new Ipv6EroBackupCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ erob6.setAddress(new IpAddress(Ipv6Util.addressForByteBuf(value)));
+ sub = erob6.build();
+ break;
+ case UNNUMBERED_BACKUP_ERO:
+ final UnnumberedEroBackupCaseBuilder unb = new UnnumberedEroBackupCaseBuilder().setLoose(value.readUnsignedByte() != 0);
+ if (value.readableBytes() == UNNUMBERED_4_SIZE) {
+ unb.setRouterId(ByteArray.readBytes(value, Ipv4Util.IP4_LENGTH));
+ } else {
+ unb.setRouterId(ByteArray.readBytes(value, Ipv6Util.IPV6_LENGTH));
+ }
+ unb.setInterfaceId(value.readUnsignedInt());
+ sub = unb.build();
+ break;
+ default:
+ LOG.debug("Unknown SID Label Subtlv found, type {}", type);
+ // we don't want to add null sub-tlv, so skip to next loop iteration
+ continue;
+ }
+ subs.add(new SubTlvsBuilder().setSubtlvType(sub).build());
+ }
+ return subs;
+ }
+
public static SrSidLabel parseSidLabelBinding(final ByteBuf buffer) {
- // TODO Auto-generated method stub
- return null;
+ final SrSidLabelBuilder builder = new SrSidLabelBuilder();
+ final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE));
+ builder.setSidLabelFlags(new SidLabelFlags(flags.get(AFI), flags.get(MIRROR)));
+ builder.setWeight(new Weight(buffer.readUnsignedByte()));
+ builder.setValueRange(buffer.readUnsignedShort());
+ final int length = buffer.readUnsignedByte();
+ IpPrefix prefix = null;
+ if (length == Ipv4Util.IP4_LENGTH) {
+ prefix = new IpPrefix(Ipv4Util.prefixForByteBuf(buffer));
+ } else {
+ prefix = new IpPrefix(Ipv6Util.prefixForByteBuf(buffer));
+ }
+ builder.setFecPrefix(prefix);
+ builder.setSubTlvs(parseSidSubtlvs(buffer));
+ return builder.build();
+ }
+
+ private static byte serializeLoose(final boolean loose) {
+ return loose ? (byte)128 : 0;
+ }
+
+ private static void serializeSidSubtlvs(final List<SubTlvs> subTlvs, final ByteBuf buffer) {
+ if (subTlvs == null) {
+ return;
+ }
+ for (final SubTlvs sub : subTlvs) {
+ final SubtlvType type = sub.getSubtlvType();
+ if (type instanceof SidLabelCase) {
+ TlvUtil.writeSrTLV(SID_TLV_TYPE, Unpooled.wrappedBuffer(((SidLabelCase)type).getSid().getValue()), buffer);
+ } else if (type instanceof EroMetricCase) {
+ final ByteBuf b = Unpooled.buffer();
+ ByteBufWriteUtil.writeUnsignedInt(((EroMetricCase)type).getEroMetric().getValue(), b);
+ TlvUtil.writeSrTLV(ERO_METRIC, b, buffer);
+ } else if (type instanceof Ip4EroCase) {
+ final ByteBuf b = Unpooled.buffer(Ipv4Util.IP4_LENGTH + FLAGS_SIZE);
+ final Ip4EroCase ero = (Ip4EroCase)type;
+ b.writeByte(serializeLoose(ero.isLoose()));
+ ByteBufWriteUtil.writeIpv4Address(ero.getAddress().getIpv4Address(), b);
+ TlvUtil.writeSrTLV(ERO_IPV4, b, buffer);
+ } else if (type instanceof Ipv6EroCase) {
+ final ByteBuf b = Unpooled.buffer(Ipv6Util.IPV6_LENGTH + FLAGS_SIZE);
+ final Ipv6EroCase ero = (Ipv6EroCase)type;
+ b.writeByte(serializeLoose(ero.isLoose()));
+ ByteBufWriteUtil.writeIpv6Address(ero.getAddress().getIpv6Address(), b);
+ TlvUtil.writeSrTLV(ERO_IPV6, b, buffer);
+ } else if (type instanceof UnnumberedEroCase) {
+ final UnnumberedEroCase ero = (UnnumberedEroCase)type;
+ final ByteBuf b = Unpooled.buffer();
+ b.writeByte(serializeLoose(ero.isLoose()));
+ b.writeBytes(ero.getRouterId());
+ ByteBufWriteUtil.writeUnsignedInt(ero.getInterfaceId(), b);
+ TlvUtil.writeSrTLV(UNNUMBERED_ERO, b, buffer);
+ } else if (type instanceof Ip4EroBackupCase) {
+ final ByteBuf b = Unpooled.buffer(Ipv4Util.IP4_LENGTH + FLAGS_SIZE);
+ final Ip4EroBackupCase ero = (Ip4EroBackupCase)type;
+ b.writeByte(serializeLoose(ero.isLoose()));
+ ByteBufWriteUtil.writeIpv4Address(ero.getAddress().getIpv4Address(), b);
+ TlvUtil.writeSrTLV(BACKUP_IPV4, b, buffer);
+ } else if (type instanceof Ipv6EroBackupCase) {
+ final ByteBuf b = Unpooled.buffer(Ipv6Util.IPV6_LENGTH + FLAGS_SIZE);
+ final Ipv6EroBackupCase ero = (Ipv6EroBackupCase)type;
+ b.writeByte(serializeLoose(ero.isLoose()));
+ ByteBufWriteUtil.writeIpv6Address(ero.getAddress().getIpv6Address(), b);
+ TlvUtil.writeSrTLV(BACKUP_IPV6, b, buffer);
+ } else if (type instanceof UnnumberedEroBackupCase) {
+ final UnnumberedEroBackupCase ero = (UnnumberedEroBackupCase)type;
+ final ByteBuf b = Unpooled.buffer();
+ b.writeByte(serializeLoose(ero.isLoose()));
+ b.writeBytes(ero.getRouterId());
+ ByteBufWriteUtil.writeUnsignedInt(ero.getInterfaceId(), b);
+ TlvUtil.writeSrTLV(UNNUMBERED_BACKUP_ERO, b, buffer);
+ }
+ }
+ }
+
+ public static void serializeSidLabelBinding(final SrSidLabel binding, final ByteBuf buffer) {
+ final SidLabelFlags flags = binding.getSidLabelFlags();
+ final BitSet bs = new BitSet(FLAGS_SIZE);
+ if (flags.isAddressFamily() != null) {
+ bs.set(AFI, flags.isAddressFamily());
+ }
+ if (flags.isMirrorContext() != null) {
+ bs.set(MIRROR, flags.isMirrorContext());
+ }
+ buffer.writeBytes(bs.toByteArray());
+ buffer.writeByte(binding.getWeight().getValue());
+ buffer.writeShort(binding.getValueRange());
+ final IpPrefix prefix = binding.getFecPrefix();
+ if (prefix.getIpv4Prefix() != null) {
+ buffer.writeBytes(Ipv4Util.bytesForPrefixBegin(prefix.getIpv4Prefix()));
+ } else {
+ buffer.writeBytes(Ipv6Util.bytesForPrefixBegin(prefix.getIpv6Prefix()));
+ }
+ serializeSidSubtlvs(binding.getSubTlvs(), buffer);
}
public static SrCapabilities parseSrCapabilities(final ByteBuf buffer) {
import com.google.common.collect.Lists;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
+import java.util.ArrayList;
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.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;
+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.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.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.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.SrCapabilities.Flags;
+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.bgp.segment.routing.rev150206.sid.label.binding.SubTlvs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.label.binding.SubTlvsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.sid.sub.tlvs.subtlv.type.EroMetricCaseBuilder;
+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.TeMetric;
public class SrAttributeParserTest {
+ @Test
+ public void testSidLabelBindingv4() {
+ final byte[] bytes = { (byte)0xC0, 24, 0, 42, 8, 127, 1, 4, 1, 2, 3, 4, 2, 4, 0, 0, 0, 8, 3, 5,(byte)0x80, 10, 0, 0, 1, 5, 9, (byte)0x80, 1, 2, 3, 4, 0, 0, 1, (byte)0xF4 };
+ final List<SubTlvs> subs = new ArrayList<>();
+ subs.add(new SubTlvsBuilder().setSubtlvType(new SidLabelCaseBuilder().setSid(new SidLabel(new byte[] {1,2,3,4})).build()).build());
+ subs.add(new SubTlvsBuilder().setSubtlvType(new EroMetricCaseBuilder().setEroMetric(new TeMetric((long) 8)).build()).build());
+ subs.add(new SubTlvsBuilder().setSubtlvType(new Ip4EroCaseBuilder().setLoose(true).setAddress(new IpAddress(new Ipv4Address("10.0.0.1"))).build()).build());
+ subs.add(new SubTlvsBuilder().setSubtlvType(new UnnumberedEroCaseBuilder().setLoose(true).setRouterId(new byte[] {1,2,3,4}).setInterfaceId((long)500).build()).build());
+ final SrSidLabel b4 = new SrSidLabelBuilder().setSidLabelFlags(new SidLabelFlags(Boolean.TRUE, Boolean.TRUE))
+ .setWeight(new Weight((short) 24)).setFecPrefix(new IpPrefix(new Ipv4Prefix("127.0.0.0/8"))).setValueRange(42).setSubTlvs(subs).build();
+ final ByteBuf b = Unpooled.buffer();
+ SrNodeAttributesParser.serializeSidLabelBinding(b4, b);
+ assertArrayEquals(bytes, ByteArray.readAllBytes(b));
+ }
+
+ @Test
+ public void testSidLabelBindingv6() {
+ final byte[] bytes = { (byte)0xC0, 24, 0, 42, 8, (byte)0x20 };
+ final SrSidLabel b4 = new SrSidLabelBuilder().setSidLabelFlags(new SidLabelFlags(Boolean.TRUE, Boolean.TRUE))
+ .setWeight(new Weight((short) 24)).setFecPrefix(new IpPrefix(new Ipv6Prefix("2001::1/8"))).setValueRange(42).build();
+ final ByteBuf b = Unpooled.buffer();
+ SrNodeAttributesParser.serializeSidLabelBinding(b4, b);
+ assertArrayEquals(bytes, ByteArray.readAllBytes(b));
+ }
+
@Test
public void testSrAlgorithm() {
final byte[] bytes = { 0 };
SrNodeAttributesParser.serializeSrAlgorithms(alg, b);
assertArrayEquals(bytes, ByteArray.readAllBytes(b));
- b.clear();
SrNodeAttributesParser.serializeSrAlgorithms(empty, b);
assertEquals(0, b.readableBytes());
}