2 * Copyright (c) 2015 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.attribute.sr;
10 import io.netty.buffer.ByteBuf;
11 import java.util.List;
12 import org.opendaylight.protocol.bgp.linkstate.spi.pojo.SimpleBindingSubTlvsRegistry;
13 import org.opendaylight.protocol.util.BitArray;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.ProtocolId;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrBindingSidLabels;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.linkstate.rev200120.prefix.state.SrBindingSidLabelsBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.Weight;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.BindingSubTlvs;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.Flags;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.IsisBindingFlagsCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.OspfBindingFlagsCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.segment.routing.ext.rev200120.binding.sid.tlv.flags.OspfBindingFlagsCaseBuilder;
24 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
26 public final class BindingSidLabelParser {
28 private static final int FLAGS_SIZE = 8;
29 private static final int AFI = 0;
30 private static final int MIRROR_CONTEXT = 1;
31 private static final int MIRROR_CONTEXT_OSPF = 0;
32 private static final int SPREAD_TLV = 2;
33 private static final int LEAKED = 3;
34 private static final int ATTACHED = 4;
36 /* SID Label Tlv types */
37 private static final int RESERVED_BINDING_SID = 2;
39 private BindingSidLabelParser() {
43 public static SrBindingSidLabels parseBindingSidLabel(final ByteBuf buffer, final ProtocolId protocolId) {
44 final SrBindingSidLabelsBuilder bindingSid = new SrBindingSidLabelsBuilder();
45 bindingSid.setWeight(new Weight(ByteBufUtils.readUint8(buffer)));
46 final BitArray flags = BitArray.valueOf(buffer, FLAGS_SIZE);
47 bindingSid.setFlags(parseBindingSidFlags(flags, protocolId));
48 buffer.skipBytes(RESERVED_BINDING_SID);
49 bindingSid.setBindingSubTlvs(
50 SimpleBindingSubTlvsRegistry.getInstance().parseBindingSubTlvs(buffer, protocolId));
51 return bindingSid.build();
54 private static Flags parseBindingSidFlags(final BitArray flags, final ProtocolId protocol) {
58 return new IsisBindingFlagsCaseBuilder().setAddressFamily(flags.get(AFI))
59 .setMirrorContext(flags.get(MIRROR_CONTEXT))
60 .setSpreadTlv(flags.get(SPREAD_TLV)).setLeakedFromLevel2(flags.get(LEAKED))
61 .setAttachedFlag(flags.get(ATTACHED)).build();
64 return new OspfBindingFlagsCaseBuilder().setMirroring(flags.get(MIRROR_CONTEXT_OSPF)).build();
70 public static void serializeBindingSidAttributes(final Weight weight, final Flags flags,
71 final List<BindingSubTlvs> bindingSubTlvs, final ByteBuf aggregator) {
72 aggregator.writeByte(weight.getValue().toJava());
73 final BitArray bitFlags = serializeBindingSidFlags(flags);
74 bitFlags.toByteBuf(aggregator);
75 aggregator.writeZero(RESERVED_BINDING_SID);
76 SimpleBindingSubTlvsRegistry.getInstance().serializeBindingSubTlvs(bindingSubTlvs, aggregator);
79 private static BitArray serializeBindingSidFlags(final Flags flags) {
80 final BitArray bitFlags = new BitArray(FLAGS_SIZE);
81 if (flags instanceof IsisBindingFlagsCase) {
82 final IsisBindingFlagsCase isisFlags = (IsisBindingFlagsCase) flags;
83 bitFlags.set(AFI, isisFlags.getAddressFamily());
84 bitFlags.set(MIRROR_CONTEXT, isisFlags.getMirrorContext());
85 bitFlags.set(SPREAD_TLV, isisFlags.getSpreadTlv());
86 bitFlags.set(LEAKED, isisFlags.getLeakedFromLevel2());
87 bitFlags.set(ATTACHED, isisFlags.getAttachedFlag());
88 } else if (flags instanceof OspfBindingFlagsCase) {
89 final OspfBindingFlagsCase ospfFlags = (OspfBindingFlagsCase) flags;
90 bitFlags.set(MIRROR_CONTEXT_OSPF, ospfFlags.getMirroring());