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);
}