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.TEN).build();
184 final SrCapabilities capsOspf = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.FALSE)
185 .setMplsIpv6(Boolean.FALSE).setSrIpv6(Boolean.FALSE)
186 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
187 .setRangeSize(Uint32.TEN).build();
188 assertEquals(capsIsis,
189 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.IsisLevel1));
190 assertEquals(capsOspf,
191 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.Ospf));
192 final ByteBuf encodedIsis = Unpooled.buffer();
193 final ByteBuf encodedOspf = Unpooled.buffer();
194 SrNodeAttributesParser.serializeSrCapabilities(capsIsis, encodedIsis);
195 SrNodeAttributesParser.serializeSrCapabilities(capsOspf, encodedOspf);
196 assertArrayEquals(bytesIsis, ByteArray.readAllBytes(encodedIsis));
197 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(encodedOspf));
200 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.1
202 public void testSrPrefix() {
203 final byte[] bytes = { (byte)0xA0, 0, 0, 0, 1, 2, 3, 4 };
204 final byte[] bytesOspf = { (byte)0x20, 0, 0, 0, 1, 2, 3, 4 };
205 final SrPrefix prefixIsis = new SrPrefixBuilder()
206 .setFlags(ISIS_PREFIX_FLAGS)
207 .setAlgorithm(Algorithm.ShortestPathFirst)
208 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
210 final SrPrefix prefixOspf = new SrPrefixBuilder()
211 .setFlags(OSPF_PREFIX_FLAGS)
212 .setAlgorithm(Algorithm.ShortestPathFirst)
213 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
215 assertEquals(prefixIsis,
216 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.IsisLevel1));
217 assertEquals(prefixOspf,
218 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.Ospf));
219 final ByteBuf serializedPrefix = Unpooled.buffer();
220 final ByteBuf serializedPrefixOspf = Unpooled.buffer();
221 SrPrefixAttributesParser.serializeSrPrefix(prefixIsis, serializedPrefix);
222 SrPrefixAttributesParser.serializeSrPrefix(prefixOspf, serializedPrefixOspf);
223 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
224 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
227 // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
229 public void testIpv6SrPrefix() {
230 final byte[] bytes = { 0, 0, 0};
231 final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
232 assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
233 final ByteBuf serializedPrefix = Unpooled.buffer();
234 Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
235 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
238 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
240 public void testRangeTlv() {
241 final byte[] tested = {
243 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
244 4, (byte)0x86, 0, 7, (byte)0xac, 1, 0, 0, 1, 2, 0, // prefix + mpls label
245 4, (byte)0x88, 0, 0x58, 5, 0x48, 0, 0, // binding sid
247 4, (byte)0x86, 0, 8, (byte)0xa0, 1, 0, 0, 1, 2, 3, 4, // prefix
248 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
249 4, (byte)0x8a, 0, 4, 0, 0, 0, 6, // ero metric
250 4, (byte)0x8b, 0, 8, 0, 0, 0, 0, 9, 8, 7, 6, // IPv4 ERO
251 4, (byte)0x8d, 0, 0x0c, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, // Unnumbered Interface ID ERO Sub-TLV
252 4, (byte)0x8e, 0, 8, 0, 0, 0, 0, 3, 4, 5, 6, // IPv4 ERO backup
253 4, (byte)0x90, 0, 0x0c, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, // Unnumbered Interface ID ERO Sub-TLV Backup
255 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
257 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
258 addSubTlvs(rangeSubTlvs);
259 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
260 .setSubTlvs(rangeSubTlvs).build();
262 assertEquals(expected, parsedRange);
264 final ByteBuf serializedRange = Unpooled.buffer();
265 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
266 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
269 private static void addSubTlvs(final List<SubTlvs> rangeSubTlvs) {
270 rangeSubTlvs.add(new SubTlvsBuilder()
271 .setRangeSubTlv(new SidLabelTlvCaseBuilder()
272 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
275 rangeSubTlvs.add(new SubTlvsBuilder()
276 .setRangeSubTlv(new PrefixSidTlvCaseBuilder()
277 .setPrefixSidTlv(new PrefixSidTlvBuilder()
278 .setFlags(ISIS_PREFIX_FLAGS)
279 .setAlgorithm(Algorithm.StrictShortestPathFirst)
280 .setSidLabelIndex(new LocalLabelCaseBuilder()
281 .setLocalLabel(new MplsLabel(Uint32.valueOf(66048)))
286 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
287 addBindingSubTlvs(bindingSubTlvs);
288 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
289 new BindingSidTlvCaseBuilder()
290 .setWeight(new Weight(Uint8.valueOf(5)))
291 .setFlags(BINDING_FLAGS)
292 .setBindingSubTlvs(bindingSubTlvs).build()).build());
295 private static void addBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs) {
296 bindingSubTlvs.add(new BindingSubTlvsBuilder()
297 .setBindingSubTlv(new PrefixSidCaseBuilder()
298 .setPrefixSid(new PrefixSidBuilder()
299 .setFlags(ISIS_PREFIX_FLAGS)
300 .setAlgorithm(Algorithm.StrictShortestPathFirst)
301 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
305 bindingSubTlvs.add(new BindingSubTlvsBuilder()
306 .setBindingSubTlv(new SidLabelCaseBuilder()
307 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
310 bindingSubTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(
311 new EroMetricCaseBuilder().setEroMetric(new TeMetric(Uint32.valueOf(6))).build()).build());
312 bindingSubTlvs.add(new BindingSubTlvsBuilder()
313 .setBindingSubTlv(new Ipv4EroCaseBuilder()
314 .setIpv4Ero(new Ipv4EroBuilder().setLoose(Boolean.FALSE).setAddress(new Ipv4Address("9.8.7.6")).build())
317 bindingSubTlvs.add(new BindingSubTlvsBuilder()
318 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
319 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
320 .setLoose(Boolean.FALSE)
321 .setRouterId(Uint32.valueOf(16843009L))
322 .setInterfaceId(Uint32.valueOf(33686018L))
326 bindingSubTlvs.add(new BindingSubTlvsBuilder()
327 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
328 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
329 .setLoose(Boolean.FALSE).setAddress(new Ipv4Address("3.4.5.6"))
333 bindingSubTlvs.add(new BindingSubTlvsBuilder()
334 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
335 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
336 .setLoose(Boolean.FALSE)
337 .setRouterId(Uint32.valueOf(50529027L))
338 .setInterfaceId(Uint32.valueOf(67372036L))
345 public void testRangeTlvIpv6() {
346 final byte[] tested = Bytes.concat(
349 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
351 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
352 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
354 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
356 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
357 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
358 bindingSubTlvs.add(new BindingSubTlvsBuilder()
359 .setBindingSubTlv(new Ipv6EroCaseBuilder()
360 .setIpv6Ero(new Ipv6EroBuilder()
361 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_A))
365 bindingSubTlvs.add(new BindingSubTlvsBuilder()
366 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
367 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
368 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_B))
372 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
373 new BindingSidTlvCaseBuilder()
374 .setWeight(new Weight(Uint8.valueOf(5)))
375 .setFlags(BINDING_FLAGS)
376 .setBindingSubTlvs(bindingSubTlvs).build()).build());
377 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
378 .setSubTlvs(rangeSubTlvs).build();
380 assertEquals(expected, parsedRange);
382 final ByteBuf serializedRange = Unpooled.buffer();
383 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
384 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
387 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
389 public void testSrAdjId() {
390 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
391 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
392 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
393 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
394 .setFlags(ISIS_ADJ_FLAGS)
395 .setWeight(new Weight(Uint8.TEN))
396 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
397 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
398 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
399 .setFlags(OSPF_ADJ_FLAGS)
400 .setWeight(new Weight(Uint8.TEN))
401 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
402 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
404 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
405 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
406 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
407 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
408 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
409 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
410 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
411 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
415 public void testSrLanAdjIdOspf() {
416 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
417 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
418 .setFlags(OSPF_LAN_ADJ_FLAGS)
419 .setWeight(new Weight(Uint8.TEN))
420 .setNeighborId(new Ipv4Address("1.2.3.4"))
421 .setSidLabelIndex(new LocalLabelCaseBuilder()
422 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
425 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
426 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
427 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
428 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
432 public void testSrLanAdjIdIsis() {
433 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,
435 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
436 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
437 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
438 .setFlags(ISIS_ADJ_FLAGS)
439 .setWeight(new Weight(Uint8.TEN))
440 .setIsoSystemId(new IsoSystemIdentifier(systemId))
441 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
442 Unpooled.copiedBuffer(sidLabel))).build()).build();
443 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
444 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
445 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
446 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));