fc5340de15b373fd6c68176b260b9ca709b3e63c
[bgpcep.git] / bmp / bmp-parser-impl / src / main / java / org / opendaylight / protocol / bmp / parser / message / StatisticsReportHandler.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
9 package org.opendaylight.protocol.bmp.parser.message;
10
11 import static org.opendaylight.protocol.util.ByteBufWriteUtil.INT_BYTES_LENGTH;
12 import static org.opendaylight.protocol.util.ByteBufWriteUtil.writeUnsignedInt;
13
14 import com.google.common.base.Preconditions;
15 import io.netty.buffer.ByteBuf;
16 import io.netty.buffer.Unpooled;
17 import java.util.concurrent.atomic.AtomicInteger;
18 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
19 import org.opendaylight.protocol.bmp.spi.parser.AbstractBmpPerPeerMessageParser;
20 import org.opendaylight.protocol.bmp.spi.parser.BmpDeserializationException;
21 import org.opendaylight.protocol.bmp.spi.parser.BmpTlvRegistry;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.StatsReportsMessage;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.StatsReportsMessageBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.Tlv;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.Tlvs;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.TlvsBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.AdjRibsInRoutesTlv;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.DuplicatePrefixAdvertisementsTlv;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.DuplicateUpdatesTlv;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.DuplicateWithdrawsTlv;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.InvalidatedAsConfedLoopTlv;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.InvalidatedAsPathLoopTlv;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.InvalidatedClusterListLoopTlv;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.InvalidatedOriginatorIdTlv;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.LocRibRoutesTlv;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.PerAfiSafiAdjRibInTlv;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.PerAfiSafiLocRibTlv;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.PrefixesTreatedAsWithdrawTlv;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.RejectedPrefixesTlv;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.stat.tlvs.UpdatesTreatedAsWithdrawTlv;
41 import org.opendaylight.yangtools.yang.binding.Notification;
42
43 public class StatisticsReportHandler extends AbstractBmpPerPeerMessageParser<TlvsBuilder> {
44
45     private static final int MESSAGE_TYPE = 1;
46
47     public StatisticsReportHandler(final MessageRegistry bgpMssageRegistry, final BmpTlvRegistry tlvRegistry) {
48         super(bgpMssageRegistry, tlvRegistry);
49     }
50
51     @Override
52     public void serializeMessageBody(final Notification message, final ByteBuf buffer) {
53         super.serializeMessageBody(message, buffer);
54         Preconditions.checkArgument(message instanceof StatsReportsMessage,
55                 "An instance of Statistics Reports message is required");
56         final StatsReportsMessage statsReport = (StatsReportsMessage) message;
57         serializeTlvs(statsReport.getTlvs(), buffer);
58     }
59
60     @Override
61     public Notification parseMessageBody(final ByteBuf bytes) throws BmpDeserializationException {
62         final StatsReportsMessageBuilder statReport = new StatsReportsMessageBuilder()
63                 .setPeerHeader(parsePerPeerHeader(bytes));
64         final TlvsBuilder tlvsBuilder = new TlvsBuilder();
65         bytes.skipBytes(INT_BYTES_LENGTH);
66         parseTlvs(tlvsBuilder, bytes);
67
68         return statReport.setTlvs(tlvsBuilder.build()).build();
69     }
70
71     @Override
72     public int getBmpMessageType() {
73         return MESSAGE_TYPE;
74     }
75
76     private void serializeTlvs(final Tlvs tlvs, final ByteBuf output) {
77         final AtomicInteger counter = new AtomicInteger(0);
78         final ByteBuf tlvsBuffer = Unpooled.buffer();
79         serializeStatTlv(tlvs.getRejectedPrefixesTlv(), tlvsBuffer, counter);
80         serializeStatTlv(tlvs.getDuplicatePrefixAdvertisementsTlv(), tlvsBuffer, counter);
81         serializeStatTlv(tlvs.getDuplicateWithdrawsTlv(), tlvsBuffer, counter);
82         serializeStatTlv(tlvs.getInvalidatedClusterListLoopTlv(), tlvsBuffer, counter);
83         serializeStatTlv(tlvs.getInvalidatedAsPathLoopTlv(), tlvsBuffer, counter);
84         serializeStatTlv(tlvs.getInvalidatedOriginatorIdTlv(), tlvsBuffer, counter);
85         serializeStatTlv(tlvs.getInvalidatedAsConfedLoopTlv(), tlvsBuffer, counter);
86         serializeStatTlv(tlvs.getAdjRibsInRoutesTlv(), tlvsBuffer, counter);
87         serializeStatTlv(tlvs.getLocRibRoutesTlv(), tlvsBuffer, counter);
88         serializeStatTlv(tlvs.getPerAfiSafiAdjRibInTlv(), tlvsBuffer, counter);
89         serializeStatTlv(tlvs.getPerAfiSafiLocRibTlv(), tlvsBuffer, counter);
90         serializeStatTlv(tlvs.getUpdatesTreatedAsWithdrawTlv(), tlvsBuffer, counter);
91         serializeStatTlv(tlvs.getPrefixesTreatedAsWithdrawTlv(), tlvsBuffer, counter);
92         serializeStatTlv(tlvs.getDuplicateUpdatesTlv(), tlvsBuffer, counter);
93
94         writeUnsignedInt(counter.longValue(), output);
95         output.writeBytes(tlvsBuffer);
96     }
97
98     private void serializeStatTlv(final Tlv tlv, final ByteBuf tlvsBuffer, final AtomicInteger counter) {
99         if (tlv != null) {
100             counter.incrementAndGet();
101             serializeTlv(tlv, tlvsBuffer);
102         }
103     }
104
105     @Override
106     protected void addTlv(final TlvsBuilder builder, final Tlv tlv) {
107         if (tlv instanceof AdjRibsInRoutesTlv) {
108             builder.setAdjRibsInRoutesTlv((AdjRibsInRoutesTlv) tlv);
109         } else if (tlv instanceof DuplicatePrefixAdvertisementsTlv) {
110             builder.setDuplicatePrefixAdvertisementsTlv((DuplicatePrefixAdvertisementsTlv) tlv);
111         } else if (tlv instanceof DuplicateWithdrawsTlv) {
112             builder.setDuplicateWithdrawsTlv((DuplicateWithdrawsTlv) tlv);
113         } else if (tlv instanceof InvalidatedAsConfedLoopTlv) {
114             builder.setInvalidatedAsConfedLoopTlv((InvalidatedAsConfedLoopTlv) tlv);
115         } else if (tlv instanceof InvalidatedAsPathLoopTlv) {
116             builder.setInvalidatedAsPathLoopTlv((InvalidatedAsPathLoopTlv) tlv);
117         } else if (tlv instanceof InvalidatedClusterListLoopTlv) {
118             builder.setInvalidatedClusterListLoopTlv((InvalidatedClusterListLoopTlv) tlv);
119         } else if (tlv instanceof InvalidatedOriginatorIdTlv) {
120             builder.setInvalidatedOriginatorIdTlv((InvalidatedOriginatorIdTlv) tlv);
121         } else if (tlv instanceof LocRibRoutesTlv) {
122             builder.setLocRibRoutesTlv((LocRibRoutesTlv) tlv);
123         } else if (tlv instanceof RejectedPrefixesTlv) {
124             builder.setRejectedPrefixesTlv((RejectedPrefixesTlv) tlv);
125         } else if (tlv instanceof PerAfiSafiAdjRibInTlv) {
126             builder.setPerAfiSafiAdjRibInTlv((PerAfiSafiAdjRibInTlv) tlv);
127         } else if (tlv instanceof PerAfiSafiLocRibTlv) {
128             builder.setPerAfiSafiLocRibTlv((PerAfiSafiLocRibTlv) tlv);
129         } else if (tlv instanceof UpdatesTreatedAsWithdrawTlv) {
130             builder.setUpdatesTreatedAsWithdrawTlv((UpdatesTreatedAsWithdrawTlv) tlv);
131         } else if (tlv instanceof PrefixesTreatedAsWithdrawTlv) {
132             builder.setPrefixesTreatedAsWithdrawTlv((PrefixesTreatedAsWithdrawTlv) tlv);
133         } else if (tlv instanceof DuplicateUpdatesTlv) {
134             builder.setDuplicateUpdatesTlv((DuplicateUpdatesTlv) tlv);
135         }
136     }
137 }