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