Introducing BandwidthProfileConfigBehaviour to manage policers/markers
- Creating BandwidthProfile Class to represent generic policers/markers
- BandwidthProfile can be Single/Two Rate, Two/Three Color depending on parameters
- Including fromMeter() method to convert a Meter into a BandwidthProfile
- Adding unit tests for BandwidthProfile class
- Creating BandwidthProfileAction class to represent a color (green/yellow/red) action
- BandwidthProfileAction allows remarking one of: DSCP class, IP precedence, Drop precedence
- Adding unit tests for BandwidthProfileAction class
- Creating DscpClass and IPPrecedence Enums and unit tests in org.onlab.packet
- Adding kBps/MBps/GBps methods in org.onlab.util.Bandwidth class
Change-Id: I54156329a527ebd9165d8f55e03e0782925caa2b
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/BandwidthProfileAction.java b/core/api/src/main/java/org/onosproject/net/behaviour/BandwidthProfileAction.java
new file mode 100644
index 0000000..ae6a153
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/BandwidthProfileAction.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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();
+ }
+}