2 * Copyright (c) 2016 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.impl;
10 import java.util.ArrayList;
11 import java.util.List;
12 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.LinkstateAttributeParser;
13 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.BackupUnnumberedParser;
14 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.EroMetricParser;
15 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4BackupEro;
16 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4EroParser;
17 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4PrefixSidParser;
18 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6BackupEro;
19 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6EroParser;
20 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6PrefixSidParser;
21 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.SIDParser;
22 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.UnnumberedEroParser;
23 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.Ipv4PrefixNlriParser;
24 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.Ipv6PrefixNlriParser;
25 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.LinkNlriParser;
26 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.LinkstateNlriParser;
27 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.NodeNlriParser;
28 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.TeLspIpv4NlriParser;
29 import org.opendaylight.protocol.bgp.linkstate.impl.nlri.TeLspIpv6NlriParser;
30 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AdvertisingNodeDescriptorTlvParser;
31 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AreaIdTlvParser;
32 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.AsNumTlvParser;
33 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.BgpRouterIdTlvParser;
34 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.DomainIdTlvParser;
35 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv4InterfaceTlvParser;
36 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv4NeighborTlvParser;
37 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv6InterfaceTlvParser;
38 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.Ipv6NeighborTlvParser;
39 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.LinkIdTlvParser;
40 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.LocalNodeDescriptorTlvParser;
41 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.MemAsNumTlvParser;
42 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.MultiTopoIdTlvParser;
43 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.NodeDescriptorTlvParser;
44 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.OspfRouteTlvParser;
45 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.ReachTlvParser;
46 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.RemoteNodeDescriptorTlvParser;
47 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.RouterIdTlvParser;
48 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleBindingSubTlvsRegistry;
49 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleNlriTypeRegistry;
50 import org.opendaylight.protocol.bgp.parser.spi.AbstractBGPExtensionProviderActivator;
51 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
52 import org.opendaylight.protocol.bgp.parser.spi.NextHopParserSerializer;
53 import org.opendaylight.protocol.rsvp.parser.spi.RSVPTeObjectRegistry;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.Attributes1;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.LinkstateAddressFamily;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.LinkstateSubsequentAddressFamily;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.LinkCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.NodeCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.PrefixCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.object.type.TeLspCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.linkstate.routes.LinkstateRoutes;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.EroMetricCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.PrefixSidCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.SidLabelCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCase;
76 * Activator for registering linkstate extensions to BGP parser.
78 public final class BGPActivator extends AbstractBGPExtensionProviderActivator {
80 private static final int LINKSTATE_AFI = 16388;
82 private static final int LINKSTATE_SAFI = 71;
84 private final boolean ianaLinkstateAttributeType;
86 private final RSVPTeObjectRegistry rsvpTeObjectRegistry;
88 public BGPActivator() {
90 this.ianaLinkstateAttributeType = true;
91 this.rsvpTeObjectRegistry = null;
94 public BGPActivator(final boolean ianaLinkstateAttributeType, final RSVPTeObjectRegistry rsvpTeObjectRegistry) {
96 this.rsvpTeObjectRegistry = rsvpTeObjectRegistry;
97 this.ianaLinkstateAttributeType = ianaLinkstateAttributeType;
101 protected List<AutoCloseable> startImpl(final BGPExtensionProviderContext context) {
102 final List<AutoCloseable> regs = new ArrayList<>();
104 final SimpleNlriTypeRegistry nlriTypeReg = SimpleNlriTypeRegistry.getInstance();
106 regs.add(context.registerAddressFamily(LinkstateAddressFamily.class, LINKSTATE_AFI));
107 regs.add(context.registerSubsequentAddressFamily(LinkstateSubsequentAddressFamily.class, LINKSTATE_SAFI));
109 final NextHopParserSerializer linkstateNextHopParser = new NextHopParserSerializer() {
111 final LinkstateNlriParser parser = new LinkstateNlriParser();
112 regs.add(context.registerNlriParser(LinkstateAddressFamily.class, LinkstateSubsequentAddressFamily.class,
113 parser, linkstateNextHopParser, Ipv4NextHopCase.class, Ipv6NextHopCase.class));
114 regs.add(context.registerNlriSerializer(LinkstateRoutes.class, parser));
116 regs.add(context.registerAttributeSerializer(Attributes1.class, new LinkstateAttributeParser(this.ianaLinkstateAttributeType, this.rsvpTeObjectRegistry)));
117 final LinkstateAttributeParser linkstateAttributeParser = new LinkstateAttributeParser(this.ianaLinkstateAttributeType, this.rsvpTeObjectRegistry);
118 regs.add(context.registerAttributeParser(linkstateAttributeParser.getType(), linkstateAttributeParser));
120 registerNlriCodecs(regs, nlriTypeReg);
121 registerNlriTlvCodecs(regs, nlriTypeReg);
122 registerBindingSubTlvs(regs);
126 private static void registerBindingSubTlvs(final List<AutoCloseable> regs) {
127 final SimpleBindingSubTlvsRegistry simpleReg = SimpleBindingSubTlvsRegistry.getInstance();
129 final SIDParser sidParser = new SIDParser();
130 regs.add(simpleReg.registerBindingSubTlvsParser(sidParser.getType(), sidParser));
131 regs.add(simpleReg.registerBindingSubTlvsSerializer(SidLabelCase.class, sidParser));
133 final Ipv4PrefixSidParser prefixSidParser = new Ipv4PrefixSidParser();
134 regs.add(simpleReg.registerBindingSubTlvsParser(prefixSidParser.getType(), prefixSidParser));
135 regs.add(simpleReg.registerBindingSubTlvsSerializer(PrefixSidCase.class, prefixSidParser));
137 final Ipv6PrefixSidParser ipv6PrefixSidParser = new Ipv6PrefixSidParser();
138 regs.add(simpleReg.registerBindingSubTlvsParser(ipv6PrefixSidParser.getType(), ipv6PrefixSidParser));
139 regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6PrefixSidCase.class, ipv6PrefixSidParser));
141 final EroMetricParser eroMetricParser = new EroMetricParser();
142 regs.add(simpleReg.registerBindingSubTlvsParser(eroMetricParser.getType(), eroMetricParser));
143 regs.add(simpleReg.registerBindingSubTlvsSerializer(EroMetricCase.class, eroMetricParser));
145 final Ipv4EroParser ipv4EroParser = new Ipv4EroParser();
146 regs.add(simpleReg.registerBindingSubTlvsParser(ipv4EroParser.getType(), ipv4EroParser));
147 regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv4EroCase.class, ipv4EroParser));
149 final Ipv4BackupEro ipv4BackupEro = new Ipv4BackupEro();
150 regs.add(simpleReg.registerBindingSubTlvsParser(ipv4BackupEro.getType(), ipv4BackupEro));
151 regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv4EroBackupCase.class, ipv4BackupEro));
153 final Ipv6EroParser ipv6EroParser = new Ipv6EroParser();
154 regs.add(simpleReg.registerBindingSubTlvsParser(ipv6EroParser.getType(), ipv6EroParser));
155 regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6EroCase.class, ipv6EroParser));
157 final Ipv6BackupEro ipv6BackupEro = new Ipv6BackupEro();
158 regs.add(simpleReg.registerBindingSubTlvsParser(ipv6BackupEro.getType(), ipv6BackupEro));
159 regs.add(simpleReg.registerBindingSubTlvsSerializer(Ipv6EroBackupCase.class, ipv6BackupEro));
161 final UnnumberedEroParser unnumberedEroParser = new UnnumberedEroParser();
162 regs.add(simpleReg.registerBindingSubTlvsParser(unnumberedEroParser.getType(), unnumberedEroParser));
163 regs.add(simpleReg.registerBindingSubTlvsSerializer(UnnumberedInterfaceIdEroCase.class, unnumberedEroParser));
165 final BackupUnnumberedParser backupUnnumberedParser = new BackupUnnumberedParser();
166 regs.add(simpleReg.registerBindingSubTlvsParser(backupUnnumberedParser.getType(), backupUnnumberedParser));
167 regs.add(simpleReg.registerBindingSubTlvsSerializer(UnnumberedInterfaceIdBackupEroCase.class, backupUnnumberedParser));
170 private static void registerNlriCodecs(final List<AutoCloseable> regs, final SimpleNlriTypeRegistry nlriTypeReg) {
172 final NodeNlriParser nodeParser = new NodeNlriParser();
173 regs.add(nlriTypeReg.registerNlriParser(nodeParser.getNlriType(), nodeParser));
174 regs.add(nlriTypeReg.registerNlriSerializer(NodeCase.class, nodeParser));
176 final LinkNlriParser linkParser = new LinkNlriParser();
177 regs.add(nlriTypeReg.registerNlriParser(linkParser.getNlriType(), linkParser));
178 regs.add(nlriTypeReg.registerNlriSerializer(LinkCase.class, linkParser));
180 final Ipv4PrefixNlriParser ipv4PrefixParser = new Ipv4PrefixNlriParser();
181 regs.add(nlriTypeReg.registerNlriParser(ipv4PrefixParser.getNlriType(), ipv4PrefixParser));
182 regs.add(nlriTypeReg.registerNlriSerializer(PrefixCase.class, ipv4PrefixParser));
183 final Ipv6PrefixNlriParser ipv6PrefixParser = new Ipv6PrefixNlriParser();
184 regs.add(nlriTypeReg.registerNlriParser(ipv6PrefixParser.getNlriType(), ipv6PrefixParser));
186 final TeLspIpv4NlriParser teLspIpv4Parser = new TeLspIpv4NlriParser();
187 regs.add(nlriTypeReg.registerNlriParser(teLspIpv4Parser.getNlriType(), teLspIpv4Parser));
188 regs.add(nlriTypeReg.registerNlriSerializer(TeLspCase.class, teLspIpv4Parser));
189 final TeLspIpv6NlriParser teLspIpv6Parser = new TeLspIpv6NlriParser();
190 regs.add(nlriTypeReg.registerNlriParser(teLspIpv6Parser.getNlriType(), teLspIpv6Parser));
194 private static void registerNlriTlvCodecs(final List<AutoCloseable> regs, final SimpleNlriTypeRegistry nlriTypeReg) {
196 final LocalNodeDescriptorTlvParser localParser = new LocalNodeDescriptorTlvParser();
197 regs.add(nlriTypeReg.registerTlvParser(localParser.getType(), localParser));
198 regs.add(nlriTypeReg.registerTlvSerializer(localParser.getTlvQName(), localParser));
200 final NodeDescriptorTlvParser nodeParser = new NodeDescriptorTlvParser();
201 regs.add(nlriTypeReg.registerTlvSerializer(nodeParser.getTlvQName(), nodeParser));
203 final AdvertisingNodeDescriptorTlvParser advParser = new AdvertisingNodeDescriptorTlvParser();
204 regs.add(nlriTypeReg.registerTlvSerializer(advParser.getTlvQName(), advParser));
206 final RemoteNodeDescriptorTlvParser remoteParser = new RemoteNodeDescriptorTlvParser();
207 regs.add(nlriTypeReg.registerTlvParser(remoteParser.getType(), remoteParser));
208 regs.add(nlriTypeReg.registerTlvSerializer(remoteParser.getTlvQName(), remoteParser));
210 final RouterIdTlvParser bgpCrouterIdParser = new RouterIdTlvParser();
211 regs.add(nlriTypeReg.registerTlvParser(bgpCrouterIdParser.getType(), bgpCrouterIdParser));
212 regs.add(nlriTypeReg.registerTlvSerializer(bgpCrouterIdParser.getTlvQName(), bgpCrouterIdParser));
214 final AsNumTlvParser asNumParser = new AsNumTlvParser();
215 regs.add(nlriTypeReg.registerTlvParser(asNumParser.getType(), asNumParser));
216 regs.add(nlriTypeReg.registerTlvSerializer(asNumParser.getTlvQName(), asNumParser));
218 final DomainIdTlvParser bgpDomainIdParser = new DomainIdTlvParser();
219 regs.add(nlriTypeReg.registerTlvParser(bgpDomainIdParser.getType(), bgpDomainIdParser));
220 regs.add(nlriTypeReg.registerTlvSerializer(bgpDomainIdParser.getTlvQName(), bgpDomainIdParser));
222 final AreaIdTlvParser areaIdParser = new AreaIdTlvParser();
223 regs.add(nlriTypeReg.registerTlvParser(areaIdParser.getType(), areaIdParser));
224 regs.add(nlriTypeReg.registerTlvSerializer(areaIdParser.getTlvQName(), areaIdParser));
226 final BgpRouterIdTlvParser bgpRouterIdParser = new BgpRouterIdTlvParser();
227 regs.add(nlriTypeReg.registerTlvParser(bgpRouterIdParser.getType(), bgpRouterIdParser));
228 regs.add(nlriTypeReg.registerTlvSerializer(bgpRouterIdParser.getTlvQName(), bgpRouterIdParser));
230 final MemAsNumTlvParser memAsnParser = new MemAsNumTlvParser();
231 regs.add(nlriTypeReg.registerTlvParser(memAsnParser.getType(), memAsnParser));
232 regs.add(nlriTypeReg.registerTlvSerializer(memAsnParser.getTlvQName(), memAsnParser));
234 final LinkIdTlvParser linkIdParser = new LinkIdTlvParser();
235 regs.add(nlriTypeReg.registerTlvParser(linkIdParser.getType(), linkIdParser));
236 regs.add(nlriTypeReg.registerTlvSerializer(linkIdParser.getTlvQName(), linkIdParser));
238 final Ipv4NeighborTlvParser ipv4nNeighborParser = new Ipv4NeighborTlvParser();
239 regs.add(nlriTypeReg.registerTlvParser(ipv4nNeighborParser.getType(), ipv4nNeighborParser));
240 regs.add(nlriTypeReg.registerTlvSerializer(ipv4nNeighborParser.getTlvQName(), ipv4nNeighborParser));
242 final Ipv6NeighborTlvParser ipv6NeighborParser = new Ipv6NeighborTlvParser();
243 regs.add(nlriTypeReg.registerTlvParser(ipv6NeighborParser.getType(), ipv6NeighborParser));
244 regs.add(nlriTypeReg.registerTlvSerializer(ipv6NeighborParser.getTlvQName(), ipv6NeighborParser));
246 final Ipv4InterfaceTlvParser ipv4InterfaceParser = new Ipv4InterfaceTlvParser();
247 regs.add(nlriTypeReg.registerTlvParser(ipv4InterfaceParser.getType(), ipv4InterfaceParser));
248 regs.add(nlriTypeReg.registerTlvSerializer(ipv4InterfaceParser.getTlvQName(), ipv4InterfaceParser));
250 final Ipv6InterfaceTlvParser ipv6InterfaceParser = new Ipv6InterfaceTlvParser();
251 regs.add(nlriTypeReg.registerTlvParser(ipv6InterfaceParser.getType(), ipv6InterfaceParser));
252 regs.add(nlriTypeReg.registerTlvSerializer(ipv6InterfaceParser.getTlvQName(), ipv6InterfaceParser));
254 final MultiTopoIdTlvParser multiTopoIdParser = new MultiTopoIdTlvParser();
255 regs.add(nlriTypeReg.registerTlvParser(multiTopoIdParser.getType(), multiTopoIdParser));
256 regs.add(nlriTypeReg.registerTlvSerializer(multiTopoIdParser.getTlvQName(), multiTopoIdParser));
258 final ReachTlvParser ipv4ReachParser = new ReachTlvParser();
259 regs.add(nlriTypeReg.registerTlvParser(ipv4ReachParser.getType(), ipv4ReachParser));
260 regs.add(nlriTypeReg.registerTlvSerializer(ipv4ReachParser.getTlvQName(), ipv4ReachParser));
262 final OspfRouteTlvParser ospfRouterParser = new OspfRouteTlvParser();
263 regs.add(nlriTypeReg.registerTlvParser(ospfRouterParser.getType(), ospfRouterParser));
264 regs.add(nlriTypeReg.registerTlvSerializer(ospfRouterParser.getTlvQName(), ospfRouterParser));