9ae9d738ee4b58eb134ad80f7c1f45ef09bcfa0a
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / attribute / sr / SrLinkAttributesParser.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.attribute.sr;
9
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.Unpooled;
12 import org.opendaylight.protocol.bgp.linkstate.attribute.sr.SidLabelIndexParser.Size;
13 import org.opendaylight.protocol.util.ByteArray;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjId;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIdBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.AdjSidTlv;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Weight;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.SidLabelIndex;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
20 import org.opendaylight.yangtools.yang.binding.DataContainer;
21
22 public final class SrLinkAttributesParser {
23
24     private static final int ISO_SYSTEM_ID_SIZE = 6;
25     private static final int RESERVED = 2;
26
27     /** OSPF flags
28        0 1 2 3 4 5 6 7
29       +-+-+-+-+-+-+-+-+
30       |B|V|L|S|       |
31       +-+-+-+-+-+-+-+-+
32
33        ISIS flags
34        0 1 2 3 4 5 6 7
35       +-+-+-+-+-+-+-+-+
36       |F|B|V|L|S|     |
37       +-+-+-+-+-+-+-+-+
38      */
39
40     private SrLinkAttributesParser() {
41         throw new UnsupportedOperationException();
42     }
43
44     public static AdjSidTlv parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
45         final byte[] adjFlags;
46         final Weight weight;
47         final SidLabelIndex sidValue;
48         if (buffer.isReadable()) {
49             adjFlags = new byte[] { (byte) buffer.readUnsignedByte() };
50             weight = new Weight(buffer.readUnsignedByte());
51             buffer.skipBytes(RESERVED);
52             sidValue = SidLabelIndexParser.parseSidLabelIndex(Size.forValue(buffer.readableBytes()), buffer);
53         } else {
54             adjFlags = null;
55             weight = null;
56             sidValue = null;
57         }
58         return new AdjSidTlv() {
59             @Override
60             public Class<? extends DataContainer> getImplementedInterface() {
61                 return AdjSidTlv.class;
62             }
63             @Override
64             public Weight getWeight() {
65                 return weight;
66             }
67             @Override
68             public SidLabelIndex getSidLabelIndex() {
69                 return sidValue;
70             }
71             @Override
72             public byte[] getFlags() {
73                 return adjFlags;
74             }
75         };
76     }
77
78     public static SrLanAdjId parseLanAdjacencySegmentIdentifier(final ByteBuf buffer) {
79         if (!buffer.isReadable()) {
80             return new SrLanAdjIdBuilder().build();
81         }
82         final SrLanAdjIdBuilder srLanAdjIdBuilder = new SrLanAdjIdBuilder();
83         srLanAdjIdBuilder.setFlags(new byte[] { (byte) buffer.readUnsignedByte() });
84         srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
85         buffer.skipBytes(RESERVED);
86         srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE)));
87         // length determines a type of next field, which is used for parsing
88         srLanAdjIdBuilder.setSidLabelIndex(SidLabelIndexParser.parseSidLabelIndex(Size.forValue(buffer.readableBytes()), buffer));
89         return srLanAdjIdBuilder.build();
90     }
91
92     public static ByteBuf serializeAdjacencySegmentIdentifier(final AdjSidTlv adjSid) {
93         final ByteBuf value = Unpooled.buffer();
94         value.writeBytes(adjSid.getFlags());
95         value.writeByte(adjSid.getWeight().getValue());
96         value.writeZero(RESERVED);
97         value.writeBytes(SidLabelIndexParser.serializeSidValue(adjSid.getSidLabelIndex()));
98         return value;
99     }
100
101     public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) {
102         final ByteBuf value = Unpooled.buffer();
103         value.writeBytes(srLanAdjId.getFlags());
104         value.writeByte(srLanAdjId.getWeight().getValue());
105         value.writeZero(RESERVED);
106         value.writeBytes(srLanAdjId.getIsoSystemId().getValue());
107         value.writeBytes(SidLabelIndexParser.serializeSidValue(srLanAdjId.getSidLabelIndex()));
108         return value;
109     }
110
111 }