package net.floodlightcontroller.flowcache;

import org.openflow.protocol.OFMatchWithSwDpid;

import net.floodlightcontroller.core.FloodlightContext;
import net.floodlightcontroller.core.FloodlightContextStore;
import net.floodlightcontroller.core.IOFSwitch;
import net.floodlightcontroller.devicemanager.SwitchPort;
import net.floodlightcontroller.core.module.IFloodlightService;

/**
 * The Interface IFlowCache.
 * <p>
 * public interface APIs to Big Switch Flow-Cache Service. Flow-Cache maintains
 * the network-level flows that are currently deployed in the underlying 
 * network. The flow cache can be queried using various filters by using the
 * corresponding APIs.
 * 
 * @author subrata
 *
 */
public interface IFlowCacheService extends IFloodlightService {

    public static final String FLOWCACHE_APP_NAME = 
        "net.floodlightcontroller.flowcache.appName";
    public static final String FLOWCACHE_APP_INSTANCE_NAME = 
        "net.floodlightcontroller.flowcache.appInstanceName";

    /**
     * The flow cache query event type indicating the event that triggered the
     * query. The callerOpaqueObj can be keyed based on this event type
     */
    public static enum FCQueryEvType {
        /** The GET query. Flows need not be reconciled for this query type */
        GET,
        /** A new App was added. */
        APP_ADDED,
        /** An App was deleted. */
        APP_DELETED,
        /** Interface rule of an app was modified */
        APP_INTERFACE_RULE_CHANGED,
        /** Some App configuration was changed */
        APP_CONFIG_CHANGED,
        /** An ACL was added */
        ACL_ADDED,
        /** An ACL was deleted */
        ACL_DELETED,
        /** An ACL rule was added */
        ACL_RULE_ADDED,
        /** An ACL rule was deleted */
        ACL_RULE_DELETED,
        /** ACL configuration was changed */
        ACL_CONFIG_CHANGED,
        /** device had moved to a different port in the network */
        DEVICE_MOVED,
        /** device's property had changed, such as tag assignment */
        DEVICE_PROPERTY_CHANGED,
        /** Link down */
        LINK_DOWN,
        /** Periodic scan of switch flow table */
        PERIODIC_SCAN,
    }
    
    /**
     * A FloodlightContextStore object that can be used to interact with the 
     * FloodlightContext information about flowCache.
     */
    public static final FloodlightContextStore<String> fcStore = 
        new FloodlightContextStore<String>();
    
    /**
     * Submit a flow cache query with query parameters specified in FCQueryObj
     * object. The query object can be created using one of the newFCQueryObj 
     * helper functions in IFlowCache interface. 
     * <p>
     * The queried flows are returned via the flowQueryRespHandler() callback 
     * that the caller must implement. The caller can match the query with
     * the response using unique callerOpaqueData which remains unchanged
     * in the request and response callback.
     *
     * @see  com.bigswitch.floodlight.flowcache#flowQueryRespHandler
     * @param query the flow cache query object as input
     * 
     */
    public void submitFlowCacheQuery(FCQueryObj query);

    /**
     * Deactivates all flows in the flow cache for which the source switch
     * matches the given switchDpid. Note that the flows are NOT deleted
     * from the cache.
     *
     * @param switchDpid Data-path identifier of the source switch
     */
    public void deactivateFlowCacheBySwitch(long switchDpid);

    /**
     * Deletes all flows in the flow cache for which the source switch
     * matches the given switchDpid. 
     * 
     * @param switchDpid Data-path identifier of the source switch
     */
    public void deleteFlowCacheBySwitch(long switchDpid);

    /**
     * Add a flow to the flow-cache - called when a flow-mod is about to be
     * written to a set of switches. If it returns false then it should not
     * be written to the switches. If it returns true then the cookie returned
     * should be used for the flow mod sent to the switches.
     *
     * @param appInstName Application instance name
     * @param ofm openflow match object
     * @param cookie openflow-mod cookie
     * @param swPort SwitchPort object
     * @param priority openflow match priority
     * @param action action taken on the matched packets (PERMIT or DENY)
     * @return true:  flow should be written to the switch(es)
     *         false: flow should not be written to the switch(es). false is
     *                returned, for example, when the flow was recently
     *                written to the flow-cache and hence it is dampened to
     *                avoid frequent writes of the same flow to the switches
     *                This case can typically arise for the flows written at the
     *                internal ports as they are heavily wild-carded.
     */
    public boolean addFlow(String appInstName, OFMatchWithSwDpid ofm, 
                           Long cookie, long srcSwDpid, 
                           short inPort, short priority, byte action);

    /**
     * Add a flow to the flow-cache - called when a flow-mod is about to be
     * written to a set of switches. If it returns false then it should not
     * be written to the switches. If it returns true then the cookie returned
     * should be used for the flow mod sent to the switches.
     *
     * @param cntx the cntx
     * @param ofm the ofm
     * @param cookie the cookie
     * @param swPort the sw port
     * @param priority the priority
     * @param action the action
     * @return true:  flow should be written to the switch(es)
     * false: flow should not be written to the switch(es). false is
     * returned, for example, when the flow was recently
     * written to the flow-cache and hence it is dampened to
     * avoid frequent writes of the same flow to the switches
     * This case can typically arise for the flows written at the
     * internal ports as they are heavily wild-carded.
     */
    public boolean addFlow(FloodlightContext cntx, OFMatchWithSwDpid ofm, 
                           Long cookie, SwitchPort swPort, 
                           short priority, byte action);

    /**
     * Move the specified flow from its current application instance to a 
     * different application instance. This API can be used when a flow moves
     * to a different application instance when the application instance
     * configuration changes or when a device moves to a different part in
     * the network that belongs to a different application instance.
     * <p>
     * Note that, if the flow was not found in the current application 
     * instance then the flow is not moved to the new application instance.
     * 
     * @param ofMRc the object containing the flow match and new application
     * instance name.
     * @return true is the flow was found in the flow cache in the current 
     * application instance; false if the flow was not found in the flow-cache
     * in the current application instance.
     */
    public boolean moveFlowToDifferentApplInstName(OFMatchReconcile ofMRc);

    /**
     * Delete all flow from the specified switch
     * @param sw
     */
    public void deleteAllFlowsAtASourceSwitch(IOFSwitch sw);
    
    /**
     * Post a request to update flowcache from a switch.
     * This is an asynchronous operation.
     * It queries the switch for stats and updates the flowcache asynchronously
     * with the response.
     * @param swDpid
     * @param delay_ms
     */
    public void querySwitchFlowTable(long swDpid);
}
