Bump versions to 0.21.8-SNAPSHOT
[bgpcep.git] / bgp / extensions / linkstate / src / main / java / org / opendaylight / protocol / bgp / linkstate / impl / attribute / sr / BindingSidLabelParser.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.impl.attribute.sr;
9
10 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
11 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.writeUint8;
12
13 import io.netty.buffer.ByteBuf;
14 import java.util.List;
15 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleBindingSubTlvsRegistry;
16 import org.opendaylight.protocol.util.BitArray;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrBindingSidLabels;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrBindingSidLabelsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Weight;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.Flags;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCase;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.OspfBindingFlagsCase;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.OspfBindingFlagsCaseBuilder;
27
28 public final class BindingSidLabelParser {
29     /* Flags */
30     private static final int FLAGS_SIZE = 8;
31     private static final int AFI = 0;
32     private static final int MIRROR_CONTEXT = 1;
33     private static final int MIRROR_CONTEXT_OSPF = 0;
34     private static final int SPREAD_TLV = 2;
35     private static final int LEAKED = 3;
36     private static final int ATTACHED = 4;
37
38     /* SID Label Tlv types */
39     private static final int RESERVED_BINDING_SID = 2;
40
41     private BindingSidLabelParser() {
42
43     }
44
45     public static SrBindingSidLabels parseBindingSidLabel(final ByteBuf buffer, final ProtocolId protocolId) {
46         final SrBindingSidLabelsBuilder bindingSid = new SrBindingSidLabelsBuilder();
47         bindingSid.setWeight(new Weight(readUint8(buffer)));
48         final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
49         bindingSid.setFlags(parseBindingSidFlags(flags, protocolId));
50         buffer.skipBytes(RESERVED_BINDING_SID);
51         bindingSid.setBindingSubTlvs(
52             SimpleBindingSubTlvsRegistry.getInstance().parseBindingSubTlvs(buffer, protocolId));
53         return bindingSid.build();
54     }
55
56     private static Flags parseBindingSidFlags(final BitArray flags, final ProtocolId protocol) {
57         switch (protocol) {
58             case IsisLevel1:
59             case IsisLevel2:
60                 return new IsisBindingFlagsCaseBuilder().setAddressFamily(flags.get(AFI))
61                         .setMirrorContext(flags.get(MIRROR_CONTEXT))
62                         .setSpreadTlv(flags.get(SPREAD_TLV)).setLeakedFromLevel2(flags.get(LEAKED))
63                         .setAttachedFlag(flags.get(ATTACHED)).build();
64             case Ospf:
65             case OspfV3:
66                 return new OspfBindingFlagsCaseBuilder().setMirroring(flags.get(MIRROR_CONTEXT_OSPF)).build();
67             default:
68                 return null;
69         }
70     }
71
72     public static void serializeBindingSidAttributes(final Weight weight, final Flags flags,
73             final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
74         writeUint8(aggregator, weight.getValue());
75         final BitArray bitFlags = serializeBindingSidFlags(flags);
76         bitFlags.toByteBuf(aggregator);
77         aggregator.writeZero(RESERVED_BINDING_SID);
78         SimpleBindingSubTlvsRegistry.getInstance().serializeBindingSubTlvs(bindingSubTlvs, aggregator);
79     }
80
81     private static BitArray serializeBindingSidFlags(final Flags flags) {
82         final BitArray bitFlags = new BitArray(FLAGS_SIZE);
83         if (flags instanceof IsisBindingFlagsCase) {
84             final IsisBindingFlagsCase isisFlags = (IsisBindingFlagsCase) flags;
85             bitFlags.set(AFI, isisFlags.getAddressFamily());
86             bitFlags.set(MIRROR_CONTEXT, isisFlags.getMirrorContext());
87             bitFlags.set(SPREAD_TLV, isisFlags.getSpreadTlv());
88             bitFlags.set(LEAKED, isisFlags.getLeakedFromLevel2());
89             bitFlags.set(ATTACHED, isisFlags.getAttachedFlag());
90         } else if (flags instanceof OspfBindingFlagsCase) {
91             final OspfBindingFlagsCase ospfFlags = (OspfBindingFlagsCase) flags;
92             bitFlags.set(MIRROR_CONTEXT_OSPF, ospfFlags.getMirroring());
93         }
94         return bitFlags;
95     }
96 }