BUG-4692: Migrate TCP-MD5 support in bgp package to netty's native-epoll
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / nlri / NodeNlriParser.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.protocol.bgp.linkstate.nlri;
9
10 import com.google.common.annotations.VisibleForTesting;
11 import com.google.common.base.Optional;
12 import com.google.common.primitives.UnsignedInteger;
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.ByteBufUtil;
15 import io.netty.buffer.Unpooled;
16
17 import org.opendaylight.protocol.bgp.linkstate.spi.TlvUtil;
18 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
19 import org.opendaylight.protocol.util.ByteArray;
20 import org.opendaylight.protocol.util.Ipv4Util;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.epe.rev150622.EpeNodeDescriptors;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.AreaIdentifier;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.DomainIdentifier;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NlriType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.OspfInterfaceIdentifier;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.isis.lan.identifier.IsIsRouterIdentifier;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.isis.lan.identifier.IsIsRouterIdentifierBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.ObjectType;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.destination.CLinkstateDestination;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.NodeCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.NodeCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptors;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.LocalNodeDescriptorsBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptors;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.link._case.RemoteNodeDescriptorsBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.node._case.NodeDescriptors;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.node._case.NodeDescriptorsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.AdvertisingNodeDescriptors;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.linkstate.object.type.prefix._case.AdvertisingNodeDescriptorsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.CRouterIdentifier;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisNodeCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisNodeCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisPseudonodeCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.IsisPseudonodeCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfNodeCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfNodeCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfPseudonodeCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.OspfPseudonodeCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.node._case.IsisNode;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.node._case.IsisNodeBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonodeBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.node._case.OspfNode;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.node._case.OspfNodeBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonodeBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
60 import org.opendaylight.yangtools.yang.common.QName;
61 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
62 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
63 import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
64 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
65 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 @VisibleForTesting
70 public final class NodeNlriParser implements NlriTypeCaseParser, NlriTypeCaseSerializer {
71
72     private static final Logger LOG = LoggerFactory.getLogger(NodeNlriParser.class);
73
74     public NodeNlriParser() {
75     }
76
77     private static final int OSPF_PSEUDONODE_ROUTER_ID_LENGTH = 8;
78     private static final int OSPF_ROUTER_ID_LENGTH = 4;
79     private static final int ISO_SYSTEM_ID_LENGTH = 6;
80     private static final int PSN_LENGTH = 1;
81
82     /* Node Descriptor TLVs */
83     private static final int AS_NUMBER = 512;
84     private static final int BGP_LS_ID = 513;
85     private static final int AREA_ID = 514;
86     private static final int IGP_ROUTER_ID = 515;
87     private static final int BGP_ROUTER_ID = 516;
88     private static final int MEMBER_AS_NUMBER = 517;
89
90     /* Node Descriptor Type */
91     private static final int LOCAL_NODE_DESCRIPTORS_TYPE = 256;
92
93     /* Node Descriptor QNames */
94     @VisibleForTesting
95     public static final NodeIdentifier AS_NUMBER_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "as-number").intern());
96     @VisibleForTesting
97     public static final NodeIdentifier AREA_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "area-id").intern());
98     @VisibleForTesting
99     public static final NodeIdentifier DOMAIN_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "domain-id").intern());
100     @VisibleForTesting
101     public static final NodeIdentifier ROUTER_NID = new NodeIdentifier(CRouterIdentifier.QNAME);
102     @VisibleForTesting
103     public static final NodeIdentifier BGP_ROUTER_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "bgp-router-id").intern());
104     @VisibleForTesting
105     public static final NodeIdentifier MEMBER_ASN_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "member-asn").intern());
106
107     /* Router Identifier QNames */
108     @VisibleForTesting
109     public static final NodeIdentifier ISIS_NODE_NID = new NodeIdentifier(IsisNode.QNAME);
110     @VisibleForTesting
111     public static final NodeIdentifier ISIS_PSEUDONODE_NID = new NodeIdentifier(IsisPseudonode.QNAME);
112     @VisibleForTesting
113     public static final NodeIdentifier OSPF_NODE_NID = new NodeIdentifier(OspfNode.QNAME);
114     @VisibleForTesting
115     public static final NodeIdentifier OSPF_PSEUDONODE_NID = new NodeIdentifier(OspfPseudonode.QNAME);
116     @VisibleForTesting
117     public static final NodeIdentifier ISO_SYSTEM_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "iso-system-id").intern());
118     @VisibleForTesting
119     public static final NodeIdentifier ISIS_ROUTER_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "is-is-router-identifier").intern());
120     @VisibleForTesting
121     public static final NodeIdentifier PSN_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "psn").intern());
122     @VisibleForTesting
123     public static final NodeIdentifier OSPF_ROUTER_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "ospf-router-id").intern());
124     private static final NodeIdentifier LAN_IFACE_NID = new NodeIdentifier(QName.create(NodeDescriptors.QNAME, "lan-interface").intern());
125
126     static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier parseNodeDescriptors(final ByteBuf buffer, final NlriType nlriType, final boolean local) throws BGPParsingException {
127         AsNumber asnumber = null;
128         DomainIdentifier bgpId = null;
129         AreaIdentifier ai = null;
130         CRouterIdentifier routerId = null;
131         AsNumber memberAsn = null;
132         Ipv4Address bgpRouterId = null;
133         while (buffer.isReadable()) {
134             final int type = buffer.readUnsignedShort();
135             final int length = buffer.readUnsignedShort();
136             final ByteBuf value = buffer.readSlice(length);
137             if (LOG.isTraceEnabled()) {
138                 LOG.trace("Parsing Node Descriptor: {}", ByteBufUtil.hexDump(value));
139             }
140             switch (type) {
141             case AS_NUMBER:
142                 asnumber = new AsNumber(value.readUnsignedInt());
143                 LOG.debug("Parsed {}", asnumber);
144                 break;
145             case BGP_LS_ID:
146                 bgpId = new DomainIdentifier(value.readUnsignedInt());
147                 LOG.debug("Parsed {}", bgpId);
148                 break;
149             case AREA_ID:
150                 ai = new AreaIdentifier(value.readUnsignedInt());
151                 LOG.debug("Parsed area identifier {}", ai);
152                 break;
153             case IGP_ROUTER_ID:
154                 routerId = parseRouterId(value);
155                 LOG.debug("Parsed Router Identifier {}", routerId);
156                 break;
157             case BGP_ROUTER_ID:
158                 bgpRouterId = Ipv4Util.addressForByteBuf(value);
159                 LOG.debug("Parsed BGP Router Identifier {}", bgpRouterId);
160                 break;
161             case MEMBER_AS_NUMBER:
162                 memberAsn = new AsNumber(value.readUnsignedInt());
163                 LOG.debug("Parsed Member AsNumber {}", memberAsn);
164                 break;
165             default:
166                 throw new BGPParsingException("Node Descriptor not recognized, type: " + type);
167             }
168         }
169         LOG.trace("Finished parsing Node descriptors.");
170         return correctType(nlriType, local, asnumber, ai, routerId, bgpId, bgpRouterId, memberAsn);
171     }
172
173     private static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier correctType(final NlriType nlriType, final boolean local, final AsNumber asnumber, final AreaIdentifier ai, final CRouterIdentifier routerId, final DomainIdentifier bgpId, final Ipv4Address bgpRouterId, final AsNumber memberAsn) {
174         switch (nlriType) {
175         case Link:
176             if (local) {
177                 return new LocalNodeDescriptorsBuilder().setAsNumber(asnumber).setAreaId(ai).setCRouterIdentifier(routerId).setDomainId(bgpId).setBgpRouterId(bgpRouterId).setMemberAsn(memberAsn).build();
178             } else {
179                 return new RemoteNodeDescriptorsBuilder().setAsNumber(asnumber).setAreaId(ai).setCRouterIdentifier(routerId).setDomainId(bgpId).setBgpRouterId(bgpRouterId).setMemberAsn(memberAsn).build();
180             }
181         case Node:
182             return new NodeDescriptorsBuilder().setAsNumber(asnumber).setAreaId(ai).setCRouterIdentifier(routerId).setDomainId(bgpId).build();
183         case Ipv4Prefix:
184         case Ipv6Prefix:
185             return new AdvertisingNodeDescriptorsBuilder().setAsNumber(asnumber).setAreaId(ai).setCRouterIdentifier(routerId).setDomainId(bgpId).build();
186         default:
187             throw new IllegalStateException("NLRI type not recognized.");
188         }
189     }
190
191     private static CRouterIdentifier parseRouterId(final ByteBuf value) throws BGPParsingException {
192         if (value.readableBytes() == ISO_SYSTEM_ID_LENGTH || (value.readableBytes() == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH && value.getByte(ISO_SYSTEM_ID_LENGTH) == 0)) {
193             return new IsisNodeCaseBuilder().setIsisNode(
194                 new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(value, ISO_SYSTEM_ID_LENGTH))).build()).build();
195         }
196         if (value.readableBytes() == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH) {
197             final IsIsRouterIdentifier iri = new IsIsRouterIdentifierBuilder().setIsoSystemId(
198                 new IsoSystemIdentifier(ByteArray.readBytes(value, ISO_SYSTEM_ID_LENGTH))).build();
199             return new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder().setIsIsRouterIdentifier(iri).setPsn((short) value.readByte()).build()).build();
200         }
201         if (value.readableBytes() == OSPF_ROUTER_ID_LENGTH) {
202             return new OspfNodeCaseBuilder().setOspfNode(
203                 new OspfNodeBuilder().setOspfRouterId(value.readUnsignedInt()).build()).build();
204         }
205         if (value.readableBytes() == OSPF_PSEUDONODE_ROUTER_ID_LENGTH) {
206             return new OspfPseudonodeCaseBuilder().setOspfPseudonode(
207                 new OspfPseudonodeBuilder().setOspfRouterId(value.readUnsignedInt()).setLanInterface(new OspfInterfaceIdentifier(value.readUnsignedInt())).build()).build();
208         }
209         throw new BGPParsingException("Router Id of invalid length " + value.readableBytes());
210     }
211
212     static void serializeNodeIdentifier(final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier descriptors, final ByteBuf buffer) {
213         if (descriptors.getAsNumber() != null) {
214             TlvUtil.writeTLV(AS_NUMBER, Unpooled.copyInt(UnsignedInteger.valueOf(descriptors.getAsNumber().getValue()).intValue()), buffer);
215         }
216         if (descriptors.getDomainId() != null) {
217             TlvUtil.writeTLV(BGP_LS_ID, Unpooled.copyInt(UnsignedInteger.valueOf(descriptors.getDomainId().getValue()).intValue()), buffer);
218         }
219         if (descriptors.getAreaId() != null) {
220             TlvUtil.writeTLV(AREA_ID, Unpooled.copyInt(UnsignedInteger.valueOf(descriptors.getAreaId().getValue()).intValue()), buffer);
221         }
222         if (descriptors.getCRouterIdentifier() != null) {
223             final ByteBuf routerIdBuf = Unpooled.buffer();
224             serializeRouterId(descriptors.getCRouterIdentifier(), routerIdBuf);
225             TlvUtil.writeTLV(IGP_ROUTER_ID, routerIdBuf, buffer);
226         }
227     }
228
229     static void serializeEpeNodeDescriptors(final EpeNodeDescriptors epends, final ByteBuf buffer) {
230         if (epends.getBgpRouterId() != null) {
231             TlvUtil.writeTLV(BGP_ROUTER_ID, Ipv4Util.byteBufForAddress(epends.getBgpRouterId()), buffer);
232         }
233         if (epends.getMemberAsn() != null) {
234             TlvUtil.writeTLV(MEMBER_AS_NUMBER, Unpooled.copyInt(UnsignedInteger.valueOf(epends.getMemberAsn().getValue()).intValue()), buffer);
235         }
236     }
237
238     private static void serializeRouterId(final CRouterIdentifier routerId, final ByteBuf buffer) {
239         if (routerId instanceof IsisNodeCase) {
240             final IsisNode isis = ((IsisNodeCase) routerId).getIsisNode();
241             buffer.writeBytes(isis.getIsoSystemId().getValue());
242         } else if (routerId instanceof IsisPseudonodeCase) {
243             final IsisPseudonode isis = ((IsisPseudonodeCase) routerId).getIsisPseudonode();
244             buffer.writeBytes(isis.getIsIsRouterIdentifier().getIsoSystemId().getValue());
245             buffer.writeByte(((isis.getPsn() != null) ? isis.getPsn() : 0));
246         } else if (routerId instanceof OspfNodeCase) {
247             buffer.writeInt(UnsignedInteger.valueOf(((OspfNodeCase) routerId).getOspfNode().getOspfRouterId()).intValue());
248         } else if (routerId instanceof OspfPseudonodeCase) {
249             final OspfPseudonode node = ((OspfPseudonodeCase) routerId).getOspfPseudonode();
250             buffer.writeInt(UnsignedInteger.valueOf(node.getOspfRouterId()).intValue());
251             buffer.writeInt(UnsignedInteger.valueOf(node.getLanInterface().getValue()).intValue());
252         }
253     }
254
255     private static IsisNodeCase serializeIsisNode(final ContainerNode isis) {
256         final IsisNodeCaseBuilder builder = new IsisNodeCaseBuilder();
257         final IsisNodeBuilder isisBuilder = new IsisNodeBuilder();
258         isisBuilder.setIsoSystemId(new IsoSystemIdentifier((byte[]) isis.getChild(ISO_SYSTEM_NID).get().getValue()));
259         builder.setIsisNode(isisBuilder.build());
260         return builder.build();
261     }
262
263     private static IsisPseudonodeCase serializeIsisPseudoNode(final ContainerNode pseudoIsisNode) {
264         final IsIsRouterIdentifierBuilder isisRouterId = new IsIsRouterIdentifierBuilder();
265         if (pseudoIsisNode.getChild(ISIS_ROUTER_NID).isPresent()) {
266             final ContainerNode isisRouterNid = (ContainerNode) pseudoIsisNode.getChild(ISIS_ROUTER_NID).get();
267             if (isisRouterNid.getChild(ISO_SYSTEM_NID).isPresent()) {
268                 isisRouterId.setIsoSystemId(new IsoSystemIdentifier((byte[]) isisRouterNid.getChild(ISO_SYSTEM_NID).get().getValue()));
269             }
270         }
271
272         final IsisPseudonodeBuilder nodeBuilder = new IsisPseudonodeBuilder();
273         nodeBuilder.setIsIsRouterIdentifier(isisRouterId.build());
274
275         if (pseudoIsisNode.getChild(PSN_NID).isPresent()) {
276             nodeBuilder.setPsn((Short) pseudoIsisNode.getChild(PSN_NID).get().getValue());
277         } else {
278             nodeBuilder.setPsn((short) 0);
279         }
280
281         return new IsisPseudonodeCaseBuilder().setIsisPseudonode(nodeBuilder.build()).build();
282     }
283
284     private static OspfNodeCase serializeOspfNode(final ContainerNode ospf) {
285         final OspfNodeCaseBuilder builder = new OspfNodeCaseBuilder();
286         if (ospf.getChild(OSPF_ROUTER_NID).isPresent()) {
287             final OspfNodeBuilder nodeBuilder = new OspfNodeBuilder();
288             nodeBuilder.setOspfRouterId((Long) ospf.getChild(OSPF_ROUTER_NID).get().getValue());
289             builder.setOspfNode(nodeBuilder.build());
290         }
291         return builder.build();
292     }
293
294     private static CRouterIdentifier serializeOspfPseudoNode(final ContainerNode ospfPseudonode) {
295         final OspfPseudonodeCaseBuilder builder = new OspfPseudonodeCaseBuilder();
296         final OspfPseudonodeBuilder nodeBuilder = new OspfPseudonodeBuilder();
297         if (ospfPseudonode.getChild(LAN_IFACE_NID).isPresent()) {
298             nodeBuilder.setLanInterface(new OspfInterfaceIdentifier((Long)ospfPseudonode.getChild(LAN_IFACE_NID).get().getValue()));
299         }
300         if (ospfPseudonode.getChild(OSPF_ROUTER_NID).isPresent()) {
301             nodeBuilder.setOspfRouterId((Long)ospfPseudonode.getChild(OSPF_ROUTER_NID).get().getValue());
302         }
303         builder.setOspfPseudonode(nodeBuilder.build());
304         return builder.build();
305     }
306
307     private static CRouterIdentifier serializeRouterId(final ContainerNode descriptorsData) {
308         CRouterIdentifier cRouterId = null;
309         final Optional<DataContainerChild<? extends PathArgument, ?>> maybeRouterId = descriptorsData.getChild(ROUTER_NID);
310         if (maybeRouterId.isPresent()) {
311             final ChoiceNode routerId = (ChoiceNode) maybeRouterId.get();
312             if (routerId.getChild(ISIS_NODE_NID).isPresent()) {
313                 cRouterId = serializeIsisNode((ContainerNode) routerId.getChild(ISIS_NODE_NID).get());
314             } else if (routerId.getChild(ISIS_PSEUDONODE_NID).isPresent()) {
315                 cRouterId = serializeIsisPseudoNode((ContainerNode) routerId.getChild(ISIS_PSEUDONODE_NID).get());
316             } else if (routerId.getChild(OSPF_NODE_NID).isPresent()) {
317                 cRouterId = serializeOspfNode((ContainerNode) routerId.getChild(OSPF_NODE_NID).get());
318             } else if (routerId.getChild(OSPF_PSEUDONODE_NID).isPresent()) {
319                 cRouterId = serializeOspfPseudoNode((ContainerNode) routerId.getChild(OSPF_PSEUDONODE_NID).get());
320             }
321         }
322         return cRouterId;
323     }
324
325     private static AsNumber serializeAsNumber(final ContainerNode descriptorsData) {
326         final Optional<DataContainerChild<? extends PathArgument, ?>> asNumber = descriptorsData.getChild(AS_NUMBER_NID);
327         if (asNumber.isPresent()) {
328             return new AsNumber((Long) asNumber.get().getValue());
329         }
330         return null;
331     }
332
333     private static DomainIdentifier serializeDomainId(final ContainerNode descriptorsData) {
334         final Optional<DataContainerChild<? extends PathArgument, ?>> domainId = descriptorsData.getChild(DOMAIN_NID);
335         if (domainId.isPresent()) {
336             return new DomainIdentifier((Long) domainId.get().getValue());
337         }
338         return null;
339     }
340
341     private static AreaIdentifier serializeAreaId(final ContainerNode descriptorsData) {
342         final Optional<DataContainerChild<? extends PathArgument, ?>> areaId = descriptorsData.getChild(AREA_NID);
343         if (areaId.isPresent()) {
344             return new AreaIdentifier((Long) areaId.get().getValue());
345         }
346         return null;
347     }
348
349     private static Ipv4Address serializeBgpRouterId(final ContainerNode descriptorsData) {
350         final Optional<DataContainerChild<? extends PathArgument, ?>> bgpRouterId = descriptorsData.getChild(BGP_ROUTER_NID);
351         if (bgpRouterId.isPresent()) {
352             return new Ipv4Address((String) bgpRouterId.get().getValue());
353         }
354         return null;
355     }
356
357     private static AsNumber serializeMemberAsn(final ContainerNode descriptorsData) {
358         final Optional<DataContainerChild<? extends PathArgument, ?>> memberAsn = descriptorsData.getChild(MEMBER_ASN_NID);
359         if (memberAsn.isPresent()) {
360             return new AsNumber((Long) memberAsn.get().getValue());
361         }
362         return null;
363     }
364
365     static LocalNodeDescriptors serializeLocalNodeDescriptors(final ContainerNode descriptorsData) {
366         final LocalNodeDescriptorsBuilder builder = new LocalNodeDescriptorsBuilder();
367         builder.setAsNumber(serializeAsNumber(descriptorsData));
368         builder.setDomainId(serializeDomainId(descriptorsData));
369         builder.setAreaId(serializeAreaId(descriptorsData));
370         builder.setCRouterIdentifier(serializeRouterId(descriptorsData));
371         builder.setBgpRouterId(serializeBgpRouterId(descriptorsData));
372         builder.setMemberAsn(serializeMemberAsn(descriptorsData));
373         return builder.build();
374     }
375
376     static RemoteNodeDescriptors serializeRemoteNodeDescriptors(final ContainerNode descriptorsData) {
377         final RemoteNodeDescriptorsBuilder builder = new RemoteNodeDescriptorsBuilder();
378         builder.setAsNumber(serializeAsNumber(descriptorsData));
379         builder.setDomainId(serializeDomainId(descriptorsData));
380         builder.setAreaId(serializeAreaId(descriptorsData));
381         builder.setCRouterIdentifier(serializeRouterId(descriptorsData));
382         builder.setBgpRouterId(serializeBgpRouterId(descriptorsData));
383         builder.setMemberAsn(serializeMemberAsn(descriptorsData));
384         return builder.build();
385     }
386
387     static AdvertisingNodeDescriptors serializeAdvNodeDescriptors(final ContainerNode descriptorsData) {
388         final AdvertisingNodeDescriptorsBuilder builder = new AdvertisingNodeDescriptorsBuilder();
389         builder.setAsNumber(serializeAsNumber(descriptorsData));
390         builder.setDomainId(serializeDomainId(descriptorsData));
391         builder.setAreaId(serializeAreaId(descriptorsData));
392         builder.setCRouterIdentifier(serializeRouterId(descriptorsData));
393         return builder.build();
394     }
395
396     static NodeDescriptors serializeNodeDescriptors(final ContainerNode descriptorsData) {
397         final NodeDescriptorsBuilder builder = new NodeDescriptorsBuilder();
398         builder.setAsNumber(serializeAsNumber(descriptorsData));
399         builder.setDomainId(serializeDomainId(descriptorsData));
400         builder.setAreaId(serializeAreaId(descriptorsData));
401         builder.setCRouterIdentifier(serializeRouterId(descriptorsData));
402         return builder.build();
403     }
404
405     @Override
406     public ObjectType parseTypeNlri(final ByteBuf nlri, final NlriType type, final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.NodeIdentifier localdescriptor, final ByteBuf restNlri) throws BGPParsingException {
407
408         NodeCaseBuilder nodebuilder = new NodeCaseBuilder();
409         NodeCase nodecase = nodebuilder.setNodeDescriptors((NodeDescriptors) localdescriptor).build();
410         return nodecase;
411
412     }
413
414     @Override
415     public NlriType serializeTypeNlri(final CLinkstateDestination destination, final ByteBuf localdescs, final ByteBuf byteAggregator) {
416         final NodeCase nCase = ((NodeCase)destination.getObjectType());
417         NodeNlriParser.serializeNodeIdentifier(nCase.getNodeDescriptors(), localdescs);
418         TlvUtil.writeTLV(LOCAL_NODE_DESCRIPTORS_TYPE, localdescs, byteAggregator);
419         return NlriType.Node;
420     }
421
422 }