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.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.ProtocolId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrAdjIds;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrAdjIdsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrLanAdjIds;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.attribute.SrLanAdjIdsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrAlgorithm;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrAlgorithmBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrCapabilities;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.state.SrCapabilitiesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.Ipv6SrPrefix;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.Ipv6SrPrefixBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrPrefix;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrPrefixBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrRange;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.prefix.state.SrRangeBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Algorithm;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Weight;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.IsisAdjFlagsCaseBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.OspfAdjFlagsCase;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.adj.flags.flags.OspfAdjFlagsCaseBuilder;
57 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;
58 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;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.BindingSubTlvs;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.BindingSubTlvsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.flags.IsisBindingFlagsCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.EroMetricCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.PrefixSidCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.SidLabelCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCaseBuilder;
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._case.Ipv4EroBuilder;
73 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;
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._case.Ipv6EroBuilder;
75 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;
76 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;
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.backup.ero._case.UnnumberedInterfaceIdBackupEroBuilder;
78 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;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCase;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCaseBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCase;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCaseBuilder;
83 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;
84 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;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.BindingSidTlvCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.sub.tlvs.range.sub.tlv.SidLabelTlvCaseBuilder;
88 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;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.tlv.SubTlvs;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.range.tlv.SubTlvsBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.Ipv6AddressCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.LocalLabelCaseBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.sid.label.index.SidCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.MplsLabel;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.TeMetric;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.uint24.rev200104.Uint24;
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(true,
156 ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
157 final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
162 public void testSrAlgorithm() {
163 final byte[] bytes = { 0 };
164 final SrAlgorithm alg = new SrAlgorithmBuilder().setAlgorithms(Lists.newArrayList(Algorithm.ShortestPathFirst))
166 final SrAlgorithm empty = new SrAlgorithmBuilder().setAlgorithms(Collections.emptyList()).build();
167 assertEquals(alg, SrNodeAttributesParser.parseSrAlgorithms(Unpooled.wrappedBuffer(bytes)));
168 final ByteBuf b = Unpooled.buffer();
169 assertEquals(empty, SrNodeAttributesParser.parseSrAlgorithms(b));
170 SrNodeAttributesParser.serializeSrAlgorithms(alg, b);
171 assertArrayEquals(bytes, ByteArray.readAllBytes(b));
173 SrNodeAttributesParser.serializeSrAlgorithms(empty, b);
174 assertEquals(0, b.readableBytes());
177 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.1.1
179 public void testSrCapabilities() {
180 final byte[] bytesIsis = { (byte)0xC0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
181 final byte[] bytesOspf = { 0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
182 final SrCapabilities capsIsis = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.TRUE).setMplsIpv6(Boolean.TRUE)
183 .setSrIpv6(Boolean.FALSE)
184 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
185 .setRangeSize(new Uint24(Uint32.TEN)).build();
186 final SrCapabilities capsOspf = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.FALSE)
187 .setMplsIpv6(Boolean.FALSE).setSrIpv6(Boolean.FALSE)
188 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
189 .setRangeSize(new Uint24(Uint32.TEN)).build();
190 assertEquals(capsIsis,
191 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.IsisLevel1));
192 assertEquals(capsOspf,
193 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.Ospf));
194 final ByteBuf encodedIsis = Unpooled.buffer();
195 final ByteBuf encodedOspf = Unpooled.buffer();
196 SrNodeAttributesParser.serializeSrCapabilities(capsIsis, encodedIsis);
197 SrNodeAttributesParser.serializeSrCapabilities(capsOspf, encodedOspf);
198 assertArrayEquals(bytesIsis, ByteArray.readAllBytes(encodedIsis));
199 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(encodedOspf));
202 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.1
204 public void testSrPrefix() {
205 final byte[] bytes = { (byte)0xA0, 0, 0, 0, 1, 2, 3, 4 };
206 final byte[] bytesOspf = { (byte)0x20, 0, 0, 0, 1, 2, 3, 4 };
207 final SrPrefix prefixIsis = new SrPrefixBuilder()
208 .setFlags(ISIS_PREFIX_FLAGS)
209 .setAlgorithm(Algorithm.ShortestPathFirst)
210 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
212 final SrPrefix prefixOspf = new SrPrefixBuilder()
213 .setFlags(OSPF_PREFIX_FLAGS)
214 .setAlgorithm(Algorithm.ShortestPathFirst)
215 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
217 assertEquals(prefixIsis,
218 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.IsisLevel1));
219 assertEquals(prefixOspf,
220 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.Ospf));
221 final ByteBuf serializedPrefix = Unpooled.buffer();
222 final ByteBuf serializedPrefixOspf = Unpooled.buffer();
223 SrPrefixAttributesParser.serializeSrPrefix(prefixIsis, serializedPrefix);
224 SrPrefixAttributesParser.serializeSrPrefix(prefixOspf, serializedPrefixOspf);
225 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
226 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
229 // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
231 public void testIpv6SrPrefix() {
232 final byte[] bytes = { 0, 0, 0};
233 final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
234 assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
235 final ByteBuf serializedPrefix = Unpooled.buffer();
236 Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
237 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
240 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
242 public void testRangeTlv() {
243 final byte[] tested = {
245 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
246 4, (byte)0x86, 0, 7, (byte)0xac, 1, 0, 0, 1, 2, 0, // prefix + mpls label
247 4, (byte)0x88, 0, 0x58, 5, 0x48, 0, 0, // binding sid
249 4, (byte)0x86, 0, 8, (byte)0xa0, 1, 0, 0, 1, 2, 3, 4, // prefix
250 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
251 4, (byte)0x8a, 0, 4, 0, 0, 0, 6, // ero metric
252 4, (byte)0x8b, 0, 8, 0, 0, 0, 0, 9, 8, 7, 6, // IPv4 ERO
253 4, (byte)0x8d, 0, 0x0c, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, // Unnumbered Interface ID ERO Sub-TLV
254 4, (byte)0x8e, 0, 8, 0, 0, 0, 0, 3, 4, 5, 6, // IPv4 ERO backup
255 4, (byte)0x90, 0, 0x0c, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, // Unnumbered Interface ID ERO Sub-TLV Backup
257 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
259 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
260 addSubTlvs(rangeSubTlvs);
261 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
262 .setSubTlvs(rangeSubTlvs).build();
264 assertEquals(expected, parsedRange);
266 final ByteBuf serializedRange = Unpooled.buffer();
267 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
268 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
271 private static void addSubTlvs(final List<SubTlvs> rangeSubTlvs) {
272 rangeSubTlvs.add(new SubTlvsBuilder()
273 .setRangeSubTlv(new SidLabelTlvCaseBuilder()
274 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
277 rangeSubTlvs.add(new SubTlvsBuilder()
278 .setRangeSubTlv(new PrefixSidTlvCaseBuilder()
279 .setPrefixSidTlv(new PrefixSidTlvBuilder()
280 .setFlags(ISIS_PREFIX_FLAGS)
281 .setAlgorithm(Algorithm.StrictShortestPathFirst)
282 .setSidLabelIndex(new LocalLabelCaseBuilder()
283 .setLocalLabel(new MplsLabel(Uint32.valueOf(66048)))
288 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
289 addBindingSubTlvs(bindingSubTlvs);
290 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
291 new BindingSidTlvCaseBuilder()
292 .setWeight(new Weight(Uint8.valueOf(5)))
293 .setFlags(BINDING_FLAGS)
294 .setBindingSubTlvs(bindingSubTlvs).build()).build());
297 private static void addBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs) {
298 bindingSubTlvs.add(new BindingSubTlvsBuilder()
299 .setBindingSubTlv(new PrefixSidCaseBuilder()
300 .setPrefixSid(new PrefixSidBuilder()
301 .setFlags(ISIS_PREFIX_FLAGS)
302 .setAlgorithm(Algorithm.StrictShortestPathFirst)
303 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
307 bindingSubTlvs.add(new BindingSubTlvsBuilder()
308 .setBindingSubTlv(new SidLabelCaseBuilder()
309 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
312 bindingSubTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(
313 new EroMetricCaseBuilder().setEroMetric(new TeMetric(Uint32.valueOf(6))).build()).build());
314 bindingSubTlvs.add(new BindingSubTlvsBuilder()
315 .setBindingSubTlv(new Ipv4EroCaseBuilder()
316 .setIpv4Ero(new Ipv4EroBuilder()
317 .setLoose(Boolean.FALSE)
318 .setAddress(new Ipv4AddressNoZone("9.8.7.6"))
322 bindingSubTlvs.add(new BindingSubTlvsBuilder()
323 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
324 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
325 .setLoose(Boolean.FALSE)
326 .setRouterId(Uint32.valueOf(16843009L))
327 .setInterfaceId(Uint32.valueOf(33686018L))
331 bindingSubTlvs.add(new BindingSubTlvsBuilder()
332 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
333 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
334 .setLoose(Boolean.FALSE).setAddress(new Ipv4AddressNoZone("3.4.5.6"))
338 bindingSubTlvs.add(new BindingSubTlvsBuilder()
339 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
340 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
341 .setLoose(Boolean.FALSE)
342 .setRouterId(Uint32.valueOf(50529027L))
343 .setInterfaceId(Uint32.valueOf(67372036L))
350 public void testRangeTlvIpv6() {
351 final byte[] tested = Bytes.concat(
354 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
356 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
357 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
359 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
361 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
362 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
363 bindingSubTlvs.add(new BindingSubTlvsBuilder()
364 .setBindingSubTlv(new Ipv6EroCaseBuilder()
365 .setIpv6Ero(new Ipv6EroBuilder()
366 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_A))
370 bindingSubTlvs.add(new BindingSubTlvsBuilder()
371 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
372 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
373 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_B))
377 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
378 new BindingSidTlvCaseBuilder()
379 .setWeight(new Weight(Uint8.valueOf(5)))
380 .setFlags(BINDING_FLAGS)
381 .setBindingSubTlvs(bindingSubTlvs).build()).build());
382 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
383 .setSubTlvs(rangeSubTlvs).build();
385 assertEquals(expected, parsedRange);
387 final ByteBuf serializedRange = Unpooled.buffer();
388 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
389 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
392 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
394 public void testSrAdjId() {
395 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
396 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
397 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
398 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
399 .setFlags(ISIS_ADJ_FLAGS)
400 .setWeight(new Weight(Uint8.TEN))
401 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
402 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
403 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
404 .setFlags(OSPF_ADJ_FLAGS)
405 .setWeight(new Weight(Uint8.TEN))
406 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
407 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
409 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
410 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
411 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
412 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
413 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
414 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
415 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
416 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
420 public void testSrLanAdjIdOspf() {
421 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
422 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
423 .setFlags(OSPF_LAN_ADJ_FLAGS)
424 .setWeight(new Weight(Uint8.TEN))
425 .setNeighborId(new Ipv4AddressNoZone("1.2.3.4"))
426 .setSidLabelIndex(new LocalLabelCaseBuilder()
427 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
430 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
431 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
432 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
433 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
437 public void testSrLanAdjIdIsis() {
438 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,
440 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
441 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
442 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
443 .setFlags(ISIS_ADJ_FLAGS)
444 .setWeight(new Weight(Uint8.TEN))
445 .setIsoSystemId(new IsoSystemIdentifier(systemId))
446 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
447 Unpooled.copiedBuffer(sidLabel))).build()).build();
448 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
449 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
450 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
451 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));