blob: 607ce38de008b40754ab44a0ba8778efaf90941c [file] [log] [blame]
/*
* Copyright 2017-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.bgpio.protocol.evpn;
import com.google.common.base.MoreObjects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onlab.packet.MacAddress;
import org.onosproject.bgpio.exceptions.BgpParseException;
import org.onosproject.bgpio.types.BgpEvpnEsi;
import org.onosproject.bgpio.types.BgpEvpnLabel;
import org.onosproject.bgpio.types.RouteDistinguisher;
import org.onosproject.bgpio.util.Constants;
import org.onosproject.bgpio.util.Validation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.InetAddress;
public class BgpEvpnRouteType2Nlri implements BgpEvpnNlriData {
/*
* REFERENCE : RFC 7432 BGP MPLS-Based Ethernet VPN
+---------------------------------------+
| RD (8 octets) |
+---------------------------------------+
|Ethernet Segment Identifier (10 octets)|
+---------------------------------------+
| Ethernet Tag ID (4 octets) |
+---------------------------------------+
| MAC Address Length (1 octet) |
+---------------------------------------+
| MAC Address (6 octets) |
+---------------------------------------+
| IP Address Length (1 octet) |
+---------------------------------------+
| IP Address (0, 4, or 16 octets) |
+---------------------------------------+
| MPLS Label1 (3 octets) |
+---------------------------------------+
| MPLS Label2 (0 or 3 octets) |
+---------------------------------------+
Figure : A MAC/IP Advertisement route type specific EVPN NLRI
*/
public static final short TYPE = Constants.BGP_EVPN_MAC_IP_ADVERTISEMENT;
private static final Logger log = LoggerFactory.getLogger(BgpEvpnRouteType2Nlri.class);
// unit of length is bit
public static final short IPV4_ADDRESS_LENGTH = 32;
public static final short MAC_ADDRESS_LENGTH = 48;
private RouteDistinguisher rd;
private BgpEvpnEsi esi;
private int ethernetTagID;
private byte macAddressLength;
private MacAddress macAddress;
private byte ipAddressLength;
private InetAddress ipAddress;
private BgpEvpnLabel mplsLabel1;
private BgpEvpnLabel mplsLabel2;
/**
* Resets parameters.
*/
public BgpEvpnRouteType2Nlri() {
this.rd = null;
this.esi = null;
this.ethernetTagID = 0;
this.macAddressLength = 0;
this.macAddress = null;
this.ipAddressLength = 0;
this.ipAddress = null;
this.mplsLabel1 = null;
this.mplsLabel2 = null;
}
/**
* Creates the Evpn route type 2 route.
*
* @param rd route distinguisher
* @param esi esi
* @param ethernetTagID ethernet tag id
* @param macAddress mac
* @param ipAddress ip
* @param mplsLabel1 label
* @param mplsLabel2 label
*/
public BgpEvpnRouteType2Nlri(RouteDistinguisher rd,
BgpEvpnEsi esi,
int ethernetTagID, MacAddress macAddress,
InetAddress ipAddress, BgpEvpnLabel mplsLabel1,
BgpEvpnLabel mplsLabel2) {
this.rd = rd;
this.esi = esi;
this.ethernetTagID = ethernetTagID;
this.macAddressLength = MAC_ADDRESS_LENGTH;
this.macAddress = macAddress;
if (ipAddress != null) {
this.ipAddressLength = IPV4_ADDRESS_LENGTH;
this.ipAddress = ipAddress;
} else {
this.ipAddressLength = 0;
this.ipAddress = null;
}
this.mplsLabel1 = mplsLabel1;
this.mplsLabel2 = mplsLabel2;
}
/**
* Reads the Evpn type 2 attributes.
*
* @param cb channel buffer
* @return type2 route
* @throws BgpParseException parse exception
*/
public static BgpEvpnRouteType2Nlri read(ChannelBuffer cb) throws BgpParseException {
if (cb.readableBytes() == 0) {
return null;
}
RouteDistinguisher rd = RouteDistinguisher.read(cb);
BgpEvpnEsi esi = BgpEvpnEsi.read(cb);
int ethernetTagID = cb.readInt();
byte macAddressLength = cb.readByte();
MacAddress macAddress = Validation.toMacAddress(macAddressLength / 8, cb);
byte ipAddressLength = cb.readByte();
InetAddress ipAddress = null;
if (ipAddressLength > 0) {
ipAddress = Validation.toInetAddress(ipAddressLength / 8, cb);
}
BgpEvpnLabel mplsLabel1 = BgpEvpnLabel.read(cb);
BgpEvpnLabel mplsLabel2 = null;
if (cb.readableBytes() > 0) {
mplsLabel2 = BgpEvpnLabel.read(cb);
}
return new BgpEvpnRouteType2Nlri(rd, esi, ethernetTagID, macAddress,
ipAddress, mplsLabel1,
mplsLabel2);
}
@Override
public int write(ChannelBuffer cb) {
int iLenStartIndex = cb.writerIndex();
cb.writeLong(rd.getRouteDistinguisher());
esi.write(cb);
cb.writeInt(ethernetTagID);
cb.writeByte(macAddressLength);
cb.writeBytes(macAddress.toBytes());
cb.writeByte(ipAddressLength);
if (ipAddressLength > 0) {
cb.writeBytes(ipAddress.getAddress());
}
mplsLabel1.write(cb);
if (mplsLabel2 != null) {
mplsLabel2.write(cb);
}
return cb.writerIndex() - iLenStartIndex;
}
/**
* Returns the rd.
*
* @return rd route distinguisher
*/
public RouteDistinguisher getRouteDistinguisher() {
return rd;
}
/**
* Returns the esi.
*
* @return esi ethernet segment identifier
*/
public BgpEvpnEsi getEthernetSegmentidentifier() {
return esi;
}
/**
* Returns the ethernet tag id.
*
* @return macAddress macadress
*/
public int getEthernetTagID() {
return ethernetTagID;
}
public MacAddress getMacAddress() {
return macAddress;
}
/**
* Returns the ip address.
*
* @return ipAddress ipaddress
*/
public InetAddress getIpAddress() {
return ipAddress;
}
/**
* Returns the mpls label.
*
* @return mplsLabel1 mpls label
*/
public BgpEvpnLabel getMplsLable1() {
return mplsLabel1;
}
/**
* Returns the mpls label.
*
* @return mplsLabel2 mpls label
*/
public BgpEvpnLabel getMplsLable2() {
return mplsLabel2;
}
/**
* Set the rd.
*
* @param rd route distinguisher
*/
public void setRouteDistinguisher(RouteDistinguisher rd) {
this.rd = rd;
}
/**
* Set the ESI.
*
* @param esi esi
*/
public void setEthernetSegmentidentifier(BgpEvpnEsi esi) {
this.esi = esi;
}
/**
* Set the ethernet tag id.
*
* @param ethernetTagID ethernet tag id.
*/
public void setEthernetTagID(int ethernetTagID) {
this.ethernetTagID = ethernetTagID;
}
/**
* Set the mac address.
*
* @param macAddress mac
*/
public void setMacAddress(MacAddress macAddress) {
this.macAddress = macAddress;
}
/**
* Set the ip address.
*
* @param ipAddress ip
*/
public void setIpAddress(InetAddress ipAddress) {
this.ipAddress = ipAddress;
}
/**
* Set the mpls label.
*
* @param mplsLabel1 label
*/
public void setMplsLable1(BgpEvpnLabel mplsLabel1) {
this.mplsLabel1 = mplsLabel1;
}
/**
* Set the mpls label.
*
* @param mplsLabel2 label
*/
public void setMplsLable2(BgpEvpnLabel mplsLabel2) {
this.mplsLabel2 = mplsLabel2;
}
@Override
public BgpEvpnRouteType getType() {
return BgpEvpnRouteType.MAC_IP_ADVERTISEMENT;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass()).omitNullValues()
.add("rd ", rd)
.add("esi", esi)
.add("ethernetTagID", ethernetTagID)
.add("macAddressLength", macAddressLength)
.add("macAddress ", macAddress)
.add("ipAddressLength", ipAddressLength)
.add("ipAddress", ipAddress)
.add("mplsLabel1 ", mplsLabel1)
.add("mplsLabel2", mplsLabel2).toString();
}
}