Minimize linkstate use of ByteBufWriteUtils
[bgpcep.git] / bgp / extensions / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / tlvs / RouterIdTlvParser.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.impl.tlvs;
9
10 import io.netty.buffer.ByteBuf;
11 import org.opendaylight.protocol.bgp.linkstate.spi.LinkstateTlvParser;
12 import org.opendaylight.protocol.util.ByteArray;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.OspfInterfaceIdentifier;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.isis.lan.identifier.IsIsRouterIdentifier;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.isis.lan.identifier.IsIsRouterIdentifierBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.CRouterIdentifier;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.IsisNodeCase;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.IsisNodeCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.IsisPseudonodeCase;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.IsisPseudonodeCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.OspfNodeCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.OspfNodeCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.OspfPseudonodeCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.OspfPseudonodeCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.isis.node._case.IsisNode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.isis.node._case.IsisNodeBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.isis.pseudonode._case.IsisPseudonodeBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.ospf.node._case.OspfNodeBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonode;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev180329.node.identifier.c.router.identifier.ospf.pseudonode._case.OspfPseudonodeBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
33 import org.opendaylight.yangtools.yang.common.QName;
34 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
35
36 public final class RouterIdTlvParser implements LinkstateTlvParser<CRouterIdentifier>,
37         LinkstateTlvParser.LinkstateTlvSerializer<CRouterIdentifier> {
38     private static final int OSPF_PSEUDONODE_ROUTER_ID_LENGTH = 8;
39     private static final int OSPF_ROUTER_ID_LENGTH = 4;
40     private static final int ISO_SYSTEM_ID_LENGTH = 6;
41     private static final int PSN_LENGTH = 1;
42     private static final int IGP_ROUTER_ID = 515;
43
44     @Override
45     public void serializeTlvBody(final CRouterIdentifier tlv, final ByteBuf body) {
46         if (tlv instanceof IsisNodeCase) {
47             final IsisNode isis = ((IsisNodeCase) tlv).getIsisNode();
48             body.writeBytes(isis.getIsoSystemId().getValue());
49         } else if (tlv instanceof IsisPseudonodeCase) {
50             final IsisPseudonode isis = ((IsisPseudonodeCase) tlv).getIsisPseudonode();
51             body.writeBytes(isis.getIsIsRouterIdentifier().getIsoSystemId().getValue());
52             ByteBufUtils.writeOrZero(body, isis.getPsn());
53         } else if (tlv instanceof OspfNodeCase) {
54             ByteBufUtils.writeOrZero(body, ((OspfNodeCase) tlv).getOspfNode().getOspfRouterId());
55         } else if (tlv instanceof OspfPseudonodeCase) {
56             final OspfPseudonode node = ((OspfPseudonodeCase) tlv).getOspfPseudonode();
57             ByteBufUtils.writeOrZero(body, node.getOspfRouterId());
58             ByteBufUtils.write(body, node.getLanInterface().getValue());
59         }
60     }
61
62     @Override
63     public CRouterIdentifier parseTlvBody(final ByteBuf value) {
64         if (value.readableBytes() == ISO_SYSTEM_ID_LENGTH || value.readableBytes() == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH
65                 && value.getByte(ISO_SYSTEM_ID_LENGTH) == 0) {
66             return new IsisNodeCaseBuilder().setIsisNode(
67                     new IsisNodeBuilder().setIsoSystemId(new IsoSystemIdentifier(
68                         ByteArray.readBytes(value, ISO_SYSTEM_ID_LENGTH))).build()).build();
69         }
70         if (value.readableBytes() == ISO_SYSTEM_ID_LENGTH + PSN_LENGTH) {
71             final IsIsRouterIdentifier iri = new IsIsRouterIdentifierBuilder().setIsoSystemId(
72                     new IsoSystemIdentifier(ByteArray.readBytes(value, ISO_SYSTEM_ID_LENGTH))).build();
73             return new IsisPseudonodeCaseBuilder().setIsisPseudonode(new IsisPseudonodeBuilder()
74                 .setIsIsRouterIdentifier(iri).setPsn(ByteBufUtils.readUint8(value)).build()).build();
75         }
76         if (value.readableBytes() == OSPF_ROUTER_ID_LENGTH) {
77             return new OspfNodeCaseBuilder().setOspfNode(
78                     new OspfNodeBuilder().setOspfRouterId(ByteBufUtils.readUint32(value)).build()).build();
79
80         }
81         if (value.readableBytes() == OSPF_PSEUDONODE_ROUTER_ID_LENGTH) {
82             return new OspfPseudonodeCaseBuilder().setOspfPseudonode(
83                     new OspfPseudonodeBuilder().setOspfRouterId(ByteBufUtils.readUint32(value))
84                     .setLanInterface(new OspfInterfaceIdentifier(ByteBufUtils.readUint32(value))).build()).build();
85         }
86         return null;
87     }
88
89     @Override
90     public int getType() {
91         return IGP_ROUTER_ID;
92     }
93
94     @Override
95     public QName getTlvQName() {
96         return CRouterIdentifier.QNAME;
97     }
98 }
99