2 * Copyright (c) 2014 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.attribute.sr;
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;
22 public final class SrLinkAttributesParser {
24 private static final int ISO_SYSTEM_ID_SIZE = 6;
25 private static final int RESERVED = 2;
40 private SrLinkAttributesParser() {
41 throw new UnsupportedOperationException();
44 public static AdjSidTlv parseAdjacencySegmentIdentifier(final ByteBuf buffer) {
45 final byte[] adjFlags;
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);
58 return new AdjSidTlv() {
60 public Class<? extends DataContainer> getImplementedInterface() {
61 return AdjSidTlv.class;
64 public Weight getWeight() {
68 public SidLabelIndex getSidLabelIndex() {
72 public byte[] getFlags() {
78 public static SrLanAdjId parseLanAdjacencySegmentIdentifier(final ByteBuf buffer) {
79 if (!buffer.isReadable()) {
80 return new SrLanAdjIdBuilder().build();
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();
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()));
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()));