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.primitives.Bytes;
14 import io.netty.buffer.ByteBuf;
15 import io.netty.buffer.Unpooled;
16 import java.util.ArrayList;
17 import java.util.List;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.protocol.bgp.linkstate.impl.BGPActivator;
22 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.Ipv6SrPrefixAttributesParser;
23 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.RangeTlvParser;
24 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrLinkAttributesParser;
25 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrNodeAttributesParser;
26 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.SrPrefixAttributesParser;
27 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
28 import org.opendaylight.protocol.bgp.parser.spi.pojo.SimpleBGPExtensionProviderContext;
29 import org.opendaylight.protocol.rsvp.parser.spi.pojo.SimpleRSVPExtensionProviderContext;
30 import org.opendaylight.protocol.util.ByteArray;
31 import org.opendaylight.protocol.util.Ipv6Util;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6AddressNoZone;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.types.rev171204.Uint24;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrAdjIds;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrAdjIdsBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrLanAdjIds;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.linkstate.attribute.SrLanAdjIdsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrAlgorithm;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrAlgorithmBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrCapabilities;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.node.state.SrCapabilitiesBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.Ipv6SrPrefix;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.Ipv6SrPrefixBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrPrefix;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrPrefixBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrRange;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrRangeBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Algorithm;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Weight;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.IsisAdjFlagsCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.IsisAdjFlagsCaseBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.OspfAdjFlagsCase;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.adj.flags.flags.OspfAdjFlagsCaseBuilder;
57 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;
58 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;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvsBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.EroMetricCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.PrefixSidCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.SidLabelCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCaseBuilder;
72 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;
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.backup._case.Ipv4EroBackupBuilder;
74 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;
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.backup._case.Ipv6EroBackupBuilder;
76 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;
77 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;
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.ero._case.UnnumberedInterfaceIdEroBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.IsisPrefixFlagsCase;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.IsisPrefixFlagsCaseBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.OspfPrefixFlagsCase;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.prefix.sid.tlv.flags.OspfPrefixFlagsCaseBuilder;
83 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;
84 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;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.BindingSidTlvCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.PrefixSidTlvCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.sub.tlvs.range.sub.tlv.SidLabelTlvCaseBuilder;
88 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;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.tlv.SubTlvs;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.range.tlv.SubTlvsBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.sid.label.index.sid.label.index.Ipv6AddressCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.sid.label.index.sid.label.index.LocalLabelCaseBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.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.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(new SimpleRSVPExtensionProviderContext());
155 final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
160 public void testSrAlgorithm() {
161 final byte[] bytes = { 0 };
162 final SrAlgorithm alg = new SrAlgorithmBuilder().setAlgorithms(Set.of(Algorithm.ShortestPathFirst)).build();
163 final SrAlgorithm empty = new SrAlgorithmBuilder().setAlgorithms(Set.of()).build();
164 assertEquals(alg, SrNodeAttributesParser.parseSrAlgorithms(Unpooled.wrappedBuffer(bytes)));
165 final ByteBuf b = Unpooled.buffer();
166 assertEquals(empty, SrNodeAttributesParser.parseSrAlgorithms(b));
167 SrNodeAttributesParser.serializeSrAlgorithms(alg, b);
168 assertArrayEquals(bytes, ByteArray.readAllBytes(b));
170 SrNodeAttributesParser.serializeSrAlgorithms(empty, b);
171 assertEquals(0, b.readableBytes());
174 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.1.1
176 public void testSrCapabilities() {
177 final byte[] bytesIsis = { (byte)0xC0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
178 final byte[] bytesOspf = { 0, 0, 0, 0, 10, 4, (byte)0x89, 0, 4, 1, 2, 3, 4 };
179 final SrCapabilities capsIsis = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.TRUE).setMplsIpv6(Boolean.TRUE)
180 .setSrIpv6(Boolean.FALSE)
181 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
182 .setRangeSize(new Uint24(Uint32.TEN)).build();
183 final SrCapabilities capsOspf = new SrCapabilitiesBuilder().setMplsIpv4(Boolean.FALSE)
184 .setMplsIpv6(Boolean.FALSE).setSrIpv6(Boolean.FALSE)
185 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
186 .setRangeSize(new Uint24(Uint32.TEN)).build();
187 assertEquals(capsIsis,
188 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.IsisLevel1));
189 assertEquals(capsOspf,
190 SrNodeAttributesParser.parseSrCapabilities(Unpooled.wrappedBuffer(bytesIsis), ProtocolId.Ospf));
191 final ByteBuf encodedIsis = Unpooled.buffer();
192 final ByteBuf encodedOspf = Unpooled.buffer();
193 SrNodeAttributesParser.serializeSrCapabilities(capsIsis, encodedIsis);
194 SrNodeAttributesParser.serializeSrCapabilities(capsOspf, encodedOspf);
195 assertArrayEquals(bytesIsis, ByteArray.readAllBytes(encodedIsis));
196 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(encodedOspf));
199 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.1
201 public void testSrPrefix() {
202 final byte[] bytes = { (byte)0xA0, 0, 0, 0, 1, 2, 3, 4 };
203 final byte[] bytesOspf = { (byte)0x20, 0, 0, 0, 1, 2, 3, 4 };
204 final SrPrefix prefixIsis = new SrPrefixBuilder()
205 .setFlags(ISIS_PREFIX_FLAGS)
206 .setAlgorithm(Algorithm.ShortestPathFirst)
207 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
209 final SrPrefix prefixOspf = new SrPrefixBuilder()
210 .setFlags(OSPF_PREFIX_FLAGS)
211 .setAlgorithm(Algorithm.ShortestPathFirst)
212 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
214 assertEquals(prefixIsis,
215 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.IsisLevel1));
216 assertEquals(prefixOspf,
217 SrPrefixAttributesParser.parseSrPrefix(Unpooled.wrappedBuffer(bytes), ProtocolId.Ospf));
218 final ByteBuf serializedPrefix = Unpooled.buffer();
219 final ByteBuf serializedPrefixOspf = Unpooled.buffer();
220 SrPrefixAttributesParser.serializeSrPrefix(prefixIsis, serializedPrefix);
221 SrPrefixAttributesParser.serializeSrPrefix(prefixOspf, serializedPrefixOspf);
222 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
223 assertArrayEquals(bytesOspf, ByteArray.readAllBytes(serializedPrefixOspf));
226 // https://tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-02#section-2.3.2
228 public void testIpv6SrPrefix() {
229 final byte[] bytes = { 0, 0, 0};
230 final Ipv6SrPrefix prefix = new Ipv6SrPrefixBuilder().setAlgorithm(Algorithm.ShortestPathFirst).build();
231 assertEquals(prefix, Ipv6SrPrefixAttributesParser.parseSrIpv6Prefix(Unpooled.wrappedBuffer(bytes)));
232 final ByteBuf serializedPrefix = Unpooled.buffer();
233 Ipv6SrPrefixAttributesParser.serializeIpv6SrPrefix(prefix, serializedPrefix);
234 assertArrayEquals(bytes, ByteArray.readAllBytes(serializedPrefix));
237 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.3.2
239 public void testRangeTlv() {
240 final byte[] tested = {
242 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
243 4, (byte)0x86, 0, 7, (byte)0xac, 1, 0, 0, 1, 2, 0, // prefix + mpls label
244 4, (byte)0x88, 0, 0x58, 5, 0x48, 0, 0, // binding sid
246 4, (byte)0x86, 0, 8, (byte)0xa0, 1, 0, 0, 1, 2, 3, 4, // prefix
247 4, (byte)0x89, 0, 4, 1, 2, 3, 4, // sid
248 4, (byte)0x8a, 0, 4, 0, 0, 0, 6, // ero metric
249 4, (byte)0x8b, 0, 8, 0, 0, 0, 0, 9, 8, 7, 6, // IPv4 ERO
250 4, (byte)0x8d, 0, 0x0c, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, // Unnumbered Interface ID ERO Sub-TLV
251 4, (byte)0x8e, 0, 8, 0, 0, 0, 0, 3, 4, 5, 6, // IPv4 ERO backup
252 4, (byte)0x90, 0, 0x0c, 0, 0, 0, 0, 3, 3, 3, 3, 4, 4, 4, 4, // Unnumbered Interface ID ERO Sub-TLV Backup
254 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
256 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
257 addSubTlvs(rangeSubTlvs);
258 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
259 .setSubTlvs(rangeSubTlvs).build();
261 assertEquals(expected, parsedRange);
263 final ByteBuf serializedRange = Unpooled.buffer();
264 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
265 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
268 private static void addSubTlvs(final List<SubTlvs> rangeSubTlvs) {
269 rangeSubTlvs.add(new SubTlvsBuilder()
270 .setRangeSubTlv(new SidLabelTlvCaseBuilder()
271 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
274 rangeSubTlvs.add(new SubTlvsBuilder()
275 .setRangeSubTlv(new PrefixSidTlvCaseBuilder()
276 .setPrefixSidTlv(new PrefixSidTlvBuilder()
277 .setFlags(ISIS_PREFIX_FLAGS)
278 .setAlgorithm(Algorithm.StrictShortestPathFirst)
279 .setSidLabelIndex(new LocalLabelCaseBuilder()
280 .setLocalLabel(new MplsLabel(Uint32.valueOf(66048)))
285 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
286 addBindingSubTlvs(bindingSubTlvs);
287 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
288 new BindingSidTlvCaseBuilder()
289 .setWeight(new Weight(Uint8.valueOf(5)))
290 .setFlags(BINDING_FLAGS)
291 .setBindingSubTlvs(bindingSubTlvs).build()).build());
294 private static void addBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs) {
295 bindingSubTlvs.add(new BindingSubTlvsBuilder()
296 .setBindingSubTlv(new PrefixSidCaseBuilder()
297 .setPrefixSid(new PrefixSidBuilder()
298 .setFlags(ISIS_PREFIX_FLAGS)
299 .setAlgorithm(Algorithm.StrictShortestPathFirst)
300 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
304 bindingSubTlvs.add(new BindingSubTlvsBuilder()
305 .setBindingSubTlv(new SidLabelCaseBuilder()
306 .setSidLabelIndex(new SidCaseBuilder().setSid(Uint32.valueOf(16909060L)).build())
309 bindingSubTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(
310 new EroMetricCaseBuilder().setEroMetric(new TeMetric(Uint32.valueOf(6))).build()).build());
311 bindingSubTlvs.add(new BindingSubTlvsBuilder()
312 .setBindingSubTlv(new Ipv4EroCaseBuilder()
313 .setIpv4Ero(new Ipv4EroBuilder()
314 .setLoose(Boolean.FALSE)
315 .setAddress(new Ipv4AddressNoZone("9.8.7.6"))
319 bindingSubTlvs.add(new BindingSubTlvsBuilder()
320 .setBindingSubTlv(new UnnumberedInterfaceIdEroCaseBuilder()
321 .setUnnumberedInterfaceIdEro(new UnnumberedInterfaceIdEroBuilder()
322 .setLoose(Boolean.FALSE)
323 .setRouterId(Uint32.valueOf(16843009L))
324 .setInterfaceId(Uint32.valueOf(33686018L))
328 bindingSubTlvs.add(new BindingSubTlvsBuilder()
329 .setBindingSubTlv(new Ipv4EroBackupCaseBuilder()
330 .setIpv4EroBackup(new Ipv4EroBackupBuilder()
331 .setLoose(Boolean.FALSE).setAddress(new Ipv4AddressNoZone("3.4.5.6"))
335 bindingSubTlvs.add(new BindingSubTlvsBuilder()
336 .setBindingSubTlv(new UnnumberedInterfaceIdBackupEroCaseBuilder()
337 .setUnnumberedInterfaceIdBackupEro(new UnnumberedInterfaceIdBackupEroBuilder()
338 .setLoose(Boolean.FALSE)
339 .setRouterId(Uint32.valueOf(50529027L))
340 .setInterfaceId(Uint32.valueOf(67372036L))
347 public void testRangeTlvIpv6() {
348 final byte[] tested = Bytes.concat(
351 4, (byte)0x88, 0, 0x34, 5, 0x48, 0, 0, // binding sid
353 4, (byte)0x8c, 0, 0x14, 0, 0, 0, 0 }, IPV6_A_BYTES, // IPv6 ERO
354 new byte[] { 4, (byte)0x8f, 0, 0x14, 0, 0, 0, 0 }, IPV6_B_BYTES // IPv6 ERO backup
356 final SrRange parsedRange = RangeTlvParser.parseSrRange(Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1);
358 final List<SubTlvs> rangeSubTlvs = new ArrayList<>();
359 final List<BindingSubTlvs> bindingSubTlvs = new ArrayList<>();
360 bindingSubTlvs.add(new BindingSubTlvsBuilder()
361 .setBindingSubTlv(new Ipv6EroCaseBuilder()
362 .setIpv6Ero(new Ipv6EroBuilder()
363 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_A))
367 bindingSubTlvs.add(new BindingSubTlvsBuilder()
368 .setBindingSubTlv(new Ipv6EroBackupCaseBuilder()
369 .setIpv6EroBackup(new Ipv6EroBackupBuilder()
370 .setLoose(Boolean.FALSE).setAddress(new Ipv6AddressNoZone(IPV6_B))
374 rangeSubTlvs.add(new SubTlvsBuilder().setRangeSubTlv(
375 new BindingSidTlvCaseBuilder()
376 .setWeight(new Weight(Uint8.valueOf(5)))
377 .setFlags(BINDING_FLAGS)
378 .setBindingSubTlvs(bindingSubTlvs).build()).build());
379 final SrRange expected = new SrRangeBuilder().setInterArea(Boolean.FALSE).setRangeSize(Uint16.valueOf(5))
380 .setSubTlvs(rangeSubTlvs).build();
382 assertEquals(expected, parsedRange);
384 final ByteBuf serializedRange = Unpooled.buffer();
385 RangeTlvParser.serializeSrRange(parsedRange, serializedRange);
386 assertArrayEquals(tested, ByteArray.getAllBytes(serializedRange));
389 // tools.ietf.org/html/draft-gredler-idr-bgp-ls-segment-routing-ext-00#section-2.2.1
391 public void testSrAdjId() {
392 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
393 final byte[] testedOspf = { (byte)0xc0, 10, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
394 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
395 final SrAdjIds srAdjId = new SrAdjIdsBuilder()
396 .setFlags(ISIS_ADJ_FLAGS)
397 .setWeight(new Weight(Uint8.TEN))
398 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
399 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
400 final SrAdjIds ospfAdj = new SrAdjIdsBuilder()
401 .setFlags(OSPF_ADJ_FLAGS)
402 .setWeight(new Weight(Uint8.TEN))
403 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(
404 Ipv6Util.addressForByteBuf(Unpooled.copiedBuffer(sidLabel))).build()).build();
406 assertEquals(srAdjId, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
407 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1)).build());
408 assertEquals(ospfAdj, new SrAdjIdsBuilder(SrLinkAttributesParser.parseAdjacencySegmentIdentifier(
409 Unpooled.wrappedBuffer(testedOspf), ProtocolId.Ospf)).build());
410 final ByteBuf serializedData = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(srAdjId);
411 final ByteBuf serializedOspf = SrLinkAttributesParser.serializeAdjacencySegmentIdentifier(ospfAdj);
412 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
413 assertArrayEquals(testedOspf, ByteArray.readAllBytes(serializedOspf));
417 public void testSrLanAdjIdOspf() {
418 final byte[] tested = { (byte)0x60, 10, 0, 0, 1, 2, 3, 4, 0, 0x5d, (byte)0xc0 };
419 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
420 .setFlags(OSPF_LAN_ADJ_FLAGS)
421 .setWeight(new Weight(Uint8.TEN))
422 .setNeighborId(new Ipv4AddressNoZone("1.2.3.4"))
423 .setSidLabelIndex(new LocalLabelCaseBuilder()
424 .setLocalLabel(new MplsLabel(Uint32.valueOf(24000L)))
427 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
428 Unpooled.wrappedBuffer(tested), ProtocolId.Ospf));
429 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
430 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));
434 public void testSrLanAdjIdIsis() {
435 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,
437 final byte[] sidLabel = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
438 final byte[] systemId = { 1, 2, 3, 4, 5, 6 };
439 final SrLanAdjIds srLanAdjId = new SrLanAdjIdsBuilder()
440 .setFlags(ISIS_ADJ_FLAGS)
441 .setWeight(new Weight(Uint8.TEN))
442 .setIsoSystemId(new IsoSystemIdentifier(systemId))
443 .setSidLabelIndex(new Ipv6AddressCaseBuilder().setIpv6Address(Ipv6Util.addressForByteBuf(
444 Unpooled.copiedBuffer(sidLabel))).build()).build();
445 assertEquals(srLanAdjId, SrLinkAttributesParser.parseLanAdjacencySegmentIdentifier(
446 Unpooled.wrappedBuffer(tested), ProtocolId.IsisLevel1));
447 final ByteBuf serializedData = SrLinkAttributesParser.serializeLanAdjacencySegmentIdentifier(srLanAdjId);
448 assertArrayEquals(tested, ByteArray.readAllBytes(serializedData));