caaa0aa58963cafd4a6700fe298ef61eaa8aa272
[bgpcep.git] / bgp / labeled-unicast / src / main / java / org / opendaylight / protocol / bgp / labeled / unicast / OriginatorSrgbTlvParser.java
1 /*
2  * Copyright (c) 2016 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.labeled.unicast;
9
10 import com.google.common.base.Preconditions;
11 import io.netty.buffer.ByteBuf;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvParser;
15 import org.opendaylight.protocol.bgp.parser.spi.BgpPrefixSidTlvSerializer;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.Srgb;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValue;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.originator.srgb.tlv.SrgbValueBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlv;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.labeled.unicast.rev150525.update.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.bgp.prefix.sid.tlv.LuOriginatorSrgbTlvBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.path.attributes.attributes.bgp.prefix.sid.bgp.prefix.sid.tlvs.BgpPrefixSidTlv;
22
23 final class OriginatorSrgbTlvParser implements BgpPrefixSidTlvParser, BgpPrefixSidTlvSerializer {
24
25     private static final int ORIGINATOR_SRGB_TYPE = 3;
26     private static final int ORIGINATOR_FLAGS_BYTES = 2;
27     private static final int SRGB_LENGTH = 6;
28
29     @Override
30     public LuOriginatorSrgbTlv parseBgpPrefixSidTlv(final ByteBuf buffer) {
31         buffer.readBytes(ORIGINATOR_FLAGS_BYTES);
32         final List<SrgbValue> srgbList = parseSrgbs(buffer);
33         return new LuOriginatorSrgbTlvBuilder().setSrgbValue(srgbList).build();
34     }
35
36     private static List<SrgbValue> parseSrgbs(final ByteBuf buffer) {
37         Preconditions.checkState(buffer.readableBytes() % SRGB_LENGTH == 0, "Number of SRGBs doesn't fit available bytes.");
38         final List<SrgbValue> ret = new ArrayList<SrgbValue>();
39         while (buffer.isReadable()) {
40             ret.add(new SrgbValueBuilder().setBase(new Srgb((long) buffer.readUnsignedMedium())).setRange(new Srgb((long) buffer.readUnsignedMedium())).build());
41         }
42         return ret;
43     }
44
45     @Override
46     public void serializeBgpPrefixSidTlv(final BgpPrefixSidTlv tlv, final ByteBuf valueBuf) {
47         Preconditions.checkArgument(tlv instanceof LuOriginatorSrgbTlv, "Incoming TLV is not LuOriginatorSrgbTlv");
48         final LuOriginatorSrgbTlv luTlv = (LuOriginatorSrgbTlv) tlv;
49         valueBuf.writeZero(ORIGINATOR_FLAGS_BYTES);
50         for (final SrgbValue val : luTlv.getSrgbValue()) {
51             valueBuf.writeMedium(val.getBase().getValue().intValue());
52             valueBuf.writeMedium(val.getRange().getValue().intValue());
53         }
54     }
55
56     @Override
57     public int getType() {
58         return ORIGINATOR_SRGB_TYPE;
59     }
60 }