fd79da84038dafa65d8ab33ca8d7df1296a31eaf
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / nlri / AbstractPrefixNlriParser.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.protocol.bgp.linkstate.impl.nlri;
10
11 import io.netty.buffer.ByteBuf;
12 import java.util.Map;
13 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.MultiTopoIdTlvParser;
14 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.OspfRouteTlvParser;
15 import org.opendaylight.protocol.bgp.linkstate.impl.tlvs.ReachTlvParser;
16 import org.opendaylight.protocol.bgp.linkstate.spi.AbstractNlriTypeCodec;
17 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleNlriTypeRegistry;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.OspfRouteType;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.TopologyIdentifier;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.PrefixCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.PrefixCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.AdvertisingNodeDescriptors;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.AdvertisingNodeDescriptorsBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.PrefixDescriptors;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.PrefixDescriptorsBuilder;
29 import org.opendaylight.yangtools.yang.common.QName;
30 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
31
32 abstract class AbstractPrefixNlriParser extends AbstractNlriTypeCodec {
33     @Override
34     protected final ObjectType parseObjectType(final ByteBuf buffer) {
35         final NodeIdentifier oType = SimpleNlriTypeRegistry.getInstance().parseTlv(buffer);
36         final PrefixCaseBuilder builder = new PrefixCaseBuilder();
37         builder.setAdvertisingNodeDescriptors(new AdvertisingNodeDescriptorsBuilder(oType).build());
38         builder.setPrefixDescriptors(parsePrefixDescriptor(buffer));
39         return builder.build();
40     }
41
42     @Override
43     protected final void serializeObjectType(final ObjectType objectType, final ByteBuf buffer) {
44         final PrefixCase prefix = (PrefixCase) objectType;
45         SimpleNlriTypeRegistry.getInstance().serializeTlv(AdvertisingNodeDescriptors.QNAME, prefix.getAdvertisingNodeDescriptors(), buffer);
46         serializePrefixDescriptor(prefix.getPrefixDescriptors(), buffer);
47     }
48
49     private PrefixDescriptors parsePrefixDescriptor(final ByteBuf buffer) {
50         final Map<QName, Object> tlvs = SimpleNlriTypeRegistry.getInstance().parseSubTlvs(buffer);
51         final PrefixDescriptorsBuilder builder = new PrefixDescriptorsBuilder();
52         builder.setMultiTopologyId((TopologyIdentifier) tlvs.get(MultiTopoIdTlvParser.MULTI_TOPOLOGY_ID_QNAME));
53         builder.setOspfRouteType((OspfRouteType) tlvs.get(OspfRouteTlvParser.OSPF_ROUTE_TYPE_QNAME));
54         builder.setIpReachabilityInformation((IpPrefix) tlvs.get(ReachTlvParser.IP_REACHABILITY_QNAME));
55         return builder.build();
56     }
57
58     private void serializePrefixDescriptor(final PrefixDescriptors tlv, final ByteBuf buffer) {
59         final SimpleNlriTypeRegistry reg = SimpleNlriTypeRegistry.getInstance();
60         reg.serializeTlv(MultiTopoIdTlvParser.MULTI_TOPOLOGY_ID_QNAME, tlv.getMultiTopologyId(), buffer);
61         reg.serializeTlv(OspfRouteTlvParser.OSPF_ROUTE_TYPE_QNAME, tlv.getOspfRouteType(), buffer);
62         reg.serializeTlv(ReachTlvParser.IP_REACHABILITY_QNAME, tlv.getIpReachabilityInformation(), buffer);
63     }
64
65     static PrefixDescriptors serializePrefixDescriptors(final ContainerNode prefixDesc) {
66         final PrefixDescriptorsBuilder prefixDescBuilder = new PrefixDescriptorsBuilder();
67         prefixDescBuilder.setMultiTopologyId(MultiTopoIdTlvParser.serializeModel(prefixDesc));
68         prefixDescBuilder.setOspfRouteType(OspfRouteTlvParser.serializeModel(prefixDesc));
69         prefixDescBuilder.setIpReachabilityInformation(ReachTlvParser.serializeModel(prefixDesc));
70         return prefixDescBuilder.build();
71     }
72 }