blob: 3ba25bb1096df0b0e5de8449a365174bcb9c43b2 [file] [log] [blame]
/*
* Copyright 2016-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.vtnrsc;
import static com.google.common.base.MoreObjects.toStringHelper;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.Objects;
import org.onlab.packet.IPv4;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.net.PortNumber;
/**
* Representation for five tuple information from packet.
*/
public final class DefaultFiveTuple implements FiveTuple {
private final MacAddress macSrc;
private final MacAddress macDst;
private final IpAddress ipSrc;
private final IpAddress ipDst;
private final PortNumber portSrc;
private final PortNumber portDst;
private final byte protocol;
private final TenantId tenantId;
/**
* Constructor for packet five tuple information.
*
* @param protocol protocol of the packet
* @param ipSrc source ip address of the packet
* @param ipDst destination ip address of the packet
* @param portSrc source port of the packet
* @param portDst destination port of the packet
*/
private DefaultFiveTuple(byte protocol, IpAddress ipSrc, IpAddress ipDst, PortNumber portSrc, PortNumber portDst,
TenantId tenantId, MacAddress macSrc, MacAddress macDst) {
this.protocol = protocol;
this.ipSrc = ipSrc;
this.ipDst = ipDst;
this.portSrc = portSrc;
this.portDst = portDst;
this.tenantId = tenantId;
this.macSrc = macSrc;
this.macDst = macDst;
}
@Override
public byte protocol() {
return protocol;
}
@Override
public IpAddress ipSrc() {
return ipSrc;
}
@Override
public IpAddress ipDst() {
return ipDst;
}
@Override
public PortNumber portSrc() {
return portSrc;
}
@Override
public PortNumber portDst() {
return portDst;
}
@Override
public MacAddress macSrc() {
return macSrc;
}
@Override
public MacAddress macDst() {
return macDst;
}
@Override
public TenantId tenantId() {
return tenantId;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof DefaultFiveTuple) {
final DefaultFiveTuple other = (DefaultFiveTuple) obj;
return Objects.equals(this.protocol, other.protocol) &&
Objects.equals(this.ipSrc, other.ipSrc) &&
Objects.equals(this.ipDst, other.ipDst) &&
Objects.equals(this.portSrc, other.portSrc) &&
Objects.equals(this.portDst, other.portDst);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(this.protocol, this.ipSrc, this.ipDst, this.portSrc, this.portDst);
}
@Override
public String toString() {
return toStringHelper(this)
.omitNullValues()
.add("protocol", protocol)
.add("ipSrc", ipSrc)
.add("ipDst", ipDst)
.add("portSrc", portSrc)
.add("portDst", portDst)
.toString();
}
/**
* To create an instance of the builder.
*
* @return instance of builder
*/
public static Builder builder() {
return new Builder();
}
/**
* Builder class for Five tuple info.
*/
public static final class Builder implements FiveTuple.Builder {
private IpAddress ipSrc;
private IpAddress ipDst;
private PortNumber portSrc;
private PortNumber portDst;
private byte protocol;
private TenantId tenantId;
private MacAddress macSrc;
private MacAddress macDst;
@Override
public Builder setIpSrc(IpAddress ipSrc) {
this.ipSrc = ipSrc;
return this;
}
@Override
public Builder setIpDst(IpAddress ipDst) {
this.ipDst = ipDst;
return this;
}
@Override
public Builder setPortSrc(PortNumber portSrc) {
this.portSrc = portSrc;
return this;
}
@Override
public Builder setPortDst(PortNumber portDst) {
this.portDst = portDst;
return this;
}
@Override
public Builder setProtocol(byte protocol) {
this.protocol = protocol;
return this;
}
@Override
public Builder setTenantId(TenantId tenantId) {
this.tenantId = tenantId;
return this;
}
@Override
public Builder setMacSrc(MacAddress macSrc) {
this.macSrc = macSrc;
return this;
}
@Override
public Builder setMacDst(MacAddress macDst) {
this.macDst = macDst;
return this;
}
@Override
public FiveTuple build() {
checkArgument(protocol == IPv4.PROTOCOL_TCP || protocol == IPv4.PROTOCOL_UDP ||
protocol == IPv4.PROTOCOL_ICMP, "Unsupported value for protocol while creating five tuple");
return new DefaultFiveTuple(protocol, ipSrc, ipDst, portSrc, portDst, tenantId, macSrc, macDst);
}
}
}