/*
 * 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.routing;

import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onosproject.net.ConnectPoint;

import java.util.Collection;

/**
 * Provides a way of interacting with the RIB management component.
 */
public interface RoutingService {

    String ROUTER_APP_ID = "org.onosproject.router";

    /**
     * Specifies the type of an IP address or an IP prefix location.
     */
    enum LocationType {
        /**
         * The location of an IP address or an IP prefix is in local SDN network.
         */
        LOCAL,
        /**
         * The location of an IP address or an IP prefix is outside local SDN network.
         */
        INTERNET,
        /**
         * There is no route for this IP address or IP prefix.
         */
        NO_ROUTE
    }

    /**
     * Specifies the type of traffic.
     * <p>
     * We classify traffic by the first packet of each traffic.
     * </p>
     */
    enum TrafficType {
        /**
         * Traffic from a host located in local SDN network wants to
         * communicate with destination host located in Internet (outside
         * local SDN network).
         */
        HOST_TO_INTERNET,
        /**
         * Traffic from Internet wants to communicate with a host located
         * in local SDN network.
         */
        INTERNET_TO_HOST,
        /**
         * Both the source host and destination host of a traffic are in
         * local SDN network.
         */
        HOST_TO_HOST,
        /**
         * Traffic from Internet wants to traverse local SDN network.
         */
        INTERNET_TO_INTERNET,
        /**
         * Any traffic wants to communicate with a destination which has
         * no route, or traffic from Internet wants to access a local private
         * IP address.
         */
        DROP,
        /**
         * Traffic does not belong to the types above.
         */
        UNKNOWN
    }

    /**
     * Starts the routing service.
     */
    void start();

    /**
     * Adds FIB listener.
     *
     * @param fibListener listener to send FIB updates to
     */
    void addFibListener(FibListener fibListener);

    /**
     * Adds intent creation and submission listener.
     *
     * @param intentRequestListener listener to send intent creation and
     *        submission request to
     */
    void addIntentRequestListener(IntentRequestListener
                                         intentRequestListener);

    /**
     * Stops the routing service.
     */
    void stop();

    /**
     * Gets all IPv4 routes known to SDN-IP.
     *
     * @return the SDN-IP IPv4 routes
     */
    Collection<RouteEntry> getRoutes4();

    /**
     * Gets all IPv6 routes known to SDN-IP.
     *
     * @return the SDN-IP IPv6 routes
     */
    Collection<RouteEntry> getRoutes6();

    /**
     * Evaluates the location of an IP address and returns the location type.
     *
     * @param ipAddress the IP address to evaluate
     * @return the IP address location type
     */
    LocationType getLocationType(IpAddress ipAddress);

    /**
     * Finds out the route entry which has the longest matchable IP prefix.
     *
     * @param ipAddress IP address used to find out longest matchable IP prefix
     * @return a route entry which has the longest matchable IP prefix if
     * found, otherwise null
     */
    RouteEntry getLongestMatchableRouteEntry(IpAddress ipAddress);

    /**
     * Finds out the egress connect point where to emit the first packet
     * based on destination IP address.
     *
     * @param dstIpAddress the destination IP address
     * @return the egress connect point if found, otherwise null
     */
    ConnectPoint getEgressConnectPoint(IpAddress dstIpAddress);

    /**
     * Routes packet reactively.
     *
     * @param dstIpAddress the destination IP address of a packet
     * @param srcIpAddress the source IP address of a packet
     * @param srcConnectPoint the connect point where a packet comes from
     * @param srcMacAddress the source MAC address of a packet
     */
    void packetReactiveProcessor(IpAddress dstIpAddress,
                                        IpAddress srcIpAddress,
                                        ConnectPoint srcConnectPoint,
                                        MacAddress srcMacAddress);
}
