blob: 9c67a2b890405cd88c048bf6f6fdd53435e794c3 [file] [log] [blame]
/*
* Copyright 2024-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.bgpmonitoring.type;
import com.google.common.base.MoreObjects;
import org.onosproject.bgpmonitoring.InitiationMessage;
import org.onosproject.bgpmonitoring.BmpParseException;
import org.onosproject.bgpmonitoring.BmpMsg;
import java.util.List;
import java.util.Objects;
import java.util.function.BiPredicate;
import java.nio.ByteBuffer;
import org.onlab.packet.Deserializer;
/**
* A means for the monitored router to inform the
* monitoring station of its vendor, software version, and so on.
* <p>
* The initiation message provides a means for the monitored router to.
* inform the monitoring station of its vendor, software version, and so
* on. An initiation message MUST be sent as the first message after
* the TCP session comes up. An initiation message MAY be sent at any
* point thereafter, if warranted by a change on the monitored router.
* <p>
* The initiation message consists of the common BMP header followed by
* two or more Information TLVs containing information
* about the monitored router. The sysDescr and sysName Information
* TLVs MUST be sent, any others are optional. The string TLV MAY be
* included multiple times.
*/
public final class BmpInitiationMessage extends InitiationMessage {
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Information Type | Information Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Information (variable) |
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
private List<BmpMsg> initiationMeassages;
private BmpInitiationMessage(Builder builder) {
this.initiationMeassages = builder.initiationMeassages;
}
/**
* Returns BMP initiation message.
*
* @return BMP initiation message
*/
public List<BmpMsg> getInitiationMeassages() {
return initiationMeassages;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BmpInitiationMessage that = (BmpInitiationMessage) o;
return Objects.equals(initiationMeassages, that.initiationMeassages);
}
@Override
public int hashCode() {
return Objects.hash(initiationMeassages);
}
/**
* Data deserializer function for BMP initiation message.
*
* @return data deserializer function
*/
public static Deserializer<BmpInitiationMessage> deserializer() {
return (data, offset, length) -> {
BiPredicate<ByteBuffer, Integer> isValidBuffer = (b, l)
-> b.hasRemaining() && b.remaining() >= l;
ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
if (!isValidBuffer.test(bb, INIT_MSG_NOTIFICATION_HEADER_MIN_LENGTH)) {
throw new BmpParseException("Invalid bmp initiation message buffer size.");
}
Builder builder = new Builder();
while (bb.hasRemaining() && bb.remaining() > INIT_MSG_NOTIFICATION_HEADER_MIN_LENGTH) {
int msgtype = bb.getShort();
int msgLength = bb.getShort();
bb.position(bb.position() - INIT_MSG_NOTIFICATION_HEADER_MIN_LENGTH);
if (bb.remaining() < msgLength) {
break;
}
byte[] msgBytes = new byte[msgLength];
bb.get(msgBytes);
builder.initiationMeassages(BmpInitMsg.deserializer()
.deserialize(msgBytes, 0, msgLength));
}
return builder.build();
};
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("initiationMeassages", initiationMeassages)
.toString();
}
/**
* Builder for BMP initiation message.
*/
private static class Builder {
private List<BmpMsg> initiationMeassages;
/**
* Setter bmp initiation message.
*
* @param msg bmp initiation message.
* @return this class builder.
*/
public Builder initiationMeassages(BmpMsg msg) {
this.initiationMeassages.add(msg);
return this;
}
/**
* Builds bmp initiation message.
*
* @return bmp initiation message.
*/
public BmpInitiationMessage build() {
return new BmpInitiationMessage(this);
}
}
}