2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.protocol.bgp.linkstate;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
13 import com.google.common.collect.Lists;
14 import com.google.common.primitives.Bytes;
15 import io.netty.buffer.ByteBuf;
16 import io.netty.buffer.Unpooled;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator;
23 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.Ipv6SrPrefixAttributesParser;
24 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.RangeTlvParser;
25 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrLinkAttributesParser;
26 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrNodeAttributesParser;
27 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrPrefixAttributesParser;
28 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
29 import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderContext;
30 import org.opendaylight.protocol.rsvp.parser.spi.pojo.ServiceLoaderRSVPExtensionProviderContext;
31 import org.opendaylight.protocol.util.ByteArray;
32 import org.opendaylight.protocol.util.Ipv6Util;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.ProtocolId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrAdjIds;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrAdjIdsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrLanAdjIds;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrLanAdjIdsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrAlgorithm;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrAlgorithmBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrCapabilities;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrCapabilitiesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.Ipv6SrPrefix;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.Ipv6SrPrefixBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrPrefix;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrPrefixBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrRange;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrRangeBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Algorithm;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Weight;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.OspfAdjFlagsCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.OspfAdjFlagsCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.isis.adj.flags._case.IsisAdjFlagsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.ospf.adj.flags._case.OspfAdjFlagsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.BindingSubTlvs;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.BindingSubTlvsBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.flags.IsisBindingFlagsCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.EroMetricCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.PrefixSidCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.SidLabelCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.ipv4.ero._case.Ipv4EroBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.ipv4.ero.backup._case.Ipv4EroBackupBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.ipv6.ero._case.Ipv6EroBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.ipv6.ero.backup._case.Ipv6EroBackupBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.prefix.sid._case.PrefixSidBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.unnumbered._interface.id.backup.ero._case.UnnumberedInterfaceIdBackupEroBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.unnumbered._interface.id.ero._case.UnnumberedInterfaceIdEroBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCase;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCase;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.isis.prefix.flags._case.IsisPrefixFlagsBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.ospf.prefix.flags._case.OspfPrefixFlagsBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.BindingSidTlvCaseBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.SidLabelTlvCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.prefix.sid.tlv._case.PrefixSidTlvBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.tlv.SubTlvs;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.tlv.SubTlvsBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.Ipv6AddressCaseBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.LocalLabelCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.SidCaseBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.MplsLabel;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.TeMetric;
96 import org.opendaylight.yangtools.yang.common.Uint16;
97 import org.opendaylight.yangtools.yang.common.Uint32;
98 import org.opendaylight.yangtools.yang.common.Uint8;
100 public class SrAttributeParserTest {
102 private static final byte[] IPV6_A_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
103 private static final Ipv6Address IPV6_A = new Ipv6Address("2001:db8::1");
104 private static final byte[] IPV6_B_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
105 private static final Ipv6Address IPV6_B = new Ipv6Address("2001:db8::2");
107 private static final IsisPrefixFlagsCase ISIS_PREFIX_FLAGS = new IsisPrefixFlagsCaseBuilder()
108 .setIsisPrefixFlags(new IsisPrefixFlagsBuilder()
109 .setReadvertisement(Boolean.TRUE)
110 .setNodeSid(Boolean.FALSE)
111 .setNoPhp(Boolean.TRUE)
112 .setExplicitNull(Boolean.FALSE)
115 private static final OspfPrefixFlagsCase OSPF_PREFIX_FLAGS = new OspfPrefixFlagsCaseBuilder()
116 .setOspfPrefixFlags(new OspfPrefixFlagsBuilder()
117 .setNoPhp(Boolean.FALSE)
118 .setMappingServer(Boolean.TRUE)
119 .setExplicitNull(Boolean.FALSE)
123 private static final IsisBindingFlagsCase BINDING_FLAGS = new IsisBindingFlagsCaseBuilder()
124 .setAddressFamily(Boolean.FALSE)
125 .setMirrorContext(Boolean.TRUE)
126 .setSpreadTlv(Boolean.FALSE)
127 .setLeakedFromLevel2(Boolean.FALSE)
128 .setAttachedFlag(Boolean.TRUE)
131 private static final IsisAdjFlagsCase ISIS_ADJ_FLAGS = new IsisAdjFlagsCaseBuilder()
132 .setIsisAdjFlags(new IsisAdjFlagsBuilder()
133 .setAddressFamily(Boolean.FALSE)
134 .setBackup(Boolean.TRUE)
135 .setSet(Boolean.FALSE)
138 private static final OspfAdjFlagsCase OSPF_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
139 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
140 .setBackup(Boolean.TRUE)
141 .setSet(Boolean.FALSE)
144 private static final OspfAdjFlagsCase OSPF_LAN_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
145 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
146 .setBackup(Boolean.FALSE)
147 .setSet(Boolean.FALSE)
152 public void setUp() throws Exception {
153 final BGPActivator act = new BGPActivator(true,
154 ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
155 final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
160 public void testSrAlgorithm() {
161 final byte[] bytes = { 0 };
162 final SrAlgorithm alg = new SrAlgorithmBuilder().setAlgorithms(Lists.newArrayList(Algorithm.ShortestPathFirst))
164 final SrAlgorithm empty = new SrAlgorithmBuilder().setAlgorithms(Collections.emptyList()).build();
165 assertEquals(alg, SrNodeAttributesParser.parseSrAlgorithms(Unpooled.wrappedBuffer(bytes)));
166 final ByteBuf b = Unpooled.buffer();
167 assertEquals(empty, SrNodeAttributesParser.parseSrAlgorithms(b));
168 SrNodeAttributesParser.serializeSrAlgorithms(alg, b);
169 assertArrayEquals(bytes, ByteArray.readAllBytes(b));
171 SrNodeAttributesParser.serializeSrAlgorithms(empty, b);
172 assertEquals(0, b.readableBytes());
175 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.1.1
177 public void testSrCapabilities() {
178 final byte[] bytesIsis = { (byte)0xC0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
179 final byte[] bytesOspf = { 0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
180 final SrCapabilities capsIsis = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.TRUE).setMplsIpv6(Boolean.TRUE)
181 .setSrIpv6(Boolean.FALSE)
182 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
183 .setRangeSize(Uint32.valueOf(10)).build();
184 final SrCapabilities capsOspf = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.FALSE)
185 .setMplsIpv6(Boolean.FALSE).setSrIpv6(Boolean.FALSE).setSidLabelIndex(new SidCaseBuilder()
186 .setSid(Uint32.valueOf(16909060L)).build()).setRangeSize(Uint32.valueOf(10)).build();
187 assertEquals(capsIsis,
188 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.IsisLevel1));
189 assertEquals(capsOspf,
190 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.Ospf));
191 final ByteBuf encodedIsis = Unpooled.buffer();
192 final ByteBuf encodedOspf = Unpooled.buffer();
193 SrNodeAttributesParser.serializeSrCapabilities(capsIsis, encodedIsis);
194 SrNodeAttributesParser.serializeSrCapabilities(capsOspf, encodedOspf);
195 assertArrayEquals(bytesIsis, ByteArray.readAllBytes(encodedIsis));
196 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(encodedOspf));
199 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.1
201 public void testSrPrefix() {
202 final byte[] bytes = { (byte)0xA0, 0, 0, 0, 1, 2, 3, 4 };
203 final byte[] bytesOspf = { (byte)0x20, 0, 0, 0, 1, 2, 3, 4 };
204 final SrPrefix prefixIsis = new SrPrefixBuilder()
205 .setFlags(ISIS_PREFIX_FLAGS)
206 .setAlgorithm(Algorithm.ShortestPathFirst)
207 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
209 final SrPrefix prefixOspf = new SrPrefixBuilder()
210 .setFlags(OSPF_PREFIX_FLAGS)
211 .setAlgorithm(Algorithm.ShortestPathFirst)
212 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
214 assertEquals(prefixIsis,
215 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.IsisLevel1));
216 assertEquals(prefixOspf,
217 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.Ospf));
218 final ByteBuf serializedPrefix = Unpooled.buffer();
219 final ByteBuf serializedPrefixOspf = Unpooled.buffer();
220 SrPrefixAttributesParser.serializeSrPrefix(prefixIsis, serializedPrefix);
221 SrPrefixAttributesParser.serializeSrPrefix(prefixOspf, serializedPrefixOspf);
222 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
223 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
226 // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
228 public void testIpv6SrPrefix() {
229 final byte[] bytes = { 0, 0, 0};
230 final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
231 assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
232 final ByteBuf serializedPrefix = Unpooled.buffer();
233 Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
234 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
237 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
239 public void testRangeTlv() {
240 final byte[] tested = {
242 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
243 4, (byte)0x86, 0, 7, (byte)0xac, 1, 0, 0, 1, 2, 0, // prefix + mpls label
244 4, (byte)0x88, 0, 0x58, 5, 0x48, 0, 0, // binding sid
246 4, (byte)0x86, 0, 8, (byte)0xa0, 1, 0, 0, 1, 2, 3, 4, // prefix
247 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
248 4, (byte)0x8a, 0, 4, 0, 0, 0, 6, // ero metric
249 4, (byte)0x8b, 0, 8, 0, 0, 0, 0, 9, 8, 7, 6, // IPv4 ERO
250 4, (byte)0x8d, 0, 0x0c, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, // Unnumbered Interface ID ERO Sub-TLV
251 4, (byte)0x8e, 0, 8, 0, 0, 0, 0, 3, 4, 5, 6, // IPv4 ERO backup
252 4, (byte)0x90, 0, 0x0c, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, // Unnumbered Interface ID ERO Sub-TLV Backup
254 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
256 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
257 addSubTlvs(rangeSubTlvs);
258 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
259 .setSubTlvs(rangeSubTlvs).build();
261 assertEquals(expected, parsedRange);
263 final ByteBuf serializedRange = Unpooled.buffer();
264 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
265 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
268 private static void addSubTlvs(final List<SubTlvs> rangeSubTlvs) {
269 rangeSubTlvs.add(new SubTlvsBuilder()
270 .setRangeSubTlv(new SidLabelTlvCaseBuilder()
271 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
274 rangeSubTlvs.add(new SubTlvsBuilder()
275 .setRangeSubTlv(new PrefixSidTlvCaseBuilder()
276 .setPrefixSidTlv(new PrefixSidTlvBuilder()
277 .setFlags(ISIS_PREFIX_FLAGS)
278 .setAlgorithm(Algorithm.StrictShortestPathFirst)
279 .setSidLabelIndex(new LocalLabelCaseBuilder()
280 .setLocalLabel(new MplsLabel(Uint32.valueOf(66048)))
285 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
286 addBindingSubTlvs(bindingSubTlvs);
287 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
288 new BindingSidTlvCaseBuilder()
289 .setWeight(new Weight(Uint8.valueOf(5)))
290 .setFlags(BINDING_FLAGS)
291 .setBindingSubTlvs(bindingSubTlvs).build()).build());
294 private static void addBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs) {
295 bindingSubTlvs.add(new BindingSubTlvsBuilder()
296 .setBindingSubTlv(new PrefixSidCaseBuilder()
297 .setPrefixSid(new PrefixSidBuilder()
298 .setFlags(ISIS_PREFIX_FLAGS)
299 .setAlgorithm(Algorithm.StrictShortestPathFirst)
300 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
304 bindingSubTlvs.add(new BindingSubTlvsBuilder()
305 .setBindingSubTlv(new SidLabelCaseBuilder()
306 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
309 bindingSubTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(
310 new EroMetricCaseBuilder().setEroMetric(new TeMetric(Uint32.valueOf(6))).build()).build());
311 bindingSubTlvs.add(new BindingSubTlvsBuilder()
312 .setBindingSubTlv(new Ipv4EroCaseBuilder()
313 .setIpv4Ero(new Ipv4EroBuilder().setLoose(Boolean.FALSE).setAddress(new Ipv4Address("9.8.7.6")).build())
316 bindingSubTlvs.add(new BindingSubTlvsBuilder()
317 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
318 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
319 .setLoose(Boolean.FALSE)
320 .setRouterId(Uint32.valueOf(16843009L))
321 .setInterfaceId(Uint32.valueOf(33686018L))
325 bindingSubTlvs.add(new BindingSubTlvsBuilder()
326 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
327 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
328 .setLoose(Boolean.FALSE).setAddress(new Ipv4Address("3.4.5.6"))
332 bindingSubTlvs.add(new BindingSubTlvsBuilder()
333 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
334 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
335 .setLoose(Boolean.FALSE)
336 .setRouterId(Uint32.valueOf(50529027L))
337 .setInterfaceId(Uint32.valueOf(67372036L))
344 public void testRangeTlvIpv6() {
345 final byte[] tested = Bytes.concat(
348 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
350 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
351 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
353 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
355 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
356 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
357 bindingSubTlvs.add(new BindingSubTlvsBuilder()
358 .setBindingSubTlv(new Ipv6EroCaseBuilder()
359 .setIpv6Ero(new Ipv6EroBuilder()
360 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_A))
364 bindingSubTlvs.add(new BindingSubTlvsBuilder()
365 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
366 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
367 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_B))
371 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
372 new BindingSidTlvCaseBuilder()
373 .setWeight(new Weight(Uint8.valueOf(5)))
374 .setFlags(BINDING_FLAGS)
375 .setBindingSubTlvs(bindingSubTlvs).build()).build());
376 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
377 .setSubTlvs(rangeSubTlvs).build();
379 assertEquals(expected, parsedRange);
381 final ByteBuf serializedRange = Unpooled.buffer();
382 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
383 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
386 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
388 public void testSrAdjId() {
389 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
390 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
391 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
392 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
393 .setFlags(ISIS_ADJ_FLAGS)
394 .setWeight(new Weight(Uint8.valueOf(10)))
395 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
396 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
397 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
398 .setFlags(OSPF_ADJ_FLAGS)
399 .setWeight(new Weight(Uint8.valueOf(10)))
400 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
401 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
403 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
404 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
405 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
406 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
407 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
408 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
409 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
410 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
414 public void testSrLanAdjIdOspf() {
415 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
416 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
417 .setFlags(OSPF_LAN_ADJ_FLAGS)
418 .setWeight(new Weight(Uint8.valueOf(10)))
419 .setNeighborId(new Ipv4Address("1.2.3.4"))
420 .setSidLabelIndex(new LocalLabelCaseBuilder()
421 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
424 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
425 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
426 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
427 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
431 public void testSrLanAdjIdIsis() {
432 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
434 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
435 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
436 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
437 .setFlags(ISIS_ADJ_FLAGS)
438 .setWeight(new Weight(Uint8.valueOf(10)))
439 .setIsoSystemId(new IsoSystemIdentifier(systemId))
440 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
441 Unpooled.copiedBuffer(sidLabel))).build()).build();
442 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
443 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
444 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
445 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));