RoutingService.java 4.88 KB
/*
 * 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 java.util.Collection;

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

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

    /**
     * Specifies the type of an IP address or an IP prefix location.
     */
    public static 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>
     */
    public 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.
     */
    public void start();

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

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

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

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

    /**
     * Gets all IPv6 routes known to SDN-IP.
     *
     * @return the SDN-IP IPv6 routes
     */
    public 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
     */
    public 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
     */
    public 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
     */
    public 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
     */
    public void packetReactiveProcessor(IpAddress dstIpAddress,
                                        IpAddress srcIpAddress,
                                        ConnectPoint srcConnectPoint,
                                        MacAddress srcMacAddress);
}