Bug 608 - implemented parsers/serializers
[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 java.util.BitSet;
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.SrAdjId;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrAdjIdBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.link.state.SrLanAdjIdBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.AdjacencyFlags;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.SidLabel;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.rev150206.Weight;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.IsoSystemIdentifier;
22
23 public class SrLinkAttributesParser {
24
25     private static final int ISO_SYSTEM_ID_SIZE = 6;
26
27     /* Adj-SID flags */
28     private static int ADDRESS_FAMILY_FLAG = 7;
29     private static int BACKUP_FLAG = 6;
30     private static int VALUE_FLAG = 5;
31     private static int LOCAL_FLAG = 4;
32     private static int SET_FLAG = 3;
33     private static final int FLAGS_SIZE = 1;
34
35     public static SrAdjId parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
36         if (!buffer.isReadable()) {
37             return new SrAdjIdBuilder().build();
38         }
39         final SrAdjIdBuilder srAdjIdBuilder = new SrAdjIdBuilder();
40         final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE));
41         srAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
42         srAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
43         srAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
44         return srAdjIdBuilder.build();
45     }
46
47     public static ByteBuf serializeAdjacencySegmentIdentifier(final SrAdjId srAdjId) {
48         final ByteBuf value = Unpooled.buffer();
49         final AdjacencyFlags srAdjIdFlags = srAdjId.getFlags();
50         final BitSet flags = new BitSet(FLAGS_SIZE);
51         if (srAdjIdFlags.isAddressFamily() != null) {
52             flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily());
53         }
54         if (srAdjIdFlags.isBackup() != null) {
55             flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup());
56         }
57         if (srAdjIdFlags.isValue() != null) {
58             flags.set(VALUE_FLAG, srAdjIdFlags.isValue());
59         }
60         if (srAdjIdFlags.isLocal() != null) {
61             flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal());
62         }
63         if (srAdjIdFlags.isSetFlag() != null) {
64             flags.set(SET_FLAG, srAdjIdFlags.isSetFlag());
65         }
66         value.writeBytes(flags.toByteArray());
67         value.writeByte(srAdjId.getWeight().getValue());
68         value.writeBytes(srAdjId.getSid().getValue());
69         return value;
70     }
71
72     public static SrLanAdjId parseLanAdjacencySegmentIdentifier(final ByteBuf buffer) {
73         if (!buffer.isReadable()) {
74             return new SrLanAdjIdBuilder().build();
75         }
76         final SrLanAdjIdBuilder srLanAdjIdBuilder = new SrLanAdjIdBuilder();
77         final BitSet flags = BitSet.valueOf(ByteArray.readBytes(buffer, FLAGS_SIZE));
78         srLanAdjIdBuilder.setFlags(new AdjacencyFlags(flags.get(ADDRESS_FAMILY_FLAG), flags.get(BACKUP_FLAG), flags.get(LOCAL_FLAG), flags.get(SET_FLAG), flags.get(VALUE_FLAG)));
79         srLanAdjIdBuilder.setWeight(new Weight(buffer.readUnsignedByte()));
80         srLanAdjIdBuilder.setIsoSystemId(new IsoSystemIdentifier(ByteArray.readBytes(buffer, ISO_SYSTEM_ID_SIZE)));
81         srLanAdjIdBuilder.setSid(new SidLabel(ByteArray.readAllBytes(buffer)));
82         return srLanAdjIdBuilder.build();
83     }
84
85     public static ByteBuf serializeLanAdjacencySegmentIdentifier(final SrLanAdjId srLanAdjId) {
86         final ByteBuf value = Unpooled.buffer();
87         final AdjacencyFlags srAdjIdFlags = srLanAdjId.getFlags();
88         final BitSet flags = new BitSet(FLAGS_SIZE);
89         if (srAdjIdFlags.isAddressFamily() != null) {
90             flags.set(ADDRESS_FAMILY_FLAG, srAdjIdFlags.isAddressFamily());
91         }
92         if (srAdjIdFlags.isBackup() != null) {
93             flags.set(BACKUP_FLAG, srAdjIdFlags.isBackup());
94         }
95         if (srAdjIdFlags.isValue() != null) {
96             flags.set(VALUE_FLAG, srAdjIdFlags.isValue());
97         }
98         if (srAdjIdFlags.isLocal() != null) {
99             flags.set(LOCAL_FLAG, srAdjIdFlags.isLocal());
100         }
101         if (srAdjIdFlags.isSetFlag() != null) {
102             flags.set(SET_FLAG, srAdjIdFlags.isSetFlag());
103         }
104         value.writeBytes(flags.toByteArray());
105         value.writeByte(srLanAdjId.getWeight().getValue());
106         value.writeBytes(srLanAdjId.getIsoSystemId().getValue());
107         value.writeBytes(srLanAdjId.getSid().getValue());
108         return value;
109     }
110 }