blob: 4e090c95a1e261ecf219fdfd87908cd96a9651c9 [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.net.behaviour;
import com.google.common.annotations.Beta;
import com.google.common.base.MoreObjects;
import org.onlab.packet.DscpClass;
import org.onlab.packet.IPPrecedence;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Objects;
/**
* Represents an action to be taken by a marker/policer.
*/
@Beta
public final class BandwidthProfileAction {
/**
* Denotes the type of action to be taken.
*/
public enum Action {
/**
* Traffic is allowed to pass unmodified.
*/
PASS,
/**
* Traffic is allowed to pass after being appropriately remarked.
*/
REMARK,
/**
* Traffic is dropped.
*/
DISCARD
}
private final Action action;
private final DscpClass dscpClass;
private final IPPrecedence ipPrecedence;
private final Short dropPrecedence;
private BandwidthProfileAction(Action action,
DscpClass dscpClass,
IPPrecedence ipPrecedence,
Short dropPrecedence) {
this.action = action;
this.dscpClass = dscpClass;
this.ipPrecedence = ipPrecedence;
this.dropPrecedence = dropPrecedence;
}
/**
* Obtains the type of this bandwidth profile action object.
*
* @return the bandwidth profile action type
*/
public Action getAction() {
return this.action;
}
/**
* Obtains the DSCP class corresponding to the REMARK action.
* If this is not a REMARK action or if another field is remarked
* null is returned.
*
* @return the DSCP class for the action; may be null
*/
public DscpClass getDscpClass() {
return this.dscpClass;
}
/**
* Obtains the IP precedence corresponding to the REMARK action.
* If this is not a REMARK action or if another field is remarked
* null is returned.
*
* @return the IP precedence for the action; may be null
*/
public IPPrecedence getIpPrecedence() {
return this.ipPrecedence;
}
/**
* Obtains the drop precedence corresponding to the REMARK action.
* If this is not a REMARK action or if another field is remarked
* null is returned.
*
* @return the drop precedence for the action; may be null
*/
public Short getDropPrecedence() {
return this.dropPrecedence;
}
/**
* Returns a new builder.
*
* @return new builder
*/
public static Builder builder() {
return new Builder();
}
/**
* Builder of BandwidthProfileAction entities.
*/
public static final class Builder {
private Action action;
private DscpClass dscpClass;
private IPPrecedence ipPrecedence;
private Short dropPrecedence;
/**
* Sets the type of this builder.
*
* @param action the builder type to set
* @return this builder instance
*/
public Builder action(Action action) {
this.action = action;
return this;
}
/**
* Sets the DSCP class of this builder.
*
* @param dscpClass the builder DSCP class to set
* @return this builder instance
*/
public Builder dscpClass(DscpClass dscpClass) {
this.dscpClass = dscpClass;
return this;
}
/**
* Sets the IP precedence of this builder.
*
* @param ipPrecedence the builder IP precedence to set
* @return this builder instance
*/
public Builder ipPrecedence(IPPrecedence ipPrecedence) {
this.ipPrecedence = ipPrecedence;
return this;
}
/**
* Sets the drop precedence of this builder.
*
* @param dropPrecedence the drop IP precedence to set
* @return this builder instance
*/
public Builder dropPrecedence(Short dropPrecedence) {
this.dropPrecedence = dropPrecedence;
return this;
}
/**
* Builds a new BandwidthProfileAction based on builder's parameters.
*
* @return a new BandwidthProfileAction instance
*/
public BandwidthProfileAction build() {
checkNotNull(action);
checkArgument(!action.equals(Action.REMARK) ||
(dscpClass != null ^
ipPrecedence != null ^
dropPrecedence != null),
"Exactly one remark type must be defined");
return new BandwidthProfileAction(action,
dscpClass,
ipPrecedence,
dropPrecedence);
}
}
@Override
public int hashCode() {
return Objects.hash(action, dscpClass, ipPrecedence, dropPrecedence);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof BandwidthProfileAction) {
final BandwidthProfileAction that = (BandwidthProfileAction) obj;
return this.getClass() == that.getClass() &&
Objects.equals(this.action, that.action) &&
Objects.equals(this.dscpClass, that.dscpClass) &&
Objects.equals(this.ipPrecedence, that.ipPrecedence) &&
Objects.equals(this.dropPrecedence, that.dropPrecedence);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("action", action == null ? null : action.name())
.add("dscpClass", dscpClass == null ? null : dscpClass.name())
.add("ipPrecedence", ipPrecedence)
.add("dropPrecedence", dropPrecedence)
.toString();
}
}