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 com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.collect.ImmutableList;
14 import io.netty.buffer.ByteBuf;
15 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
16 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
17 import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
18 import org.opendaylight.protocol.bgp.parser.spi.MessageUtil;
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.protocol.util.Ipv4Util;
23 import org.opendaylight.protocol.util.Ipv6Util;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.OpenBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.OpenMessage;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.PeerUpNotification;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.PeerUpNotificationBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.Tlv;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.peer.up.Information;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.peer.up.InformationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.peer.up.ReceivedOpenBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.peer.up.SentOpenBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.string.informations.StringInformation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.string.informations.StringInformationBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.string.tlv.StringTlv;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.message.rev180329.string.tlv.StringTlvBuilder;
39 import org.opendaylight.yangtools.yang.binding.Notification;
40 import org.opendaylight.yangtools.yang.common.netty.ByteBufUtils;
42 public class PeerUpHandler extends AbstractBmpPerPeerMessageParser<InformationBuilder> {
43 private static final int MESSAGE_TYPE = 3;
44 private final MessageRegistry msgRegistry;
46 public PeerUpHandler(final MessageRegistry bgpMssageRegistry, final BmpTlvRegistry tlvRegistry) {
47 super(bgpMssageRegistry, tlvRegistry);
48 this.msgRegistry = getBgpMessageRegistry();
52 public void serializeMessageBody(final Notification message, final ByteBuf buffer) {
53 super.serializeMessageBody(message, buffer);
54 checkArgument(message instanceof PeerUpNotification, "An instance of Peer Up notification is required");
55 final PeerUpNotification peerUp = (PeerUpNotification) message;
57 if (peerUp.getLocalAddress().getIpv4AddressNoZone() != null) {
58 buffer.writeZero(Ipv6Util.IPV6_LENGTH - Ipv4Util.IP4_LENGTH);
59 Ipv4Util.writeIpv4Address(peerUp.getLocalAddress().getIpv4AddressNoZone(), buffer);
61 Ipv6Util.writeIpv6Address(peerUp.getLocalAddress().getIpv6AddressNoZone(), buffer);
63 ByteBufUtils.write(buffer, peerUp.getLocalPort().getValue());
64 ByteBufUtils.write(buffer, peerUp.getRemotePort().getValue());
66 this.msgRegistry.serializeMessage(new OpenBuilder(peerUp.getSentOpen()).build(), buffer);
67 this.msgRegistry.serializeMessage(new OpenBuilder(peerUp.getReceivedOpen()).build(), buffer);
68 serializeTlvs(peerUp.getInformation(), buffer);
71 private void serializeTlvs(final Information tlvs, final ByteBuf output) {
73 for (final StringInformation stringInfo : tlvs.nonnullStringInformation()) {
74 if (stringInfo.getStringTlv() != null) {
75 serializeTlv(stringInfo.getStringTlv(), output);
82 public Notification parseMessageBody(final ByteBuf bytes) throws BmpDeserializationException {
83 final PeerUpNotificationBuilder peerUpNot = new PeerUpNotificationBuilder()
84 .setPeerHeader(parsePerPeerHeader(bytes));
86 if (peerUpNot.getPeerHeader().isIpv4()) {
87 bytes.skipBytes(Ipv6Util.IPV6_LENGTH - Ipv4Util.IP4_LENGTH);
88 peerUpNot.setLocalAddress(new IpAddressNoZone(Ipv4Util.addressForByteBuf(bytes)));
90 peerUpNot.setLocalAddress(new IpAddressNoZone(Ipv6Util.addressForByteBuf(bytes)));
92 peerUpNot.setLocalPort(new PortNumber(ByteBufUtils.readUint16(bytes)));
93 peerUpNot.setRemotePort(new PortNumber(ByteBufUtils.readUint16(bytes)));
95 final Notification opSent = this.msgRegistry
96 .parseMessage(bytes.readSlice(getBgpMessageLength(bytes)), null);
97 requireNonNull(opSent, "Error on parse Sent OPEN Message, Sent OPEN Message is null");
98 checkArgument(opSent instanceof OpenMessage, "An instance of OpenMessage notification is required");
99 final OpenMessage sent = (OpenMessage) opSent;
101 final Notification opRec = this.msgRegistry
102 .parseMessage(bytes.readSlice(getBgpMessageLength(bytes)), null);
103 requireNonNull(opRec, "Error on parse Received OPEN Message, Received OPEN Message is null");
104 checkArgument(opRec instanceof OpenMessage, "An instance of OpenMessage notification is required");
105 final OpenMessage received = (OpenMessage) opRec;
107 peerUpNot.setSentOpen(new SentOpenBuilder(sent).build());
108 peerUpNot.setReceivedOpen(new ReceivedOpenBuilder(received).build());
110 final InformationBuilder infos = new InformationBuilder();
111 if (bytes.isReadable()) {
112 parseTlvs(infos, bytes);
113 peerUpNot.setInformation(infos.build());
116 } catch (final BGPDocumentedException | BGPParsingException e) {
117 throw new BmpDeserializationException("Error while parsing BGP Open Message.", e);
120 return peerUpNot.build();
124 protected void addTlv(final InformationBuilder builder, final Tlv tlv) {
125 if (tlv instanceof StringTlv) {
126 final ImmutableList.Builder<StringInformation> stringInfoListBuilder = ImmutableList.builder();
127 if (builder.getStringInformation() != null) {
128 stringInfoListBuilder.addAll(builder.getStringInformation());
130 builder.setStringInformation(stringInfoListBuilder.add(new StringInformationBuilder().setStringTlv(
131 new StringTlvBuilder((StringTlv) tlv).build()).build()).build());
136 public int getBmpMessageType() {
140 private static int getBgpMessageLength(final ByteBuf buffer) {
141 return buffer.getUnsignedShort(buffer.readerIndex() + MessageUtil.MARKER_LENGTH);