YANG revision dates mass-update
[bgpcep.git] / bgp / parser-impl / src / main / java / org / opendaylight / protocol / bgp / parser / impl / message / update / AsPathSegmentParser.java
1 /*
2  * Copyright (c) 2013 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.parser.impl.message.update;
9
10 import static org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathSegmentParser.SegmentType.AS_SEQUENCE;
11 import static org.opendaylight.protocol.bgp.parser.impl.message.update.AsPathSegmentParser.SegmentType.AS_SET;
12
13 import com.google.common.collect.ImmutableList;
14 import com.google.common.collect.ImmutableList.Builder;
15 import io.netty.buffer.ByteBuf;
16 import java.util.List;
17 import org.opendaylight.protocol.util.ReferenceCache;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
19 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
20
21 /**
22  * Representation of one AS Path Segment. It is, in fact, a TLV, but the length field is representing the count of AS
23  * Numbers in the collection (in its value). If the segment is of type AS_SEQUENCE, the collection is a List, if AS_SET,
24  * the collection is a Set.
25  */
26 public final class AsPathSegmentParser {
27
28     public static final int AS_NUMBER_LENGTH = 4;
29
30     /**
31      * Possible types of AS Path segments.
32      */
33     public enum SegmentType {
34         AS_SEQUENCE, AS_SET
35     }
36
37     private AsPathSegmentParser() {
38     }
39
40     static int serializeType(final SegmentType type) {
41         switch (type) {
42             case AS_SET:
43                 return 1;
44             case AS_SEQUENCE:
45                 return 2;
46             default:
47                 return 0;
48         }
49     }
50
51     static SegmentType parseType(final int type) {
52         switch (type) {
53             case 1:
54                 return AS_SET;
55             case 2:
56                 return AS_SEQUENCE;
57             default:
58                 return null;
59         }
60     }
61
62     static ImmutableList<AsNumber> parseAsSegment(final ReferenceCache refCache, final int count,
63             final ByteBuf buffer) {
64         if (count == 0) {
65             return ImmutableList.of();
66         }
67
68         final Builder<AsNumber> coll = ImmutableList.builderWithExpectedSize(count);
69         for (int i = 0; i < count; i++) {
70             coll.add(refCache.getSharedReference(new AsNumber(ByteBufUtils.readUint32(buffer))));
71         }
72         return coll.build();
73     }
74
75     static void serializeAsList(final List<AsNumber> asList, final SegmentType type, final ByteBuf byteAggregator) {
76         if (asList == null) {
77             return;
78         }
79         byteAggregator.writeByte(serializeType(type));
80         byteAggregator.writeByte(asList.size());
81         for (final AsNumber asNumber : asList) {
82             byteAggregator.writeInt(asNumber.getValue().intValue());
83         }
84     }
85 }