/**
*    Copyright 2011, Big Switch Networks, Inc. 
*    Originally created by David Erickson, Stanford University
* 
*    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 net.floodlightcontroller.core;

/**
 * Used in conjunction with {@link IOFMessageListener} to allow a listener to
 * filter an incoming message based on the {@link IOFSwitch} it originated from.
 * Implementations wanting to use this interface should implement both
 * IOFMessageListener and IOFSwitchFilter.
 *
 * @author David Erickson (daviderickson@cs.stanford.edu)
 */
public interface IOFSwitchFilter {

    /**
     * The result of this method call determines whether the
     * IOFMessageListener's receive method is called or not.
     *
     * @param sw switch to filter on
     * @return true to receive the message, false to ignore
     */
    public boolean isInterested(IOFSwitch sw);
}
