BUG-4552: Enhance LS-SR - discern protocols
[bgpcep.git] / bgp / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / attribute / sr / SrPrefixAttributesParser.java
1 /*
2  * Copyright (c) 2015 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 org.opendaylight.protocol.bgp.linkstate.attribute.sr.SidLabelIndexParser.Size;
12 import org.opendaylight.protocol.util.BitArray;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.ProtocolId;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefix;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev150210.prefix.state.SrPrefixBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.Algorithm;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.Flags;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCase;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.IsisPrefixFlagsCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.prefix.sid.tlv.flags.OspfPrefixFlagsCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev151014.sid.label.index.SidLabelIndex;
23
24 public final class SrPrefixAttributesParser {
25
26     private SrPrefixAttributesParser() {
27         throw new UnsupportedOperationException();
28     }
29
30     /* Flags */
31     private static final int RE_ADVERTISEMENT = 0;
32     private static final int NODE_SID = 1;
33     private static final int NO_PHP_OSPF = 1;
34     private static final int NO_PHP = 2;
35     private static final int MAPPING_SERVER = 2;
36     private static final int EXPLICIT_NULL = 3;
37     private static final int VALUE = 4;
38     private static final int LOCAL = 5;
39     private static final int FLAGS_SIZE = 8;
40
41     private static final int RESERVED_PREFIX = 2;
42
43     public static SrPrefix parseSrPrefix(final ByteBuf buffer, final ProtocolId protocol) {
44         final SrPrefixBuilder builder = new SrPrefixBuilder();
45         builder.setFlags(parsePrefixFlags(BitArray.valueOf(buffer, FLAGS_SIZE), protocol));
46         builder.setAlgorithm(Algorithm.forValue(buffer.readUnsignedByte()));
47         buffer.skipBytes(RESERVED_PREFIX);
48         builder.setSidLabelIndex(SidLabelIndexParser.parseSidLabelIndex(Size.forValue(buffer.readableBytes()), buffer));
49         return builder.build();
50     }
51
52     private static Flags parsePrefixFlags(final BitArray flags, final ProtocolId protocol) {
53         if (protocol.equals(ProtocolId.IsisLevel1) || protocol.equals(ProtocolId.IsisLevel2)) {
54             return new IsisPrefixFlagsCaseBuilder()
55                 .setReadvertisement(flags.get(RE_ADVERTISEMENT))
56                 .setNodeSid(flags.get(NODE_SID))
57                 .setNoPhp(flags.get(NO_PHP))
58                 .setExplicitNull(flags.get(EXPLICIT_NULL)).build();
59         }
60         if (protocol.equals(ProtocolId.Ospf)) {
61             return new OspfPrefixFlagsCaseBuilder()
62                 .setExplicitNull(flags.get(EXPLICIT_NULL))
63                 .setMappingServer(flags.get(MAPPING_SERVER))
64                 .setNoPhp(flags.get(NO_PHP_OSPF)).build();
65         }
66         return null;
67     }
68
69     public static void serializeSrPrefix(final SrPrefix srPrefix, final ByteBuf aggregator) {
70         serializePrefixAttributes(srPrefix.getFlags(), srPrefix.getAlgorithm(), srPrefix.getSidLabelIndex(), aggregator);
71     }
72
73     public static void serializePrefixAttributes(final Flags flags, final Algorithm algorithm, final SidLabelIndex sidLabelIndex, final ByteBuf buffer) {
74         final BitArray bitFlags = serializePrefixFlags(flags, sidLabelIndex);
75         bitFlags.toByteBuf(buffer);
76         buffer.writeByte(algorithm.getIntValue());
77         buffer.writeZero(RESERVED_PREFIX);
78         buffer.writeBytes(SidLabelIndexParser.serializeSidValue(sidLabelIndex));
79     }
80
81     private static BitArray serializePrefixFlags(final Flags flags, final SidLabelIndex sidLabelIndex) {
82         final BitArray bitFlags = new BitArray(FLAGS_SIZE);
83         SidLabelIndexParser.setFlags(sidLabelIndex, bitFlags, VALUE, LOCAL);
84         if (flags instanceof OspfPrefixFlagsCase) {
85             final OspfPrefixFlagsCase ospfFlags = (OspfPrefixFlagsCase) flags;
86             bitFlags.set(NO_PHP_OSPF, ospfFlags.isNoPhp());
87             bitFlags.set(MAPPING_SERVER, ospfFlags.isMappingServer());
88             bitFlags.set(EXPLICIT_NULL, ospfFlags.isExplicitNull());
89         } else if (flags instanceof IsisPrefixFlagsCase) {
90             final IsisPrefixFlagsCase isisFlags = (IsisPrefixFlagsCase) flags;
91             bitFlags.set(RE_ADVERTISEMENT, isisFlags.isReadvertisement());
92             bitFlags.set(NODE_SID, isisFlags.isNodeSid());
93             bitFlags.set(NO_PHP, isisFlags.isNoPhp());
94             bitFlags.set(EXPLICIT_NULL, isisFlags.isExplicitNull());
95         }
96         return bitFlags;
97     }
98
99 }