blob: d5fedf2ed20dd26d2fd71cc0e1bae7a55d211ed1 [file] [log] [blame]
/*
* Copyright 2015-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.flowobjective;
import com.google.common.annotations.Beta;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
/**
* Represents a description of which types of traffic need to
* be forwarded through the device. A forwarding objective may
* result in multiple rules at the device. There are two main types
* of forwarding objectives:
*
* - Versatile
* - Specific
*
* A versatile forwarding objective represents a composite rule that matches
* two or more header fields. The use of versatile usually indicates that this
* rule should be inserted in its entirety into the ACL table. Although,
* drivers for some devices are free to implement this differently.
*
* A specific forwarding objective represents a specific rule matching one or
* more header fields. The installation of this rule may result in several rules
* at the device. For example, one per table type.
*/
@Beta
public interface ForwardingObjective extends Objective {
/**
* Represents whether this objective is monolithic or
* may be broken down into parts.
*/
enum Flag {
/**
* A decomposable objective.
*/
SPECIFIC,
/**
* A monolithic objective.
*/
VERSATILE
}
/**
* Obtain the selector for this objective.
*
* @return a traffic selector
*/
TrafficSelector selector();
/**
* Obtain the traffic treatment for this objective. Mutually exclusive with
* 'treatment'.
*
* @return an integer
*/
Integer nextId();
/**
* A traffic treatment for this forwarding objective. Mutually exclusive
* with a nextId.
*
* @return a traffic treatment
*/
TrafficTreatment treatment();
/**
* Obtain the type of this objective.
*
* @return a flag type
*/
Flag flag();
/**
* Auxiliary optional information provided to the device driver. Typically
* conveys information about selectors (matches) that are intended to
* use this Forwarding Objective.
*
* @return a selector intended to pass meta information to the device driver.
* Value may be null if no meta information is provided.
*/
TrafficSelector meta();
/**
* A forwarding objective builder.
*/
interface Builder extends Objective.Builder {
/**
* Assigns a selector to the forwarding objective.
*
* @param selector a traffic selector
* @return a forwarding objective builder
*/
Builder withSelector(TrafficSelector selector);
/**
* Assigns a next step to the forwarding objective.
*
* @param nextId a next objective id.
* @return a forwarding objective builder
*/
Builder nextStep(int nextId);
/**
* Assigns the treatment for this forwarding objective.
*
* @param treatment a traffic treatment
* @return a forwarding objective
*/
Builder withTreatment(TrafficTreatment treatment);
/**
* Assigns the flag to the forwarding objective.
*
* @param flag a flag
* @return a forwarding objective builder
*/
Builder withFlag(Flag flag);
/**
* Set meta information related to this forwarding objective.
*
* @param selector match conditions
* @return an objective builder
*/
Builder withMeta(TrafficSelector selector);
/**
* Builds the forwarding objective that will be added.
*
* @return a forwarding objective
*/
@Override
ForwardingObjective add();
/**
* Builds the forwarding objective that will be removed.
*
* @return a forwarding objective.
*/
@Override
ForwardingObjective remove();
/**
* Builds the forwarding objective that will be added.
* The context will be used to notify the calling application.
*
* @param context an objective context
* @return a forwarding objective
*/
@Override
ForwardingObjective add(ObjectiveContext context);
/**
* Builds the forwarding objective that will be removed.
* The context will be used to notify the calling application.
*
* @param context an objective context
* @return a forwarding objective
*/
@Override
ForwardingObjective remove(ObjectiveContext context);
}
}