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
9 package org.opendaylight.protocol.bmp.spi.parser;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.base.Preconditions;
14 import io.netty.buffer.ByteBuf;
15 import org.opendaylight.bgp.concepts.RouteDistinguisherUtil;
16 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
17 import org.opendaylight.protocol.util.BitArray;
18 import org.opendaylight.protocol.util.ByteArray;
19 import org.opendaylight.protocol.util.ByteBufWriteUtil;
20 import org.opendaylight.protocol.util.Ipv4Util;
21 import org.opendaylight.protocol.util.Ipv6Util;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Timestamp;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.AdjRibInType;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.Peer.PeerDistinguisher;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.PeerType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.peer.header.PeerHeader;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.peer.header.PeerHeaderBuilder;
30 import org.opendaylight.yangtools.concepts.Builder;
31 import org.opendaylight.yangtools.yang.binding.Notification;
33 public abstract class AbstractBmpPerPeerMessageParser<T extends Builder<?>> extends AbstractBmpMessageWithTlvParser<T> {
35 private static final int L_FLAG_POS = 1;
36 private static final int V_FLAG_POS = 0;
37 private static final int FLAGS_SIZE = 8;
38 private static final int PEER_DISTINGUISHER_SIZE = 8;
39 private static final int PER_PEER_HEADER_SIZE = 32;
41 private final MessageRegistry bgpMssageRegistry;
43 public AbstractBmpPerPeerMessageParser(final MessageRegistry bgpMssageRegistry) {
44 this(bgpMssageRegistry, null);
47 public AbstractBmpPerPeerMessageParser(final MessageRegistry bgpMssageRegistry, final BmpTlvRegistry tlvRegistry) {
49 this.bgpMssageRegistry = requireNonNull(bgpMssageRegistry);
53 public void serializeMessageBody(final Notification message, final ByteBuf buffer) {
55 instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207
57 final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev171207.PeerHeader
58 messageWithPerPeerHeader = (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp
59 .message.rev171207.PeerHeader) message;
60 serializePerPeerHeader(messageWithPerPeerHeader.getPeerHeader(), buffer);
64 protected static PeerHeader parsePerPeerHeader(final ByteBuf bytes) {
65 Preconditions.checkArgument(bytes.readableBytes() >= PER_PEER_HEADER_SIZE);
66 final PeerHeaderBuilder phBuilder = new PeerHeaderBuilder();
67 final PeerType peerType = PeerType.forValue(bytes.readByte());
68 phBuilder.setType(peerType);
69 final BitArray flags = BitArray.valueOf(bytes, FLAGS_SIZE);
70 phBuilder.setAdjRibInType(AdjRibInType.forValue(flags.get(L_FLAG_POS) ? 1 : 0));
71 phBuilder.setIpv4(!flags.get(V_FLAG_POS));
74 phBuilder.setPeerDistinguisher(
75 new PeerDistinguisher(RouteDistinguisherUtil.parseRouteDistinguisher(bytes)));
78 phBuilder.setPeerDistinguisher(
79 new PeerDistinguisher(ByteArray.readBytes(bytes, PEER_DISTINGUISHER_SIZE)));
83 bytes.skipBytes(PEER_DISTINGUISHER_SIZE);
86 if (phBuilder.isIpv4()) {
87 bytes.skipBytes(Ipv6Util.IPV6_LENGTH - Ipv4Util.IP4_LENGTH);
88 phBuilder.setAddress(new IpAddress(Ipv4Util.addressForByteBuf(bytes)));
90 phBuilder.setAddress(new IpAddress(Ipv6Util.addressForByteBuf(bytes)));
92 phBuilder.setAs(new AsNumber(bytes.readUnsignedInt()));
93 phBuilder.setBgpId(Ipv4Util.addressForByteBuf(bytes));
94 phBuilder.setTimestampSec(new Timestamp(bytes.readUnsignedInt()));
95 phBuilder.setTimestampMicro(new Timestamp(bytes.readUnsignedInt()));
96 return phBuilder.build();
99 protected void serializePerPeerHeader(final PeerHeader peerHeader, final ByteBuf output) {
100 Preconditions.checkArgument(peerHeader != null, "Per-peer header cannot be null.");
101 final PeerType peerType = peerHeader.getType();
102 output.writeByte(peerType.getIntValue());
103 final BitArray flags = new BitArray(FLAGS_SIZE);
104 flags.set(L_FLAG_POS, peerHeader.getAdjRibInType().getIntValue() != 0);
105 flags.set(V_FLAG_POS, !peerHeader.isIpv4());
106 flags.toByteBuf(output);
107 final PeerDistinguisher peerDistinguisher = peerHeader.getPeerDistinguisher();
110 RouteDistinguisherUtil.serializeRouteDistinquisher(peerDistinguisher.getRouteDistinguisher(), output);
113 output.writeBytes(peerDistinguisher.getBinary());
117 output.writeZero(PEER_DISTINGUISHER_SIZE);
120 if (peerHeader.isIpv4()) {
121 output.writeZero(Ipv6Util.IPV6_LENGTH - Ipv4Util.IP4_LENGTH);
122 ByteBufWriteUtil.writeIpv4Address(peerHeader.getAddress().getIpv4Address(), output);
124 ByteBufWriteUtil.writeIpv6Address(peerHeader.getAddress().getIpv6Address(), output);
126 ByteBufWriteUtil.writeUnsignedInt(peerHeader.getAs().getValue(), output);
127 ByteBufWriteUtil.writeIpv4Address(peerHeader.getBgpId(), output);
128 if (peerHeader.getTimestampSec() != null) {
129 ByteBufWriteUtil.writeUnsignedInt(peerHeader.getTimestampSec().getValue(), output);
131 output.writeZero(ByteBufWriteUtil.INT_BYTES_LENGTH);
133 if (peerHeader.getTimestampMicro() != null) {
134 ByteBufWriteUtil.writeUnsignedInt(peerHeader.getTimestampMicro().getValue(), output);
136 output.writeZero(ByteBufWriteUtil.INT_BYTES_LENGTH);
140 protected final MessageRegistry getBgpMessageRegistry() {
141 return this.bgpMssageRegistry;