/**
* Copyright 2013, Big Switch Networks, Inc.
*
* 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.flowcache;
import net.floodlightcontroller.core.FloodlightContext;
import org.openflow.protocol.OFMatchWithSwDpid;
/**
* OFMatchReconcile class to indicate result of a flow-reconciliation.
*/
public class OFMatchReconcile {
/**
* The enum ReconcileAction. Specifies the result of reconciliation of a
* flow.
*/
public enum ReconcileAction {
/** Delete the flow-mod from the switch */
DROP,
/** Leave the flow-mod as-is. */
NO_CHANGE,
/** Program this new flow mod. */
NEW_ENTRY,
/**
* Reprogram the flow mod as the path of the flow might have changed,
* for example when a host is moved or when a link goes down. */
UPDATE_PATH,
/* Flow is now in a different BVS */
APP_INSTANCE_CHANGED,
/* Delete the flow-mod - used to delete, for example, drop flow-mods
* when the source and destination are in the same BVS after a
* configuration change */
DELETE
}
/** The open flow match after reconciliation. */
public OFMatchWithSwDpid ofmWithSwDpid;
/** flow mod. priority */
public short priority;
/** Action of this flow-mod PERMIT or DENY */
public byte action;
/** flow mod. cookie */
public long cookie;
/** The application instance name. */
public String appInstName;
/**
* The new application instance name. This is null unless the flow
* has moved to a different BVS due to BVS config change or device
* move to a different switch port etc.*/
public String newAppInstName;
/** The reconcile action. */
public ReconcileAction rcAction;
/** Outport in the event of UPDATE_PATH action**/
public short outPort;
// The context for the reconcile action
public FloodlightContext cntx;
// The original flow reconcile query event that triggered this flow
// to be reconciled
public FlowReconcileQuery origReconcileQueryEvent;
/**
* Instantiates a new oF match reconcile object.
*/
public OFMatchReconcile() {
ofmWithSwDpid = new OFMatchWithSwDpid();
rcAction = ReconcileAction.NO_CHANGE;
cntx = new FloodlightContext();
}
public OFMatchReconcile(OFMatchReconcile copy) {
ofmWithSwDpid =
new OFMatchWithSwDpid(copy.ofmWithSwDpid.getOfMatch(),
copy.ofmWithSwDpid.getSwitchDataPathId());
priority = copy.priority;
action = copy.action;
cookie = copy.cookie;
appInstName = copy.appInstName;
newAppInstName = copy.newAppInstName;
rcAction = copy.rcAction;
outPort = copy.outPort;
cntx = new FloodlightContext();
origReconcileQueryEvent = copy.origReconcileQueryEvent;
}
@Override
public String toString() {
return "OFMatchReconcile [" + ofmWithSwDpid + " priority=" + priority + " action=" + action +
" cookie=" + cookie + " appInstName=" + appInstName + " newAppInstName=" + newAppInstName +
" ReconcileAction=" + rcAction + "outPort=" + outPort + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + action;
result = prime * result
+ ((appInstName == null) ? 0 : appInstName.hashCode());
result = prime * result + (int) (cookie ^ (cookie >>> 32));
result = prime
* result
+ ((newAppInstName == null) ? 0 : newAppInstName.hashCode());
result = prime * result
+ ((ofmWithSwDpid == null) ? 0 : ofmWithSwDpid.hashCode());
result = prime * result + outPort;
result = prime * result + priority;
result = prime * result
+ ((rcAction == null) ? 0 : rcAction.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof OFMatchReconcile)) {
return false;
}
OFMatchReconcile other = (OFMatchReconcile) obj;
if (action != other.action) {
return false;
}
if (appInstName == null) {
if (other.appInstName != null) {
return false;
}
} else if (!appInstName.equals(other.appInstName)) {
return false;
}
if (cookie != other.cookie) {
return false;
}
if (newAppInstName == null) {
if (other.newAppInstName != null) {
return false;
}
} else if (!newAppInstName.equals(other.newAppInstName)) {
return false;
}
if (ofmWithSwDpid == null) {
if (other.ofmWithSwDpid != null) {
return false;
}
} else if (!ofmWithSwDpid.equals(other.ofmWithSwDpid)) {
return false;
}
if (outPort != other.outPort) {
return false;
}
if (priority != other.priority) {
return false;
}
if (rcAction != other.rcAction) {
return false;
}
return true;
}
}