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.Ipv4AddressNoZone;
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.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.types.rev171204.Uint24;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrAdjIds;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrAdjIdsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrLanAdjIds;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrLanAdjIdsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrAlgorithm;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrAlgorithmBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrCapabilities;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrCapabilitiesBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.Ipv6SrPrefix;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.Ipv6SrPrefixBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrPrefix;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrPrefixBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrRange;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrRangeBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Algorithm;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Weight;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.IsisAdjFlagsCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.IsisAdjFlagsCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.OspfAdjFlagsCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.OspfAdjFlagsCaseBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.isis.adj.flags._case.IsisAdjFlagsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.ospf.adj.flags._case.OspfAdjFlagsBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.EroMetricCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.PrefixSidCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.SidLabelCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCaseBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.ipv4.ero._case.Ipv4EroBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.ipv4.ero.backup._case.Ipv4EroBackupBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.ipv6.ero._case.Ipv6EroBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.ipv6.ero.backup._case.Ipv6EroBackupBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.prefix.sid._case.PrefixSidBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.unnumbered._interface.id.backup.ero._case.UnnumberedInterfaceIdBackupEroBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.unnumbered._interface.id.ero._case.UnnumberedInterfaceIdEroBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.IsisPrefixFlagsCase;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.IsisPrefixFlagsCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.OspfPrefixFlagsCase;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.OspfPrefixFlagsCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.isis.prefix.flags._case.IsisPrefixFlagsBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.ospf.prefix.flags._case.OspfPrefixFlagsBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.BindingSidTlvCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.SidLabelTlvCaseBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.prefix.sid.tlv._case.PrefixSidTlvBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.tlv.SubTlvs;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.tlv.SubTlvsBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.sid.label.index.sid.label.index.Ipv6AddressCaseBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.sid.label.index.sid.label.index.LocalLabelCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.sid.label.index.sid.label.index.SidCaseBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.MplsLabel;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.TeMetric;
98 import org.opendaylight.yangtools.yang.common.Uint16;
99 import org.opendaylight.yangtools.yang.common.Uint32;
100 import org.opendaylight.yangtools.yang.common.Uint8;
102 public class SrAttributeParserTest {
104 private static final byte[] IPV6_A_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
105 private static final Ipv6Address IPV6_A = new Ipv6Address("2001:db8::1");
106 private static final byte[] IPV6_B_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
107 private static final Ipv6Address IPV6_B = new Ipv6Address("2001:db8::2");
109 private static final IsisPrefixFlagsCase ISIS_PREFIX_FLAGS = new IsisPrefixFlagsCaseBuilder()
110 .setIsisPrefixFlags(new IsisPrefixFlagsBuilder()
111 .setReadvertisement(Boolean.TRUE)
112 .setNodeSid(Boolean.FALSE)
113 .setNoPhp(Boolean.TRUE)
114 .setExplicitNull(Boolean.FALSE)
117 private static final OspfPrefixFlagsCase OSPF_PREFIX_FLAGS = new OspfPrefixFlagsCaseBuilder()
118 .setOspfPrefixFlags(new OspfPrefixFlagsBuilder()
119 .setNoPhp(Boolean.FALSE)
120 .setMappingServer(Boolean.TRUE)
121 .setExplicitNull(Boolean.FALSE)
125 private static final IsisBindingFlagsCase BINDING_FLAGS = new IsisBindingFlagsCaseBuilder()
126 .setAddressFamily(Boolean.FALSE)
127 .setMirrorContext(Boolean.TRUE)
128 .setSpreadTlv(Boolean.FALSE)
129 .setLeakedFromLevel2(Boolean.FALSE)
130 .setAttachedFlag(Boolean.TRUE)
133 private static final IsisAdjFlagsCase ISIS_ADJ_FLAGS = new IsisAdjFlagsCaseBuilder()
134 .setIsisAdjFlags(new IsisAdjFlagsBuilder()
135 .setAddressFamily(Boolean.FALSE)
136 .setBackup(Boolean.TRUE)
137 .setSet(Boolean.FALSE)
140 private static final OspfAdjFlagsCase OSPF_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
141 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
142 .setBackup(Boolean.TRUE)
143 .setSet(Boolean.FALSE)
146 private static final OspfAdjFlagsCase OSPF_LAN_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
147 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
148 .setBackup(Boolean.FALSE)
149 .setSet(Boolean.FALSE)
154 public void setUp() throws Exception {
155 final BGPActivator act = new BGPActivator(ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance());
156 final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
161 public void testSrAlgorithm() {
162 final byte[] bytes = { 0 };
163 final SrAlgorithm alg = new SrAlgorithmBuilder().setAlgorithms(Lists.newArrayList(Algorithm.ShortestPathFirst))
165 final SrAlgorithm empty = new SrAlgorithmBuilder().setAlgorithms(Collections.emptyList()).build();
166 assertEquals(alg, SrNodeAttributesParser.parseSrAlgorithms(Unpooled.wrappedBuffer(bytes)));
167 final ByteBuf b = Unpooled.buffer();
168 assertEquals(empty, SrNodeAttributesParser.parseSrAlgorithms(b));
169 SrNodeAttributesParser.serializeSrAlgorithms(alg, b);
170 assertArrayEquals(bytes, ByteArray.readAllBytes(b));
172 SrNodeAttributesParser.serializeSrAlgorithms(empty, b);
173 assertEquals(0, b.readableBytes());
176 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.1.1
178 public void testSrCapabilities() {
179 final byte[] bytesIsis = { (byte)0xC0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
180 final byte[] bytesOspf = { 0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
181 final SrCapabilities capsIsis = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.TRUE).setMplsIpv6(Boolean.TRUE)
182 .setSrIpv6(Boolean.FALSE)
183 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
184 .setRangeSize(new Uint24(Uint32.TEN)).build();
185 final SrCapabilities capsOspf = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.FALSE)
186 .setMplsIpv6(Boolean.FALSE).setSrIpv6(Boolean.FALSE)
187 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
188 .setRangeSize(new Uint24(Uint32.TEN)).build();
189 assertEquals(capsIsis,
190 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.IsisLevel1));
191 assertEquals(capsOspf,
192 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.Ospf));
193 final ByteBuf encodedIsis = Unpooled.buffer();
194 final ByteBuf encodedOspf = Unpooled.buffer();
195 SrNodeAttributesParser.serializeSrCapabilities(capsIsis, encodedIsis);
196 SrNodeAttributesParser.serializeSrCapabilities(capsOspf, encodedOspf);
197 assertArrayEquals(bytesIsis, ByteArray.readAllBytes(encodedIsis));
198 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(encodedOspf));
201 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.1
203 public void testSrPrefix() {
204 final byte[] bytes = { (byte)0xA0, 0, 0, 0, 1, 2, 3, 4 };
205 final byte[] bytesOspf = { (byte)0x20, 0, 0, 0, 1, 2, 3, 4 };
206 final SrPrefix prefixIsis = new SrPrefixBuilder()
207 .setFlags(ISIS_PREFIX_FLAGS)
208 .setAlgorithm(Algorithm.ShortestPathFirst)
209 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
211 final SrPrefix prefixOspf = new SrPrefixBuilder()
212 .setFlags(OSPF_PREFIX_FLAGS)
213 .setAlgorithm(Algorithm.ShortestPathFirst)
214 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
216 assertEquals(prefixIsis,
217 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.IsisLevel1));
218 assertEquals(prefixOspf,
219 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.Ospf));
220 final ByteBuf serializedPrefix = Unpooled.buffer();
221 final ByteBuf serializedPrefixOspf = Unpooled.buffer();
222 SrPrefixAttributesParser.serializeSrPrefix(prefixIsis, serializedPrefix);
223 SrPrefixAttributesParser.serializeSrPrefix(prefixOspf, serializedPrefixOspf);
224 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
225 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
228 // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
230 public void testIpv6SrPrefix() {
231 final byte[] bytes = { 0, 0, 0};
232 final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
233 assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
234 final ByteBuf serializedPrefix = Unpooled.buffer();
235 Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
236 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
239 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
241 public void testRangeTlv() {
242 final byte[] tested = {
244 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
245 4, (byte)0x86, 0, 7, (byte)0xac, 1, 0, 0, 1, 2, 0, // prefix + mpls label
246 4, (byte)0x88, 0, 0x58, 5, 0x48, 0, 0, // binding sid
248 4, (byte)0x86, 0, 8, (byte)0xa0, 1, 0, 0, 1, 2, 3, 4, // prefix
249 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
250 4, (byte)0x8a, 0, 4, 0, 0, 0, 6, // ero metric
251 4, (byte)0x8b, 0, 8, 0, 0, 0, 0, 9, 8, 7, 6, // IPv4 ERO
252 4, (byte)0x8d, 0, 0x0c, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, // Unnumbered Interface ID ERO Sub-TLV
253 4, (byte)0x8e, 0, 8, 0, 0, 0, 0, 3, 4, 5, 6, // IPv4 ERO backup
254 4, (byte)0x90, 0, 0x0c, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, // Unnumbered Interface ID ERO Sub-TLV Backup
256 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
258 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
259 addSubTlvs(rangeSubTlvs);
260 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
261 .setSubTlvs(rangeSubTlvs).build();
263 assertEquals(expected, parsedRange);
265 final ByteBuf serializedRange = Unpooled.buffer();
266 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
267 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
270 private static void addSubTlvs(final List<SubTlvs> rangeSubTlvs) {
271 rangeSubTlvs.add(new SubTlvsBuilder()
272 .setRangeSubTlv(new SidLabelTlvCaseBuilder()
273 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
276 rangeSubTlvs.add(new SubTlvsBuilder()
277 .setRangeSubTlv(new PrefixSidTlvCaseBuilder()
278 .setPrefixSidTlv(new PrefixSidTlvBuilder()
279 .setFlags(ISIS_PREFIX_FLAGS)
280 .setAlgorithm(Algorithm.StrictShortestPathFirst)
281 .setSidLabelIndex(new LocalLabelCaseBuilder()
282 .setLocalLabel(new MplsLabel(Uint32.valueOf(66048)))
287 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
288 addBindingSubTlvs(bindingSubTlvs);
289 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
290 new BindingSidTlvCaseBuilder()
291 .setWeight(new Weight(Uint8.valueOf(5)))
292 .setFlags(BINDING_FLAGS)
293 .setBindingSubTlvs(bindingSubTlvs).build()).build());
296 private static void addBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs) {
297 bindingSubTlvs.add(new BindingSubTlvsBuilder()
298 .setBindingSubTlv(new PrefixSidCaseBuilder()
299 .setPrefixSid(new PrefixSidBuilder()
300 .setFlags(ISIS_PREFIX_FLAGS)
301 .setAlgorithm(Algorithm.StrictShortestPathFirst)
302 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
306 bindingSubTlvs.add(new BindingSubTlvsBuilder()
307 .setBindingSubTlv(new SidLabelCaseBuilder()
308 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
311 bindingSubTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(
312 new EroMetricCaseBuilder().setEroMetric(new TeMetric(Uint32.valueOf(6))).build()).build());
313 bindingSubTlvs.add(new BindingSubTlvsBuilder()
314 .setBindingSubTlv(new Ipv4EroCaseBuilder()
315 .setIpv4Ero(new Ipv4EroBuilder()
316 .setLoose(Boolean.FALSE)
317 .setAddress(new Ipv4AddressNoZone("9.8.7.6"))
321 bindingSubTlvs.add(new BindingSubTlvsBuilder()
322 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
323 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
324 .setLoose(Boolean.FALSE)
325 .setRouterId(Uint32.valueOf(16843009L))
326 .setInterfaceId(Uint32.valueOf(33686018L))
330 bindingSubTlvs.add(new BindingSubTlvsBuilder()
331 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
332 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
333 .setLoose(Boolean.FALSE).setAddress(new Ipv4AddressNoZone("3.4.5.6"))
337 bindingSubTlvs.add(new BindingSubTlvsBuilder()
338 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
339 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
340 .setLoose(Boolean.FALSE)
341 .setRouterId(Uint32.valueOf(50529027L))
342 .setInterfaceId(Uint32.valueOf(67372036L))
349 public void testRangeTlvIpv6() {
350 final byte[] tested = Bytes.concat(
353 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
355 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
356 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
358 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
360 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
361 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
362 bindingSubTlvs.add(new BindingSubTlvsBuilder()
363 .setBindingSubTlv(new Ipv6EroCaseBuilder()
364 .setIpv6Ero(new Ipv6EroBuilder()
365 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_A))
369 bindingSubTlvs.add(new BindingSubTlvsBuilder()
370 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
371 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
372 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_B))
376 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
377 new BindingSidTlvCaseBuilder()
378 .setWeight(new Weight(Uint8.valueOf(5)))
379 .setFlags(BINDING_FLAGS)
380 .setBindingSubTlvs(bindingSubTlvs).build()).build());
381 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
382 .setSubTlvs(rangeSubTlvs).build();
384 assertEquals(expected, parsedRange);
386 final ByteBuf serializedRange = Unpooled.buffer();
387 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
388 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
391 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
393 public void testSrAdjId() {
394 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
395 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
396 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
397 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
398 .setFlags(ISIS_ADJ_FLAGS)
399 .setWeight(new Weight(Uint8.TEN))
400 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
401 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
402 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
403 .setFlags(OSPF_ADJ_FLAGS)
404 .setWeight(new Weight(Uint8.TEN))
405 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
406 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
408 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
409 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
410 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
411 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
412 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
413 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
414 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
415 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
419 public void testSrLanAdjIdOspf() {
420 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
421 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
422 .setFlags(OSPF_LAN_ADJ_FLAGS)
423 .setWeight(new Weight(Uint8.TEN))
424 .setNeighborId(new Ipv4AddressNoZone("1.2.3.4"))
425 .setSidLabelIndex(new LocalLabelCaseBuilder()
426 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
429 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
430 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
431 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
432 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
436 public void testSrLanAdjIdIsis() {
437 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,
439 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
440 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
441 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
442 .setFlags(ISIS_ADJ_FLAGS)
443 .setWeight(new Weight(Uint8.TEN))
444 .setIsoSystemId(new IsoSystemIdentifier(systemId))
445 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
446 Unpooled.copiedBuffer(sidLabel))).build()).build();
447 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
448 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
449 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
450 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));