/*
 * Copyright 2015 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.vtn.table;

import org.onlab.packet.MacAddress;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
import org.onosproject.net.flowobjective.Objective;
import org.onosproject.vtnrsc.SegmentationId;

/**
 * Applies classifier flows to the device.
 */
public interface ClassifierService {

    /**
     * The port rule that message from host matches Table(0) Match: host mac and
     * ingress port Action: set vnid and go to table(50).
     *
     * @param deviceId Device Id
     * @param segmentationId the vnid of the host belong to
     * @param inPort the ingress port of the host
     * @param srcMac the mac of the host
     * @param appId the application ID of the vtn
     * @param type the operation of the flow
     */
    void programLocalIn(DeviceId deviceId, SegmentationId segmentationId,
                        PortNumber inPort, MacAddress srcMac,
                        ApplicationId appId, Objective.Operation type);

    /**
     * The port rule that message from tunnel Table(0) Match: tunnel port and
     * vnid Action: go to table(50).
     *
     * @param deviceId Device Id
     * @param segmentationId the vnid of the host belong to
     * @param localTunnelPorts the tunnel pors of the device
     * @param type the operation of the flow
     */
    void programTunnelIn(DeviceId deviceId, SegmentationId segmentationId,
                         Iterable<PortNumber> localTunnelPorts,
                         Objective.Operation type);

}
