| /** |
| * Copyright 2011,2012, 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.devicemanager; |
| |
| import java.util.Collection; |
| import java.util.EnumSet; |
| import java.util.Iterator; |
| |
| import net.floodlightcontroller.core.FloodlightContextStore; |
| import net.floodlightcontroller.core.module.IFloodlightService; |
| |
| /** |
| * Device manager allows interacting with devices on the network. Note |
| * that under normal circumstances, {@link Device} objects should be retrieved |
| * from the {@link FloodlightContext} rather than from {@link IDeviceManager}. |
| */ |
| public interface IDeviceService extends IFloodlightService { |
| /** |
| * Fields used in devices for indexes and querying |
| * @see IDeviceService#addIndex |
| */ |
| enum DeviceField { |
| MAC, IPV4, VLAN, SWITCH, PORT |
| } |
| |
| /** |
| * The source device for the current packet-in, if applicable. |
| */ |
| public static final String CONTEXT_SRC_DEVICE = |
| "net.floodlightcontroller.devicemanager.srcDevice"; |
| |
| /** |
| * The destination device for the current packet-in, if applicable. |
| */ |
| public static final String CONTEXT_DST_DEVICE = |
| "net.floodlightcontroller.devicemanager.dstDevice"; |
| |
| /** |
| * A FloodlightContextStore object that can be used to interact with the |
| * FloodlightContext information created by BVS manager. |
| */ |
| public static final FloodlightContextStore<IDevice> fcStore = |
| new FloodlightContextStore<IDevice>(); |
| |
| /** |
| * Get the device with the given device key. |
| * |
| * @param deviceKey the key to search for |
| * @return the device associated with the key, or null if no such device |
| * @see IDevice#getDeviceKey() |
| */ |
| public IDevice getDevice(Long deviceKey); |
| |
| /** |
| * Search for a device exactly matching the provided device fields. This |
| * is the same lookup process that is used for packet_in processing and |
| * device learning. Thus, findDevice() can be used to match flow entries |
| * from switches to devices. |
| * Only the key fields as defined by the {@link IEntityClassifierService} will |
| * be important in this search. All key fields MUST be supplied. |
| * |
| *{@link queryDevices()} might be more appropriate! |
| * |
| * @param macAddress The MAC address |
| * @param vlan the VLAN. Null means no VLAN and is valid even if VLAN is a |
| * key field. |
| * @param ipv4Address the ipv4 address |
| * @param switchDPID the switch DPID |
| * @param switchPort the switch port |
| * @return an {@link IDevice} or null if no device is found. |
| * @see IDeviceManager#setEntityClassifier(IEntityClassifierService) |
| * @throws IllegalArgumentException if not all key fields of the |
| * current {@link IEntityClassifierService} are specified. |
| */ |
| public IDevice findDevice(long macAddress, Short vlan, |
| Integer ipv4Address, Long switchDPID, |
| Integer switchPort) |
| throws IllegalArgumentException; |
| |
| /** |
| * Get a destination device using entity fields that corresponds with |
| * the given source device. The source device is important since |
| * there could be ambiguity in the destination device without the |
| * attachment point information. |
| * |
| * @param source the source device. The returned destination will be |
| * in the same entity class as the source. |
| * @param macAddress The MAC address for the destination |
| * @param vlan the VLAN if available |
| * @param ipv4Address The IP address if available. |
| * @return an {@link IDevice} or null if no device is found. |
| * @see IDeviceService#findDevice(long, Short, Integer, Long, |
| * Integer) |
| * @throws IllegalArgumentException if not all key fields of the |
| * source's {@link IEntityClass} are specified. |
| */ |
| public IDevice findDestDevice(IDevice source, |
| long macAddress, Short vlan, |
| Integer ipv4Address) |
| throws IllegalArgumentException; |
| |
| /** |
| * Get an unmodifiable collection view over all devices currently known. |
| * @return the collection of all devices |
| */ |
| public Collection<? extends IDevice> getAllDevices(); |
| |
| /** |
| * Create an index over a set of fields. This allows efficient lookup |
| * of devices when querying using the indexed set of specified fields. |
| * The index must be registered before any device learning takes place, |
| * or it may be incomplete. It's OK if this is called multiple times with |
| * the same fields; only one index will be created for each unique set of |
| * fields. |
| * |
| * @param perClass set to true if the index should be maintained for each |
| * entity class separately. |
| * @param keyFields the set of fields on which to index |
| */ |
| public void addIndex(boolean perClass, |
| EnumSet<DeviceField> keyFields); |
| |
| /** |
| * Find devices that match the provided query. Any fields that are |
| * null will not be included in the query. If there is an index for |
| * the query, then it will be performed efficiently using the index. |
| * Otherwise, there will be a full scan of the device list. |
| * |
| * @param macAddress The MAC address |
| * @param vlan the VLAN |
| * @param ipv4Address the ipv4 address |
| * @param switchDPID the switch DPID |
| * @param switchPort the switch port |
| * @return an iterator over a set of devices matching the query |
| * @see IDeviceService#queryClassDevices(IEntityClass, Long, |
| * Short, Integer, Long, Integer) |
| */ |
| public Iterator<? extends IDevice> queryDevices(Long macAddress, |
| Short vlan, |
| Integer ipv4Address, |
| Long switchDPID, |
| Integer switchPort); |
| |
| /** |
| * Find devices that match the provided query. Only the index for |
| * the class of the specified reference device will be searched. |
| * Any fields that are null will not be included in the query. If |
| * there is an index for the query, then it will be performed |
| * efficiently using the index. Otherwise, there will be a full scan |
| * of the device list. |
| * |
| * @param reference The reference device to refer to when finding |
| * entity classes. |
| * @param macAddress The MAC address |
| * @param vlan the VLAN |
| * @param ipv4Address the ipv4 address |
| * @param switchDPID the switch DPID |
| * @param switchPort the switch port |
| * @return an iterator over a set of devices matching the query |
| * @see IDeviceService#queryClassDevices(Long, |
| * Short, Integer, Long, Integer) |
| */ |
| public Iterator<? extends IDevice> queryClassDevices(IDevice reference, |
| Long macAddress, |
| Short vlan, |
| Integer ipv4Address, |
| Long switchDPID, |
| Integer switchPort); |
| |
| /** |
| * Adds a listener to listen for IDeviceManagerServices notifications |
| * |
| * @param listener The listener that wants the notifications |
| */ |
| public void addListener(IDeviceListener listener); |
| |
| /** |
| * Specify points in the network where attachment points are not to |
| * be learned. |
| * @param sw |
| * @param port |
| */ |
| public void addSuppressAPs(long swId, short port); |
| |
| public void removeSuppressAPs(long swId, short port); |
| |
| } |