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.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.uint24.rev200104.Uint24;
97 import org.opendaylight.yangtools.yang.common.Uint16;
98 import org.opendaylight.yangtools.yang.common.Uint32;
99 import org.opendaylight.yangtools.yang.common.Uint8;
101 public class SrAttributeParserTest {
103 private static final byte[] IPV6_A_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
104 private static final Ipv6Address IPV6_A = new Ipv6Address("2001:db8::1");
105 private static final byte[] IPV6_B_BYTES = { 0x20, 1, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
106 private static final Ipv6Address IPV6_B = new Ipv6Address("2001:db8::2");
108 private static final IsisPrefixFlagsCase ISIS_PREFIX_FLAGS = new IsisPrefixFlagsCaseBuilder()
109 .setIsisPrefixFlags(new IsisPrefixFlagsBuilder()
110 .setReadvertisement(Boolean.TRUE)
111 .setNodeSid(Boolean.FALSE)
112 .setNoPhp(Boolean.TRUE)
113 .setExplicitNull(Boolean.FALSE)
116 private static final OspfPrefixFlagsCase OSPF_PREFIX_FLAGS = new OspfPrefixFlagsCaseBuilder()
117 .setOspfPrefixFlags(new OspfPrefixFlagsBuilder()
118 .setNoPhp(Boolean.FALSE)
119 .setMappingServer(Boolean.TRUE)
120 .setExplicitNull(Boolean.FALSE)
124 private static final IsisBindingFlagsCase BINDING_FLAGS = new IsisBindingFlagsCaseBuilder()
125 .setAddressFamily(Boolean.FALSE)
126 .setMirrorContext(Boolean.TRUE)
127 .setSpreadTlv(Boolean.FALSE)
128 .setLeakedFromLevel2(Boolean.FALSE)
129 .setAttachedFlag(Boolean.TRUE)
132 private static final IsisAdjFlagsCase ISIS_ADJ_FLAGS = new IsisAdjFlagsCaseBuilder()
133 .setIsisAdjFlags(new IsisAdjFlagsBuilder()
134 .setAddressFamily(Boolean.FALSE)
135 .setBackup(Boolean.TRUE)
136 .setSet(Boolean.FALSE)
139 private static final OspfAdjFlagsCase OSPF_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
140 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
141 .setBackup(Boolean.TRUE)
142 .setSet(Boolean.FALSE)
145 private static final OspfAdjFlagsCase OSPF_LAN_ADJ_FLAGS = new OspfAdjFlagsCaseBuilder()
146 .setOspfAdjFlags(new OspfAdjFlagsBuilder()
147 .setBackup(Boolean.FALSE)
148 .setSet(Boolean.FALSE)
153 public void setUp() throws Exception {
154 final BGPActivator act = new BGPActivator(true,
155 ServiceLoaderRSVPExtensionProviderContext.getSingletonInstance().getRsvpRegistry());
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().setLoose(Boolean.FALSE).setAddress(new Ipv4Address("9.8.7.6")).build())
318 bindingSubTlvs.add(new BindingSubTlvsBuilder()
319 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
320 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
321 .setLoose(Boolean.FALSE)
322 .setRouterId(Uint32.valueOf(16843009L))
323 .setInterfaceId(Uint32.valueOf(33686018L))
327 bindingSubTlvs.add(new BindingSubTlvsBuilder()
328 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
329 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
330 .setLoose(Boolean.FALSE).setAddress(new Ipv4Address("3.4.5.6"))
334 bindingSubTlvs.add(new BindingSubTlvsBuilder()
335 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
336 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
337 .setLoose(Boolean.FALSE)
338 .setRouterId(Uint32.valueOf(50529027L))
339 .setInterfaceId(Uint32.valueOf(67372036L))
346 public void testRangeTlvIpv6() {
347 final byte[] tested = Bytes.concat(
350 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
352 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
353 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
355 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
357 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
358 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
359 bindingSubTlvs.add(new BindingSubTlvsBuilder()
360 .setBindingSubTlv(new Ipv6EroCaseBuilder()
361 .setIpv6Ero(new Ipv6EroBuilder()
362 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_A))
366 bindingSubTlvs.add(new BindingSubTlvsBuilder()
367 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
368 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
369 .setLoose(Boolean.FALSE).setAddress(new Ipv6Address(IPV6_B))
373 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
374 new BindingSidTlvCaseBuilder()
375 .setWeight(new Weight(Uint8.valueOf(5)))
376 .setFlags(BINDING_FLAGS)
377 .setBindingSubTlvs(bindingSubTlvs).build()).build());
378 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
379 .setSubTlvs(rangeSubTlvs).build();
381 assertEquals(expected, parsedRange);
383 final ByteBuf serializedRange = Unpooled.buffer();
384 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
385 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
388 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
390 public void testSrAdjId() {
391 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
392 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
393 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
394 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
395 .setFlags(ISIS_ADJ_FLAGS)
396 .setWeight(new Weight(Uint8.TEN))
397 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
398 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
399 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
400 .setFlags(OSPF_ADJ_FLAGS)
401 .setWeight(new Weight(Uint8.TEN))
402 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
403 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
405 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
406 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
407 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
408 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
409 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
410 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
411 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
412 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
416 public void testSrLanAdjIdOspf() {
417 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
418 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
419 .setFlags(OSPF_LAN_ADJ_FLAGS)
420 .setWeight(new Weight(Uint8.TEN))
421 .setNeighborId(new Ipv4Address("1.2.3.4"))
422 .setSidLabelIndex(new LocalLabelCaseBuilder()
423 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
426 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
427 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
428 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
429 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
433 public void testSrLanAdjIdIsis() {
434 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,
436 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
437 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
438 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
439 .setFlags(ISIS_ADJ_FLAGS)
440 .setWeight(new Weight(Uint8.TEN))
441 .setIsoSystemId(new IsoSystemIdentifier(systemId))
442 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
443 Unpooled.copiedBuffer(sidLabel))).build()).build();
444 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
445 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
446 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
447 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));