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.spi.pojo;
10 import io.netty.buffer.ByteBuf;
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.BackupUnnumberedParser;
15 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.EroMetricParser;
16 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4BackupEro;
17 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4EroParser;
18 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv4PrefixSidParser;
19 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6BackupEro;
20 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6EroParser;
21 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.Ipv6PrefixSidParser;
22 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.SIDParser;
23 import org.opendaylight.protocol.bgp.linkstate.impl.attribute.sr.binding.sid.sub.tlvs.UnnumberedEroParser;
24 import org.opendaylight.protocol.bgp.linkstate.spi.BindingSubTlvsParser;
25 import org.opendaylight.protocol.bgp.linkstate.spi.BindingSubTlvsSerializer;
26 import org.opendaylight.protocol.concepts.HandlerRegistry;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvsBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.BindingSubTlv;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.EroMetricCase;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroBackupCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv4EroCase;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroBackupCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6EroCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.Ipv6PrefixSidCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.PrefixSidCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.SidLabelCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdBackupEroCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sub.tlvs.binding.sub.tlv.UnnumberedInterfaceIdEroCase;
41 import org.opendaylight.yangtools.yang.binding.DataContainer;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
45 public final class SimpleBindingSubTlvsRegistry {
46 private static final Logger LOG = LoggerFactory.getLogger(SimpleBindingSubTlvsRegistry.class);
47 private static final @NonNull SimpleBindingSubTlvsRegistry INSTANCE = new SimpleBindingSubTlvsRegistry();
49 private final HandlerRegistry<DataContainer, BindingSubTlvsParser, BindingSubTlvsSerializer> handlers =
50 new HandlerRegistry<>();
52 private SimpleBindingSubTlvsRegistry() {
53 final SIDParser sidParser = new SIDParser();
54 handlers.registerParser(sidParser.getType(), sidParser);
55 handlers.registerSerializer(SidLabelCase.class, sidParser);
57 final Ipv4PrefixSidParser prefixSidParser = new Ipv4PrefixSidParser();
58 handlers.registerParser(prefixSidParser.getType(), prefixSidParser);
59 handlers.registerSerializer(PrefixSidCase.class, prefixSidParser);
61 final Ipv6PrefixSidParser ipv6PrefixSidParser = new Ipv6PrefixSidParser();
62 handlers.registerParser(ipv6PrefixSidParser.getType(), ipv6PrefixSidParser);
63 handlers.registerSerializer(Ipv6PrefixSidCase.class, ipv6PrefixSidParser);
65 final EroMetricParser eroMetricParser = new EroMetricParser();
66 handlers.registerParser(eroMetricParser.getType(), eroMetricParser);
67 handlers.registerSerializer(EroMetricCase.class, eroMetricParser);
69 final Ipv4EroParser ipv4EroParser = new Ipv4EroParser();
70 handlers.registerParser(ipv4EroParser.getType(), ipv4EroParser);
71 handlers.registerSerializer(Ipv4EroCase.class, ipv4EroParser);
73 final Ipv4BackupEro ipv4BackupEro = new Ipv4BackupEro();
74 handlers.registerParser(ipv4BackupEro.getType(), ipv4BackupEro);
75 handlers.registerSerializer(Ipv4EroBackupCase.class, ipv4BackupEro);
77 final Ipv6EroParser ipv6EroParser = new Ipv6EroParser();
78 handlers.registerParser(ipv6EroParser.getType(), ipv6EroParser);
79 handlers.registerSerializer(Ipv6EroCase.class, ipv6EroParser);
81 final Ipv6BackupEro ipv6BackupEro = new Ipv6BackupEro();
82 handlers.registerParser(ipv6BackupEro.getType(), ipv6BackupEro);
83 handlers.registerSerializer(Ipv6EroBackupCase.class, ipv6BackupEro);
85 final UnnumberedEroParser unnumberedEroParser = new UnnumberedEroParser();
86 handlers.registerParser(unnumberedEroParser.getType(), unnumberedEroParser);
87 handlers.registerSerializer(UnnumberedInterfaceIdEroCase.class, unnumberedEroParser);
89 final BackupUnnumberedParser backupUnnumberedParser = new BackupUnnumberedParser();
90 handlers.registerParser(backupUnnumberedParser.getType(), backupUnnumberedParser);
91 handlers.registerSerializer(UnnumberedInterfaceIdBackupEroCase.class, backupUnnumberedParser);
94 public static @NonNull SimpleBindingSubTlvsRegistry getInstance() {
98 public void serializeBindingSubTlvs(final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
99 if (bindingSubTlvs != null) {
100 for (final BindingSubTlvs subTlv : bindingSubTlvs) {
101 final BindingSubTlv bindingSubTlv = subTlv.getBindingSubTlv();
102 final BindingSubTlvsSerializer serializer = handlers.getSerializer(
103 bindingSubTlv.implementedInterface());
104 if (serializer == null) {
105 LOG.info("Unknown binding sub Tlv type {}", subTlv);
108 serializer.serializeSubTlv(bindingSubTlv, aggregator);
113 public List<BindingSubTlvs> parseBindingSubTlvs(final ByteBuf buffer, final ProtocolId protocolId) {
114 final List<BindingSubTlvs> subTlvs = new ArrayList<>();
115 if (buffer != null) {
116 while (buffer.isReadable()) {
117 final int type = buffer.readUnsignedShort();
118 final int length = buffer.readUnsignedShort();
119 final ByteBuf slice = buffer.readSlice(length);
120 final BindingSubTlvsParser parser = this.handlers.getParser(type);
121 if (parser == null) {
124 subTlvs.add(new BindingSubTlvsBuilder().setBindingSubTlv(parser.parseSubTlv(slice, protocolId))