2 * Copyright (c) 2014 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.tlvs;
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;
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;
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());
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();
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();
76 if (value.readableBytes() == OSPF_ROUTER_ID_LENGTH) {
77 return new OspfNodeCaseBuilder().setOspfNode(
78 new OspfNodeBuilder().setOspfRouterId(ByteBufUtils.readUint32(value)).build()).build();
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();
90 public int getType() {
95 public QName getTlvQName() {
96 return CRouterIdentifier.QNAME;