blob: cedfdfd199e621fe802663a300a8e524bd922c81 [file] [log] [blame]
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001package net.onrc.onos.ofcontroller.flowmanager;
2
Nick Karanatsios758df8d2014-01-14 22:16:32 -08003import com.tinkerpop.blueprints.Direction;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07004import java.io.PrintWriter;
5import java.io.StringWriter;
6import java.util.ArrayList;
Pavlin Radoslavovf3f23bb2014-01-10 13:02:33 -08007import java.util.Collection;
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -08008import java.util.Map;
9
Pavlin Radoslavov16b761d2014-01-08 09:47:14 -080010import net.floodlightcontroller.core.IOFSwitch;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070011import net.floodlightcontroller.util.MACAddress;
yoshitomob292c622013-11-23 14:35:58 -080012import net.onrc.onos.graph.DBOperation;
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -080013import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IBaseObject;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070014import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
15import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
16import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
17import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
18import net.onrc.onos.ofcontroller.util.*;
19
20import org.slf4j.Logger;
21import org.slf4j.LoggerFactory;
22
Yuta HIGUCHIdad0a2d2014-01-06 15:52:52 -080023import com.tinkerpop.blueprints.impls.ramcloud.PerfMon;
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -080024import com.tinkerpop.blueprints.impls.ramcloud.RamCloudVertex;
Yuta HIGUCHIdad0a2d2014-01-06 15:52:52 -080025
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070026/**
27 * Class for performing Flow-related operations on the Database.
28 */
Pavlin Radoslavov6bfaea62013-12-03 14:55:57 -080029public class FlowDatabaseOperation {
Yuta HIGUCHI6ac8d182013-10-22 15:24:56 -070030 private final static Logger log = LoggerFactory.getLogger(FlowDatabaseOperation.class);
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -080031 private static final boolean measureONOSFlowTimeProp = Long.valueOf(System.getProperty("benchmark.measureONOSFlow", "0")) != 0;
32 private static final boolean measureONOSFlowEntryTimeProp = Long.valueOf(System.getProperty("benchmark.measureONOSFlowEntry", "0")) != 0;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070033
34 /**
Nick Karanatsios1e802382014-01-23 11:12:16 -080035 * Add a flow by batching all flow path properties and flow entries together.
36 * This is done for performance reasons.
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070037 *
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070038 * @param dbHandler the Graph Database handler to use.
39 * @param flowPath the Flow Path to install.
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -070040 * @return true on success, otherwise false.
41 */
Toshio Koidec71b7122014-01-13 15:16:53 -080042 static boolean addFlowFast(DBOperation dbHandler, FlowPath flowPath) {
Nick Karanatsios1e802382014-01-23 11:12:16 -080043 IFlowPath flowPathObj;
Toshio Koidec71b7122014-01-13 15:16:53 -080044 FlowPathProperty flowProp = new FlowPathProperty();
Nick Karanatsios758df8d2014-01-14 22:16:32 -080045 FlowEntity flowPathEntity = new FlowEntity();
46 boolean flowPathUpdate = false;
Toshio Koidec71b7122014-01-13 15:16:53 -080047
Nick Karanatsios1e802382014-01-23 11:12:16 -080048 flowPathObj = dbHandler.searchFlowPath(flowPath.flowId()); // getVertices("flow_id")
Toshio Koidec71b7122014-01-13 15:16:53 -080049 if (flowPathObj == null) {
50 try {
Nick Karanatsios758df8d2014-01-14 22:16:32 -080051 flowPathEntity.operationBegin(DBOperationType.ADD.toString());
Nick Karanatsios1e802382014-01-23 11:12:16 -080052 flowPathObj = dbHandler.newFlowPath();
Toshio Koidec71b7122014-01-13 15:16:53 -080053 } catch (Exception e) {
54 flowPathObj = null;
55 StringWriter sw = new StringWriter();
56 e.printStackTrace(new PrintWriter(sw));
57 log.error(":addFlow FlowId:{} failed: {}", flowPath.flowId(), sw.toString());
58 }
Nick Karanatsios758df8d2014-01-14 22:16:32 -080059 flowPathEntity.setProperty("user_state", "FP_USER_ADD");
Toshio Koidec71b7122014-01-13 15:16:53 -080060 flowProp.setFlowPathUserState("FP_USER_ADD");
61 } else {
Nick Karanatsios758df8d2014-01-14 22:16:32 -080062 flowPathUpdate = true;
Toshio Koidec71b7122014-01-13 15:16:53 -080063 // Remove the old Flow Entries (this is special for RAMCloud)
Nick Karanatsios1e802382014-01-23 11:12:16 -080064 for (IFlowEntry flowEntryObj : flowPathObj.getFlowEntries()) { // get.@Adjacency("flow", IN)
Nick Karanatsios758df8d2014-01-14 22:16:32 -080065 flowPathEntity.operationBegin(DBOperationType.REMOVE.toString());
Nick Karanatsios1e802382014-01-23 11:12:16 -080066 dbHandler.removeFlowEntry(flowEntryObj); // removeVertex()
Nick Karanatsios758df8d2014-01-14 22:16:32 -080067 flowPathEntity.operationEnd(DBOperationType.REMOVE.toString());
Toshio Koidec71b7122014-01-13 15:16:53 -080068 }
Nick Karanatsios758df8d2014-01-14 22:16:32 -080069 flowPathEntity.operationBegin(DBOperationType.UPDATE.toString());
70 flowPathEntity.setProperty("user_state", "FP_USER_ADD");
Toshio Koidec71b7122014-01-13 15:16:53 -080071 flowProp.setFlowPathUserState("FP_USER_MODIFY");
72 }
73 if (flowPathObj == null) {
74 log.error(":addFlow FlowId:{} failed: Flow object not created", flowPath.flowId());
75 dbHandler.rollback();
Toshio Koidec71b7122014-01-13 15:16:53 -080076 return false;
77 }
78
Nick Karanatsios758df8d2014-01-14 22:16:32 -080079 flowPathEntity.setProperty("flow_id", flowPath.flowId().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -080080 // Set the Flow key
81 flowProp.setFlowId(flowPath.flowId().toString());
82
83 // Set the Flow attributes
Nick Karanatsios758df8d2014-01-14 22:16:32 -080084 flowPathEntity.setProperty("installer_id", flowPath.installerId().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -080085 flowProp.setInstallerId(flowPath.installerId().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -080086
87 flowPathEntity.setProperty("flow_path_type", flowPath.flowPathType().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -080088 flowProp.setFlowPathType(flowPath.flowPathType().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -080089
90 flowPathEntity.setProperty("user_state", flowPath.flowPathUserState().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -080091 flowProp.setFlowPathUserState(flowPath.flowPathUserState().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -080092
93
94 flowPathEntity.setProperty("flow_path_flags", flowPath.flowPathFlags().flags());
Toshio Koidec71b7122014-01-13 15:16:53 -080095 flowProp.setFlowPathFlags(flowPath.flowPathFlags().flags());
Nick Karanatsios758df8d2014-01-14 22:16:32 -080096
97 flowPathEntity.setProperty("idle_timeout", flowPath.idleTimeout());
Toshio Koidec71b7122014-01-13 15:16:53 -080098 flowProp.setIdleTimeout(flowPath.idleTimeout());
Nick Karanatsios758df8d2014-01-14 22:16:32 -080099
100 flowPathEntity.setProperty("hard_timeout", flowPath.hardTimeout());
Toshio Koidec71b7122014-01-13 15:16:53 -0800101 flowProp.setHardTimeout(flowPath.hardTimeout());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800102
103 flowPathEntity.setProperty("src_switch", flowPath.dataPath().srcPort().dpid().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800104 flowProp.setSrcSwitch(flowPath.dataPath().srcPort().dpid().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800105
106 flowPathEntity.setProperty("src_port", flowPath.dataPath().srcPort().port().value());
Toshio Koidec71b7122014-01-13 15:16:53 -0800107 flowProp.setSrcPort(flowPath.dataPath().srcPort().port().value());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800108
109 flowPathEntity.setProperty("dst_switch", flowPath.dataPath().dstPort().dpid().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800110 flowProp.setDstSwitch(flowPath.dataPath().dstPort().dpid().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800111
112 flowPathEntity.setProperty("dst_port", flowPath.dataPath().dstPort().port().value());
Toshio Koidec71b7122014-01-13 15:16:53 -0800113 flowProp.setDstPort(flowPath.dataPath().dstPort().port().value());
114
115 if (flowPath.flowEntryMatch().matchSrcMac()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800116 flowPathEntity.setProperty("matchSrcMac",flowPath.flowEntryMatch().srcMac().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800117 flowProp.setMatchSrcMac(flowPath.flowEntryMatch().srcMac().toString());
118 }
119 if (flowPath.flowEntryMatch().matchDstMac()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800120 flowPathEntity.setProperty("matchDstMac", flowPath.flowEntryMatch().dstMac().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800121 flowProp.setMatchDstMac(flowPath.flowEntryMatch().dstMac().toString());
122 }
123 if (flowPath.flowEntryMatch().matchEthernetFrameType()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800124 flowPathEntity.setProperty("matchEthernetFrameType", flowPath.flowEntryMatch().ethernetFrameType());
Toshio Koidec71b7122014-01-13 15:16:53 -0800125 flowProp.setMatchEthernetFrameType(flowPath.flowEntryMatch().ethernetFrameType());
126 }
127 if (flowPath.flowEntryMatch().matchVlanId()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800128 flowPathEntity.setProperty("matchVlanId", flowPath.flowEntryMatch().vlanId());
Toshio Koidec71b7122014-01-13 15:16:53 -0800129 flowProp.setMatchVlanId(flowPath.flowEntryMatch().vlanId());
130 }
131 if (flowPath.flowEntryMatch().matchVlanPriority()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800132 flowPathEntity.setProperty("matchVlanPriority", flowPath.flowEntryMatch().vlanPriority());
Toshio Koidec71b7122014-01-13 15:16:53 -0800133 flowProp.setMatchVlanPriority(flowPath.flowEntryMatch().vlanPriority());
134 }
135 if (flowPath.flowEntryMatch().matchSrcIPv4Net()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800136 flowPathEntity.setProperty("matchSrcIPv4Net", flowPath.flowEntryMatch().srcIPv4Net().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800137 flowProp.setMatchSrcIPv4Net(flowPath.flowEntryMatch().srcIPv4Net().toString());
138 }
139 if (flowPath.flowEntryMatch().matchDstIPv4Net()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800140 flowPathEntity.setProperty("matchDstIPv4Net", flowPath.flowEntryMatch().dstIPv4Net().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800141 flowProp.setMatchDstIPv4Net(flowPath.flowEntryMatch().dstIPv4Net().toString());
142 }
143 if (flowPath.flowEntryMatch().matchIpProto()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800144 flowPathEntity.setProperty("matchIpProto", flowPath.flowEntryMatch().ipProto());
Toshio Koidec71b7122014-01-13 15:16:53 -0800145 flowProp.setMatchIpProto(flowPath.flowEntryMatch().ipProto());
146 }
147 if (flowPath.flowEntryMatch().matchIpToS()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800148 flowPathEntity.setProperty("matchIpToS", flowPath.flowEntryMatch().ipToS());
Toshio Koidec71b7122014-01-13 15:16:53 -0800149 flowProp.setMatchIpToS(flowPath.flowEntryMatch().ipToS());
150 }
151 if (flowPath.flowEntryMatch().matchSrcTcpUdpPort()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800152 flowPathEntity.setProperty("matchSrcTcpUdpPort", flowPath.flowEntryMatch().srcTcpUdpPort());
Toshio Koidec71b7122014-01-13 15:16:53 -0800153 flowProp.setMatchSrcTcpUdpPort(flowPath.flowEntryMatch().srcTcpUdpPort());
154 }
155 if (flowPath.flowEntryMatch().matchDstTcpUdpPort()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800156 flowPathEntity.setProperty("matchDstTcpUdpPort", flowPath.flowEntryMatch().dstTcpUdpPort());
Toshio Koidec71b7122014-01-13 15:16:53 -0800157 flowProp.setMatchDstTcpUdpPort(flowPath.flowEntryMatch().dstTcpUdpPort());
158 }
159 if (! flowPath.flowEntryActions().actions().isEmpty()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800160 flowPathEntity.setProperty("actions", flowPath.flowEntryActions().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800161 flowProp.setActions(flowPath.flowEntryActions().toString());
162 }
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800163 flowPathEntity.setProperty("data_path_summary", flowPath.dataPath().dataPathSummary());
Toshio Koidec71b7122014-01-13 15:16:53 -0800164 flowProp.setDataPathSummary(flowPath.dataPath().dataPathSummary());
165
Nick Karanatsios1e802382014-01-23 11:12:16 -0800166 flowProp.commitProperties(dbHandler, flowPathObj);
Toshio Koidec71b7122014-01-13 15:16:53 -0800167
168 //
169 // Flow Entries:
170 // flowPath.dataPath().flowEntries()
171 //
172 for (FlowEntry flowEntry : flowPath.dataPath().flowEntries()) {
173 if (flowEntry.flowEntryUserState() == FlowEntryUserState.FE_USER_DELETE)
174 continue; // Skip: all Flow Entries were deleted earlier
175
Nick Karanatsios1e802382014-01-23 11:12:16 -0800176 IFlowEntry iFlowEntry;
Toshio Koidec71b7122014-01-13 15:16:53 -0800177 FlowEntryProperty flowEntryProp = new FlowEntryProperty();
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800178 FlowEntity flowEntryEntity = new FlowEntity();
179 boolean updateFlowEntry = false;
Toshio Koidec71b7122014-01-13 15:16:53 -0800180
181 try {
Nick Karanatsios1e802382014-01-23 11:12:16 -0800182 iFlowEntry = dbHandler.searchFlowEntry(flowEntry.flowEntryId()); // getVertices()
Toshio Koidec71b7122014-01-13 15:16:53 -0800183 if (iFlowEntry != null) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800184 updateFlowEntry = true;
185 flowEntryEntity.operationBegin(DBOperationType.UPDATE.toString());
186 flowEntryEntity.setProperty("user_state", "FE_USER_MODIFY");
Toshio Koidec71b7122014-01-13 15:16:53 -0800187 flowEntryProp.setUserState("FE_USER_MODIFY");
188 } else {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800189 flowEntryEntity.operationBegin(DBOperationType.ADD.toString());
190 flowEntryEntity.setProperty("user_state", "FE_USER_ADD");
Toshio Koidec71b7122014-01-13 15:16:53 -0800191 flowEntryProp.setUserState("FE_USER_ADD");
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800192 flowEntryEntity.addEdge(flowPathObj, Direction.OUT, "flow");
Toshio Koidec71b7122014-01-13 15:16:53 -0800193 }
194 } catch (Exception e) {
Nick Karanatsios1e802382014-01-23 11:12:16 -0800195 // TODO do we really need to catch this exception.
Toshio Koidec71b7122014-01-13 15:16:53 -0800196 }
Toshio Koidec71b7122014-01-13 15:16:53 -0800197
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800198 flowEntryEntity.setProperty("flow_id", flowEntry.flowEntryId().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800199 // Set the Flow Entry key
Nick Karanatsios1e802382014-01-23 11:12:16 -0800200 flowEntryEntity.setProperty("flow_entry_id", flowEntry.flowEntryId().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800201
202 flowEntryEntity.setProperty("type", "flow_entry");
Toshio Koidec71b7122014-01-13 15:16:53 -0800203
204 // Set the Flow Entry Edges
205 ISwitchObject sw = dbHandler.searchSwitch(flowEntry.dpid().toString()); // toshi memo: getVertices()
206
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800207 flowEntryEntity.setProperty("idle_timeout", flowEntry.idleTimeout());
Toshio Koidec71b7122014-01-13 15:16:53 -0800208
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800209 flowEntryEntity.setProperty("hard_timeout", flowEntry.hardTimeout());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800210
211 flowEntryEntity.setProperty("switch_dpid", flowEntry.dpid().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800212
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800213 flowEntryEntity.addEdge(sw, Direction.OUT, "switch");
Toshio Koidec71b7122014-01-13 15:16:53 -0800214 if (flowEntry.flowEntryMatch().matchInPort()) {
215 IPortObject inport = dbHandler.searchPort(flowEntry.dpid().toString(), flowEntry.flowEntryMatch().inPort().value()); // toshi memo: getVertices()
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800216
217 flowEntryEntity.setProperty("matchInPort", flowEntry.flowEntryMatch().inPort().value());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800218 flowEntryEntity.addEdge(inport, Direction.OUT, "inport");
Toshio Koidec71b7122014-01-13 15:16:53 -0800219 }
220
221 // Set the Flow Entry attributes
222 if (flowEntry.flowEntryMatch().matchSrcMac()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800223 flowEntryEntity.setProperty("matchSrcMac", flowEntry.flowEntryMatch().srcMac().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800224 }
225 if (flowEntry.flowEntryMatch().matchDstMac()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800226 flowEntryEntity.setProperty("matchDstMac", flowEntry.flowEntryMatch().dstMac().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800227 }
228 if (flowEntry.flowEntryMatch().matchEthernetFrameType()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800229 flowEntryEntity.setProperty("matchEthernetFrameType", flowEntry.flowEntryMatch().ethernetFrameType());
Toshio Koidec71b7122014-01-13 15:16:53 -0800230 }
231 if (flowEntry.flowEntryMatch().matchVlanId()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800232 flowEntryEntity.setProperty("matchVlanId", flowEntry.flowEntryMatch().vlanId());
Toshio Koidec71b7122014-01-13 15:16:53 -0800233 }
234 if (flowEntry.flowEntryMatch().matchVlanPriority()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800235 flowEntryEntity.setProperty("matchVlanPriority", flowEntry.flowEntryMatch().vlanPriority());
Toshio Koidec71b7122014-01-13 15:16:53 -0800236 }
237 if (flowEntry.flowEntryMatch().matchSrcIPv4Net()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800238 flowEntryEntity.setProperty("matchSrcIPv4Net", flowEntry.flowEntryMatch().srcIPv4Net().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800239 }
240 if (flowEntry.flowEntryMatch().matchDstIPv4Net()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800241 flowEntryEntity.setProperty("matchDstIPv4Net", flowEntry.flowEntryMatch().dstIPv4Net().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800242 }
243 if (flowEntry.flowEntryMatch().matchIpProto()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800244 flowEntryEntity.setProperty("matchIpProto", flowEntry.flowEntryMatch().ipProto());
Toshio Koidec71b7122014-01-13 15:16:53 -0800245 }
246 if (flowEntry.flowEntryMatch().matchIpToS()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800247 flowEntryEntity.setProperty("matchIpToS", flowEntry.flowEntryMatch().ipToS());
Toshio Koidec71b7122014-01-13 15:16:53 -0800248 }
249 if (flowEntry.flowEntryMatch().matchSrcTcpUdpPort()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800250 flowEntryEntity.setProperty("matchSrcTcpUdpPort", flowEntry.flowEntryMatch().srcTcpUdpPort());
Toshio Koidec71b7122014-01-13 15:16:53 -0800251 }
252 if (flowEntry.flowEntryMatch().matchDstTcpUdpPort()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800253 flowEntryEntity.setProperty("matchDstTcpUdpPort", flowEntry.flowEntryMatch().dstTcpUdpPort());
Toshio Koidec71b7122014-01-13 15:16:53 -0800254 }
255
256 for (FlowEntryAction fa : flowEntry.flowEntryActions().actions()) {
257 if (fa.actionOutput() != null) {
258 IPortObject outport = dbHandler.searchPort(flowEntry.dpid().toString(), fa.actionOutput().port().value()); // toshi memo: getVertices()
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800259 flowEntryEntity.setProperty("actionOutputPort", fa.actionOutput().port().value());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800260 flowEntryEntity.addEdge(outport, Direction.OUT, "outport");
Toshio Koidec71b7122014-01-13 15:16:53 -0800261 }
262 }
263 if (! flowEntry.flowEntryActions().isEmpty()) {
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800264 flowEntryEntity.setProperty("actions", flowEntry.flowEntryActions().toString());
Toshio Koidec71b7122014-01-13 15:16:53 -0800265 }
266
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800267 flowEntryEntity.setProperty("switch_state", flowEntry.flowEntrySwitchState().toString());
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800268 if (updateFlowEntry) {
269 flowEntryEntity.operationEnd(DBOperationType.UPDATE.toString());
270 } else {
271 flowEntryEntity.operationEnd(DBOperationType.ADD.toString());
272 }
273 flowPathEntity.append(flowEntryEntity);
Toshio Koidec71b7122014-01-13 15:16:53 -0800274 }
275
Nick Karanatsios758df8d2014-01-14 22:16:32 -0800276 if (flowPathUpdate) {
277 flowPathEntity.operationEnd(DBOperationType.UPDATE.toString());
278 } else {
279 flowPathEntity.operationEnd(DBOperationType.ADD.toString());
280 }
281 flowPathEntity.persist(dbHandler);
Toshio Koidec71b7122014-01-13 15:16:53 -0800282 return true;
283 }
284
285 /**
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700286 * Add a flow.
287 *
288 * @param dbHandler the Graph Database handler to use.
289 * @param flowPath the Flow Path to install.
290 * @return true on success, otherwise false.
291 */
onlab-qa38805cd2013-12-06 20:08:54 -0800292 static boolean addFlow(DBOperation dbHandler, FlowPath flowPath) {
Nick Karanatsios1e802382014-01-23 11:12:16 -0800293 PerfMon pm = PerfMon.getInstance();
294 pm.addflowpath_start();
295 boolean retValue = addFlowFast(dbHandler, flowPath);
296 pm.addflowpath_end();
297 return retValue;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700298 }
299
300 /**
301 * Add a flow entry to the Network MAP.
302 *
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700303 * @param dbHandler the Graph Database handler to use.
304 * @param flowObj the corresponding Flow Path object for the Flow Entry.
305 * @param flowEntry the Flow Entry to install.
306 * @return the added Flow Entry object on success, otherwise null.
307 */
onlab-qa38805cd2013-12-06 20:08:54 -0800308 static IFlowEntry addFlowEntry(DBOperation dbHandler,
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700309 IFlowPath flowObj,
310 FlowEntry flowEntry) {
311 // Flow edges
312 // HeadFE (TODO)
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800313 long startAddFlowEntry = 0;
314 long endAddFlowEntry = 0;
315
316 long endSearchFlowEntry = 0;
317
318 long startCreateNewFlowEntry = 0;
319 long endCreateNewFlowEntry = 0;
320
321 long startSetProperties = 0;
322 long endSetProperties = 0;
323 int numProperties = 0;
324
325 long startSearchSwitch = 0;
326 long endSearchSwitch = 0;
327
328 long startAddEdgeToSwitch =0;
329 long endAddEdgeToSwitch =0;
330
331 long startSearchInPort = 0;
332 long endSearchInPort = 0;
333
334 long startAddEdgeToInPort =0;
335 long endAddEdgeToInPort =0;
336
337 long startSearchOutPort = 0;
338 long endSearchOutPort = 0;
339
340 long startAddEdgeToOutPort =0;
341 long endAddEdgeToOutPort =0;
342
343 long startAddEdgeBetweenFlowPath = 0;
344 long endAddEdgeBetweenFlowPath = 0;
345
346 if (measureONOSFlowEntryTimeProp) {
347 startAddFlowEntry = System.nanoTime();
348 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700349
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700350 IFlowEntry flowEntryObj = null;
351 boolean found = false;
352 try {
Yuta HIGUCHIc27a6c92014-01-07 11:51:11 -0800353 flowEntryObj = dbHandler.searchFlowEntry(flowEntry.flowEntryId());
354 if (measureONOSFlowEntryTimeProp) {
355 endSearchFlowEntry = System.nanoTime();
356 }
357 if (flowEntryObj != null) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700358 found = true;
359 } else {
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800360 if (measureONOSFlowEntryTimeProp) {
361 startCreateNewFlowEntry = System.nanoTime();
362 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700363 flowEntryObj = dbHandler.newFlowEntry();
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800364 if (measureONOSFlowEntryTimeProp) {
365 endCreateNewFlowEntry = System.nanoTime();
366 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700367 }
368 } catch (Exception e) {
369 log.error(":addFlow FlowEntryId:{} failed",
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800370 flowEntry.flowEntryId());
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700371 return null;
372 }
373 if (flowEntryObj == null) {
374 log.error(":addFlow FlowEntryId:{} failed: FlowEntry object not created",
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800375 flowEntry.flowEntryId());
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700376 return null;
377 }
378
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800379 if (measureONOSFlowEntryTimeProp) {
380 startSetProperties = System.nanoTime();
381 }
Yuta HIGUCHI8685f9c2014-01-07 15:53:28 -0800382
Toshio Koidec71b7122014-01-13 15:16:53 -0800383 FlowEntryProperty flowProp = new FlowEntryProperty();
Yuta HIGUCHI8685f9c2014-01-07 15:53:28 -0800384
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700385 //
386 // Set the Flow Entry key:
387 // - flowEntry.flowEntryId()
388 //
Toshio Koide3f233542014-01-07 14:19:09 -0800389 flowProp.setFlowEntryId(flowEntry.flowEntryId().toString());
390 flowProp.setType("flow_entry");
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800391 if (measureONOSFlowEntryTimeProp) {
392 numProperties += 2;
393 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700394
Yuta HIGUCHI37c55472014-01-03 11:42:27 -0800395 //
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700396 // Set the Flow Entry Edges and attributes:
397 // - Switch edge
398 // - InPort edge
399 // - OutPort edge
400 //
Pavlin Radoslavov5139c0b2013-12-09 18:04:53 -0800401 // - flowEntry.idleTimeout()
402 // - flowEntry.hardTimeout()
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700403 // - flowEntry.dpid()
404 // - flowEntry.flowEntryUserState()
405 // - flowEntry.flowEntrySwitchState()
406 // - flowEntry.flowEntryErrorState()
407 // - flowEntry.matchInPort()
408 // - flowEntry.matchSrcMac()
409 // - flowEntry.matchDstMac()
410 // - flowEntry.matchEthernetFrameType()
411 // - flowEntry.matchVlanId()
412 // - flowEntry.matchVlanPriority()
413 // - flowEntry.matchSrcIPv4Net()
414 // - flowEntry.matchDstIPv4Net()
415 // - flowEntry.matchIpProto()
416 // - flowEntry.matchIpToS()
417 // - flowEntry.matchSrcTcpUdpPort()
418 // - flowEntry.matchDstTcpUdpPort()
419 // - flowEntry.actionOutputPort()
420 // - flowEntry.actions()
421 //
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800422 if (measureONOSFlowEntryTimeProp) {
423 startSearchSwitch = System.nanoTime();
424 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700425 ISwitchObject sw = dbHandler.searchSwitch(flowEntry.dpid().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800426 if (measureONOSFlowEntryTimeProp) {
427 endSearchSwitch = System.nanoTime();
428 }
429
Toshio Koide3f233542014-01-07 14:19:09 -0800430 flowProp.setIdleTimeout(flowEntry.idleTimeout());
431 flowProp.setHardTimeout(flowEntry.hardTimeout());
432 flowProp.setSwitchDpid(flowEntry.dpid().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800433 if (measureONOSFlowEntryTimeProp) {
434 numProperties += 3;
435 }
436
437 if (measureONOSFlowEntryTimeProp) {
438 startAddEdgeToSwitch = System.nanoTime();
439 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700440 flowEntryObj.setSwitch(sw);
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800441 if (measureONOSFlowEntryTimeProp) {
442 endAddEdgeToSwitch = System.nanoTime();
443 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700444 if (flowEntry.flowEntryMatch().matchInPort()) {
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800445 if (measureONOSFlowEntryTimeProp) {
446 startSearchInPort = System.nanoTime();
447 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700448 IPortObject inport =
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800449 dbHandler.searchPort(flowEntry.dpid().toString(),
450 flowEntry.flowEntryMatch().inPort().value());
451 if (measureONOSFlowEntryTimeProp) {
452 endSearchInPort = System.nanoTime();
453 }
454
Toshio Koide3f233542014-01-07 14:19:09 -0800455 flowProp.setMatchInPort(flowEntry.flowEntryMatch().inPort().value());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800456 if (measureONOSFlowEntryTimeProp) {
457 ++numProperties;
458 }
459
460 if (measureONOSFlowEntryTimeProp) {
461 startAddEdgeToInPort = System.nanoTime();
462 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700463 flowEntryObj.setInPort(inport);
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800464 if (measureONOSFlowEntryTimeProp) {
465 endAddEdgeToInPort = System.nanoTime();
466 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700467 }
468 if (flowEntry.flowEntryMatch().matchSrcMac()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800469 flowProp.setMatchSrcMac(flowEntry.flowEntryMatch().srcMac().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800470 if (measureONOSFlowEntryTimeProp) {
471 ++numProperties;
472 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700473 }
474 if (flowEntry.flowEntryMatch().matchDstMac()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800475 flowProp.setMatchDstMac(flowEntry.flowEntryMatch().dstMac().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800476 if (measureONOSFlowEntryTimeProp) {
477 ++numProperties;
478 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700479 }
480 if (flowEntry.flowEntryMatch().matchEthernetFrameType()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800481 flowProp.setMatchEthernetFrameType(flowEntry.flowEntryMatch().ethernetFrameType());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800482 if (measureONOSFlowEntryTimeProp) {
483 ++numProperties;
484 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700485 }
486 if (flowEntry.flowEntryMatch().matchVlanId()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800487 flowProp.setMatchVlanId(flowEntry.flowEntryMatch().vlanId());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800488 if (measureONOSFlowEntryTimeProp) {
489 ++numProperties;
490 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700491 }
492 if (flowEntry.flowEntryMatch().matchVlanPriority()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800493 flowProp.setMatchVlanPriority(flowEntry.flowEntryMatch().vlanPriority());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800494 if (measureONOSFlowEntryTimeProp) {
495 ++numProperties;
496 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700497 }
498 if (flowEntry.flowEntryMatch().matchSrcIPv4Net()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800499 flowProp.setMatchSrcIPv4Net(flowEntry.flowEntryMatch().srcIPv4Net().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800500 if (measureONOSFlowEntryTimeProp) {
501 ++numProperties;
502 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700503 }
504 if (flowEntry.flowEntryMatch().matchDstIPv4Net()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800505 flowProp.setMatchDstIPv4Net(flowEntry.flowEntryMatch().dstIPv4Net().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800506 if (measureONOSFlowEntryTimeProp) {
507 ++numProperties;
508 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700509 }
510 if (flowEntry.flowEntryMatch().matchIpProto()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800511 flowProp.setMatchIpProto(flowEntry.flowEntryMatch().ipProto());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800512 if (measureONOSFlowEntryTimeProp) {
513 ++numProperties;
514 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700515 }
516 if (flowEntry.flowEntryMatch().matchIpToS()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800517 flowProp.setMatchIpToS(flowEntry.flowEntryMatch().ipToS());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800518 if (measureONOSFlowEntryTimeProp) {
519 ++numProperties;
520 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700521 }
522 if (flowEntry.flowEntryMatch().matchSrcTcpUdpPort()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800523 flowProp.setMatchSrcTcpUdpPort(flowEntry.flowEntryMatch().srcTcpUdpPort());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800524 if (measureONOSFlowEntryTimeProp) {
525 ++numProperties;
526 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700527 }
528 if (flowEntry.flowEntryMatch().matchDstTcpUdpPort()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800529 flowProp.setMatchDstTcpUdpPort(flowEntry.flowEntryMatch().dstTcpUdpPort());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800530 if (measureONOSFlowEntryTimeProp) {
531 ++numProperties;
532 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700533 }
534
535 for (FlowEntryAction fa : flowEntry.flowEntryActions().actions()) {
536 if (fa.actionOutput() != null) {
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800537 if (measureONOSFlowEntryTimeProp) {
538 if ( startSearchOutPort != 0 ) log.error("Performance addFlowEntry(_,{},{}) -- Multiple output port action unexpected.", flowEntry.flowId(), flowEntry.flowEntryId());
539 startSearchOutPort = System.nanoTime();
540 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700541 IPortObject outport =
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800542 dbHandler.searchPort(flowEntry.dpid().toString(),
543 fa.actionOutput().port().value());
544 if (measureONOSFlowEntryTimeProp) {
545 endSearchOutPort = System.nanoTime();
546 }
547
Toshio Koide3f233542014-01-07 14:19:09 -0800548 flowProp.setActionOutputPort(fa.actionOutput().port().value());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800549 if (measureONOSFlowEntryTimeProp) {
550 ++numProperties;
551 }
552
553 if (measureONOSFlowEntryTimeProp) {
554 startAddEdgeToOutPort = System.nanoTime();
555 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700556 flowEntryObj.setOutPort(outport);
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800557 if (measureONOSFlowEntryTimeProp) {
558 endAddEdgeToOutPort = System.nanoTime();
559 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700560 }
561 }
562 if (! flowEntry.flowEntryActions().isEmpty()) {
Toshio Koide3f233542014-01-07 14:19:09 -0800563 flowProp.setActions(flowEntry.flowEntryActions().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800564 if (measureONOSFlowEntryTimeProp) {
565 ++numProperties;
566 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700567 }
568
Yuta HIGUCHI337e46d2014-01-10 22:49:27 -0800569 flowProp.setUserState(flowEntry.flowEntryUserState().toString());
Toshio Koide3f233542014-01-07 14:19:09 -0800570 flowProp.setSwitchState(flowEntry.flowEntrySwitchState().toString());
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800571 if (measureONOSFlowEntryTimeProp) {
572 numProperties += 2;
573 }
Toshio Koidec71b7122014-01-13 15:16:53 -0800574 flowProp.commitProperties(dbHandler, flowEntryObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700575 //
576 // TODO: Take care of the FlowEntryErrorState.
577 //
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800578 if (measureONOSFlowEntryTimeProp) {
579 endSetProperties = System.nanoTime();
580 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700581
582 // Flow Entries edges:
583 // Flow
584 // NextFE (TODO)
585 if (! found) {
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800586 if (measureONOSFlowEntryTimeProp) {
587 startAddEdgeBetweenFlowPath = System.nanoTime();
588 }
Toshio Koidec71b7122014-01-13 15:16:53 -0800589 //flowObj.addFlowEntry(flowEntryObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700590 flowEntryObj.setFlow(flowObj);
Yuta HIGUCHIf9ce1c12014-01-04 23:21:58 -0800591 if (measureONOSFlowEntryTimeProp) {
592 endAddEdgeBetweenFlowPath = System.nanoTime();
593 }
594 }
595 if (measureONOSFlowEntryTimeProp) {
596 endAddFlowEntry = System.nanoTime();
597
598 log.error("Performance addFlowEntry(_,{},{}) -- "
599 + "GrandTotal: {} "
600 + "SearchExistingFE: {} "
601 + "CreateNewFE: {} "
602 + "SetProp+Edge: {} #Props: {} "
603 + "SearchSwitch: {} "
604 + "AddEdgeToSwitch: {} "
605 + "SearchInPort: {} "
606 + "AddEdgeToInPort: {} "
607 + "SearchOutPort: {} "
608 + "AddEdgeToOutPort: {} "
609 + "AddEdgeBetweenFlowPath: {} "
610 , flowEntry.flowId(), flowEntry.flowEntryId()
611 , endAddFlowEntry - startAddFlowEntry
612 , endSearchFlowEntry - startAddFlowEntry
613 , endCreateNewFlowEntry - startCreateNewFlowEntry
614 , endSetProperties - startSetProperties, numProperties
615 , endSearchSwitch - startSearchSwitch
616 , endAddEdgeToSwitch - startAddEdgeToSwitch
617 , endSearchInPort - startSearchInPort
618 , endAddEdgeToInPort - startAddEdgeToInPort
619 , endSearchOutPort - startSearchOutPort
620 , endAddEdgeToOutPort - startAddEdgeToOutPort
621 , endAddEdgeBetweenFlowPath - startAddEdgeBetweenFlowPath
622 );
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700623 }
624
625 return flowEntryObj;
626 }
627
628 /**
Pavlin Radoslavov7407ab52013-11-01 22:19:00 -0700629 * Delete a flow entry from the Network MAP.
630 *
631 * @param dbHandler the Graph Database handler to use.
632 * @param flowObj the corresponding Flow Path object for the Flow Entry.
633 * @param flowEntry the Flow Entry to delete.
634 * @return true on success, otherwise false.
635 */
yoshitomob292c622013-11-23 14:35:58 -0800636 static boolean deleteFlowEntry(DBOperation dbHandler,
Pavlin Radoslavov7407ab52013-11-01 22:19:00 -0700637 IFlowPath flowObj,
638 FlowEntry flowEntry) {
639 IFlowEntry flowEntryObj = null;
640 try {
641 flowEntryObj = dbHandler.searchFlowEntry(flowEntry.flowEntryId());
642 } catch (Exception e) {
643 log.error(":deleteFlowEntry FlowEntryId:{} failed",
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800644 flowEntry.flowEntryId());
Pavlin Radoslavov7407ab52013-11-01 22:19:00 -0700645 return false;
646 }
647 //
648 // TODO: Don't print an error for now, because multiple controller
649 // instances might be deleting the same flow entry.
650 //
651 /*
652 if (flowEntryObj == null) {
653 log.error(":deleteFlowEntry FlowEntryId:{} failed: FlowEntry object not found",
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800654 flowEntry.flowEntryId());
Pavlin Radoslavov7407ab52013-11-01 22:19:00 -0700655 return false;
656 }
657 */
658 if (flowEntryObj == null)
659 return true;
660
661 flowObj.removeFlowEntry(flowEntryObj);
662 dbHandler.removeFlowEntry(flowEntryObj);
663 return true;
664 }
665
666 /**
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700667 * Delete all previously added flows.
668 *
669 * @param dbHandler the Graph Database handler to use.
670 * @return true on success, otherwise false.
671 */
yoshitomob292c622013-11-23 14:35:58 -0800672 static boolean deleteAllFlows(DBOperation dbHandler) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700673 Iterable<IFlowPath> allFlowPaths = dbHandler.getAllFlowPaths();
674 for (IFlowPath flowPathObj : allFlowPaths) {
675 if (flowPathObj == null)
676 continue;
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700677
Yuta HIGUCHI53794052014-01-10 16:49:41 -0800678 deleteIFlowPath(dbHandler, flowPathObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700679 }
Yuta HIGUCHI0cc22372014-01-13 14:54:00 -0800680 dbHandler.commit();
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700681
682 return true;
683 }
684
685 /**
Pavlin Radoslavovf2a52652013-11-22 12:35:42 -0800686 * Delete a previously added flow.
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700687 *
688 * @param dbHandler the Graph Database handler to use.
Pavlin Radoslavovf2a52652013-11-22 12:35:42 -0800689 * @param flowId the Flow ID of the flow to delete.
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700690 * @return true on success, otherwise false.
691 */
yoshitomob292c622013-11-23 14:35:58 -0800692 static boolean deleteFlow(DBOperation dbHandler, FlowId flowId) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700693 IFlowPath flowObj = null;
694 try {
695 flowObj = dbHandler.searchFlowPath(flowId);
696 } catch (Exception e) {
697 // TODO: handle exceptions
698 dbHandler.rollback();
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800699 log.error(":deleteFlow FlowId:{} failed", flowId);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700700 return false;
701 }
702 if (flowObj == null) {
703 dbHandler.commit();
704 return true; // OK: No such flow
705 }
706
Yuta HIGUCHI53794052014-01-10 16:49:41 -0800707 deleteIFlowPath(dbHandler, flowObj);
Yuta HIGUCHI0cc22372014-01-13 14:54:00 -0800708 dbHandler.commit();
Yuta HIGUCHI53794052014-01-10 16:49:41 -0800709 return true;
710 }
711
Yuta HIGUCHIeab1c8b2014-01-15 19:13:28 -0800712 /**
713 * Delete a previously added flow.
714 * @note You need to call commit after calling this method.
715 * @param dbHandler the Graph Database handler to use.
716 * @param flowObj IFlowPath object to delete.
717 */
Yuta HIGUCHI53794052014-01-10 16:49:41 -0800718 private static void deleteIFlowPath(DBOperation dbHandler, IFlowPath flowObj) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700719 //
720 // Remove all Flow Entries
721 //
722 Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
723 for (IFlowEntry flowEntryObj : flowEntries) {
724 flowObj.removeFlowEntry(flowEntryObj);
725 dbHandler.removeFlowEntry(flowEntryObj);
726 }
727 // Remove the Flow itself
728 dbHandler.removeFlowPath(flowObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700729 }
730
731 /**
732 * Get a previously added flow.
733 *
734 * @param dbHandler the Graph Database handler to use.
735 * @param flowId the Flow ID of the flow to get.
736 * @return the Flow Path if found, otherwise null.
737 */
yoshitomob292c622013-11-23 14:35:58 -0800738 static FlowPath getFlow(DBOperation dbHandler, FlowId flowId) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700739 IFlowPath flowObj = null;
740 try {
741 flowObj = dbHandler.searchFlowPath(flowId);
742 } catch (Exception e) {
743 // TODO: handle exceptions
744 dbHandler.rollback();
Yuta HIGUCHI5302ddf2014-01-06 12:53:35 -0800745 log.error(":getFlow FlowId:{} failed", flowId);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700746 return null;
747 }
748 if (flowObj == null) {
749 dbHandler.commit();
750 return null; // Flow not found
751 }
752
753 //
754 // Extract the Flow state
755 //
756 FlowPath flowPath = extractFlowPath(flowObj);
757 dbHandler.commit();
758
759 return flowPath;
760 }
761
762 /**
Pavlin Radoslavov52119fa2014-01-09 13:37:52 -0800763 * Get a previously added flow entry.
764 *
765 * @param dbHandler the Graph Database handler to use.
766 * @param flowEntryId the Flow Entry ID of the flow entry to get.
767 * @return the Flow Entry if found, otherwise null.
768 */
Yuta HIGUCHI337e46d2014-01-10 22:49:27 -0800769 static FlowEntry getFlowEntry(DBOperation dbHandler,
Pavlin Radoslavov52119fa2014-01-09 13:37:52 -0800770 FlowEntryId flowEntryId) {
771 IFlowEntry flowEntryObj = null;
772 try {
773 flowEntryObj = dbHandler.searchFlowEntry(flowEntryId);
774 } catch (Exception e) {
775 // TODO: handle exceptions
776 dbHandler.rollback();
777 log.error(":getFlowEntry FlowEntryId:{} failed", flowEntryId);
778 return null;
779 }
780 if (flowEntryObj == null) {
781 dbHandler.commit();
782 return null; // Flow not found
783 }
784
785 //
786 // Extract the Flow Entry state
787 //
788 FlowEntry flowEntry = extractFlowEntry(flowEntryObj);
789 dbHandler.commit();
790
791 return flowEntry;
792 }
793
794 /**
Pavlin Radoslavov8252fee2014-01-07 17:24:29 -0800795 * Get the source switch DPID of a previously added flow.
796 *
797 * @param dbHandler the Graph Database handler to use.
798 * @param flowId the Flow ID of the flow to get.
799 * @return the source switch DPID if found, otherwise null.
800 */
Yuta HIGUCHI337e46d2014-01-10 22:49:27 -0800801 static Dpid getFlowSourceDpid(DBOperation dbHandler, FlowId flowId) {
Pavlin Radoslavov8252fee2014-01-07 17:24:29 -0800802 IFlowPath flowObj = null;
803 try {
804 flowObj = dbHandler.searchFlowPath(flowId);
805 } catch (Exception e) {
806 // TODO: handle exceptions
807 dbHandler.rollback();
808 log.error(":getFlowSourceDpid FlowId:{} failed", flowId);
809 return null;
810 }
811 if (flowObj == null) {
812 dbHandler.commit();
813 return null; // Flow not found
814 }
815
816 //
817 // Extract the Flow Source DPID
818 //
819 String srcSwitchStr = flowObj.getSrcSwitch();
820 if (srcSwitchStr == null) {
821 // TODO: A work-around, becauuse of some bogus database objects
822 dbHandler.commit();
823 return null;
824 }
825
826 Dpid dpid = new Dpid(srcSwitchStr);
827
828 dbHandler.commit();
829
830 return dpid;
831 }
832
833 /**
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700834 * Get all installed flows by all installers.
835 *
836 * @param dbHandler the Graph Database handler to use.
837 * @return the Flow Paths if found, otherwise null.
838 */
yoshitomob292c622013-11-23 14:35:58 -0800839 static ArrayList<FlowPath> getAllFlows(DBOperation dbHandler) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700840 Iterable<IFlowPath> flowPathsObj = null;
841 ArrayList<FlowPath> flowPaths = new ArrayList<FlowPath>();
842
843 try {
844 flowPathsObj = dbHandler.getAllFlowPaths();
845 } catch (Exception e) {
846 // TODO: handle exceptions
847 dbHandler.rollback();
848 log.error(":getAllFlowPaths failed");
849 return flowPaths;
850 }
851 if ((flowPathsObj == null) || (flowPathsObj.iterator().hasNext() == false)) {
852 dbHandler.commit();
853 return flowPaths; // No Flows found
854 }
855
856 for (IFlowPath flowObj : flowPathsObj) {
857 //
858 // Extract the Flow state
859 //
860 FlowPath flowPath = extractFlowPath(flowObj);
861 if (flowPath != null)
862 flowPaths.add(flowPath);
863 }
864
865 dbHandler.commit();
866
867 return flowPaths;
868 }
869
870 /**
Pavlin Radoslavov16b761d2014-01-08 09:47:14 -0800871 * Get all installed flows whose Source Switch is controlled by this
872 * instance.
873 *
874 * @param dbHandler the Graph Database handler to use.
875 * @param mySwitches the collection of the switches controlled by this
876 * instance.
877 * @return the Flow Paths if found, otherwise null.
878 */
Yuta HIGUCHI337e46d2014-01-10 22:49:27 -0800879 static ArrayList<FlowPath> getAllMyFlows(DBOperation dbHandler,
Pavlin Radoslavov16b761d2014-01-08 09:47:14 -0800880 Map<Long, IOFSwitch> mySwitches) {
881 Iterable<IFlowPath> flowPathsObj = null;
882 ArrayList<FlowPath> flowPaths = new ArrayList<FlowPath>();
883
884 try {
885 flowPathsObj = dbHandler.getAllFlowPaths();
886 } catch (Exception e) {
887 // TODO: handle exceptions
888 dbHandler.rollback();
889 log.error(":getAllMyFlowPaths failed");
890 return flowPaths;
891 }
892 if ((flowPathsObj == null) || (flowPathsObj.iterator().hasNext() == false)) {
893 dbHandler.commit();
894 return flowPaths; // No Flows found
895 }
896
897 for (IFlowPath flowObj : flowPathsObj) {
898 //
899 // Extract the Source Switch DPID and ignore if the switch
900 // is not controlled by this instance.
901 //
902 String srcSwitchStr = flowObj.getSrcSwitch();
903 if (srcSwitchStr == null) {
904 // TODO: A work-around, becauuse of some bogus database objects
905 continue;
906 }
907 Dpid dpid = new Dpid(srcSwitchStr);
908 if (mySwitches.get(dpid.value()) == null)
909 continue;
910
911 //
912 // Extract the Flow state
913 //
914 FlowPath flowPath = extractFlowPath(flowObj);
915 if (flowPath != null)
916 flowPaths.add(flowPath);
917 }
918
919 dbHandler.commit();
920
921 return flowPaths;
922 }
923
924 /**
Pavlin Radoslavovf3f23bb2014-01-10 13:02:33 -0800925 * Get a subset of installed flows.
926 *
927 * @param dbHandler the Graph Database handler to use.
928 * @param flowIds the collection of Flow IDs to get.
929 * @return the Flow Paths if found, otherwise null.
930 */
Yuta HIGUCHI337e46d2014-01-10 22:49:27 -0800931 static ArrayList<FlowPath> getFlows(DBOperation dbHandler,
Pavlin Radoslavovf3f23bb2014-01-10 13:02:33 -0800932 Collection<FlowId> flowIds) {
933 ArrayList<FlowPath> flowPaths = new ArrayList<FlowPath>();
934
935 // TODO: This implementation should use threads
936 for (FlowId flowId : flowIds) {
937 FlowPath flowPath = getFlow(dbHandler, flowId);
938 if (flowPath != null)
939 flowPaths.add(flowPath);
940 }
941 // dbHandler.commit();
942
943 return flowPaths;
944 }
945
946 /**
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700947 * Extract Flow Path State from a Titan Database Object @ref IFlowPath.
948 *
949 * @param flowObj the object to extract the Flow Path State from.
950 * @return the extracted Flow Path State.
951 */
Brian O'Connor2c38efe2014-01-10 15:41:57 -0800952 static FlowPath extractFlowPath(IFlowPath flowObj) {
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700953 //
954 // Extract the Flow state
955 //
Toshio Koidea9b25142014-01-10 01:15:57 -0800956 log.info("extractFlowPath: start");
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -0800957 String flowIdStr;
958 String installerIdStr;
959 String flowPathType;
960 String flowPathUserState;
961 Long flowPathFlags;
962 Integer idleTimeout;
963 Integer hardTimeout;
964 String srcSwitchStr;
965 Short srcPortShort;
966 String dstSwitchStr;
967 Short dstPortShort;
968
969 if ( flowObj.asVertex() instanceof RamCloudVertex ) {
970 RamCloudVertex v = (RamCloudVertex)flowObj.asVertex();
971 Map<String,Object> propMap = v.getProperties();
972
973 flowIdStr = (String) propMap.get("flow_id");
974 installerIdStr = (String) propMap.get("installer_id");
975 flowPathType = (String) propMap.get("flow_path_type");
976 flowPathUserState = (String) propMap.get("user_state");
977 flowPathFlags = (Long)propMap.get("flow_path_flags");
978 idleTimeout = (Integer) propMap.get("idle_timeout");
979 hardTimeout = (Integer) propMap.get("hard_timeout");
980 srcSwitchStr = (String) propMap.get("src_switch");
981 srcPortShort = (Short)propMap.get("src_port");
982 dstSwitchStr = (String) propMap.get("dst_switch");
983 dstPortShort = (Short)propMap.get("dst_port");
984 } else {
985 flowIdStr = flowObj.getFlowId();
986 installerIdStr = flowObj.getInstallerId();
987 flowPathType = flowObj.getFlowPathType();
988 flowPathUserState = flowObj.getFlowPathUserState();
989 flowPathFlags = flowObj.getFlowPathFlags();
990 idleTimeout = flowObj.getIdleTimeout();
991 hardTimeout = flowObj.getHardTimeout();
992 srcSwitchStr = flowObj.getSrcSwitch();
993 srcPortShort = flowObj.getSrcPort();
994 dstSwitchStr = flowObj.getDstSwitch();
995 dstPortShort = flowObj.getDstPort();
996 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -0700997
998 if ((flowIdStr == null) ||
999 (installerIdStr == null) ||
Pavlin Radoslavovd28cf7c2013-10-26 11:27:43 -07001000 (flowPathType == null) ||
Pavlin Radoslavov7d4a40e2013-10-27 23:39:40 -07001001 (flowPathUserState == null) ||
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001002 (flowPathFlags == null) ||
Pavlin Radoslavov5139c0b2013-12-09 18:04:53 -08001003 (idleTimeout == null) ||
1004 (hardTimeout == null) ||
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001005 (srcSwitchStr == null) ||
1006 (srcPortShort == null) ||
1007 (dstSwitchStr == null) ||
1008 (dstPortShort == null)) {
Toshio Koidea9b25142014-01-10 01:15:57 -08001009 // TODO: A work-around, because of some bogus database objects
1010 log.error("extractFlowPath: wrong properties");
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001011 return null;
1012 }
1013
1014 FlowPath flowPath = new FlowPath();
1015 flowPath.setFlowId(new FlowId(flowIdStr));
1016 flowPath.setInstallerId(new CallerId(installerIdStr));
Pavlin Radoslavovd28cf7c2013-10-26 11:27:43 -07001017 flowPath.setFlowPathType(FlowPathType.valueOf(flowPathType));
Pavlin Radoslavov7d4a40e2013-10-27 23:39:40 -07001018 flowPath.setFlowPathUserState(FlowPathUserState.valueOf(flowPathUserState));
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001019 flowPath.setFlowPathFlags(new FlowPathFlags(flowPathFlags));
Pavlin Radoslavov5139c0b2013-12-09 18:04:53 -08001020 flowPath.setIdleTimeout(idleTimeout);
1021 flowPath.setHardTimeout(hardTimeout);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001022 flowPath.dataPath().srcPort().setDpid(new Dpid(srcSwitchStr));
1023 flowPath.dataPath().srcPort().setPort(new Port(srcPortShort));
1024 flowPath.dataPath().dstPort().setDpid(new Dpid(dstSwitchStr));
1025 flowPath.dataPath().dstPort().setPort(new Port(dstPortShort));
1026 //
1027 // Extract the match conditions common for all Flow Entries
1028 //
1029 {
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -08001030 FlowEntryMatch match = extractMatch(flowObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001031
1032 flowPath.setFlowEntryMatch(match);
1033 }
1034 //
1035 // Extract the actions for the first Flow Entry
1036 //
1037 {
1038 String actionsStr = flowObj.getActions();
1039 if (actionsStr != null) {
1040 FlowEntryActions flowEntryActions = new FlowEntryActions(actionsStr);
1041 flowPath.setFlowEntryActions(flowEntryActions);
1042 }
1043 }
1044
1045 //
1046 // Extract all Flow Entries
1047 //
1048 Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
1049 for (IFlowEntry flowEntryObj : flowEntries) {
1050 FlowEntry flowEntry = extractFlowEntry(flowEntryObj);
1051 if (flowEntry == null)
1052 continue;
1053 flowPath.dataPath().flowEntries().add(flowEntry);
1054 }
1055
Toshio Koidea9b25142014-01-10 01:15:57 -08001056 log.info("extractFlowPath: end");
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001057 return flowPath;
1058 }
1059
1060 /**
1061 * Extract Flow Entry State from a Titan Database Object @ref IFlowEntry.
1062 *
1063 * @param flowEntryObj the object to extract the Flow Entry State from.
1064 * @return the extracted Flow Entry State.
1065 */
Brian O'Connora8e49802013-10-30 20:49:59 -07001066 public static FlowEntry extractFlowEntry(IFlowEntry flowEntryObj) {
Toshio Koidea9b25142014-01-10 01:15:57 -08001067 log.info("extractFlowEntry: start");
Pavlin Radoslavovcf87e532013-12-13 18:17:00 -08001068 IFlowPath flowObj = flowEntryObj.getFlow();
Toshio Koidea9b25142014-01-10 01:15:57 -08001069 if (flowObj == null) {
1070 log.error("extractFlowEntry: no flowPath exists");
Pavlin Radoslavovcf87e532013-12-13 18:17:00 -08001071 return null;
Toshio Koidea9b25142014-01-10 01:15:57 -08001072 }
Pavlin Radoslavovcf87e532013-12-13 18:17:00 -08001073
1074 String flowIdStr = flowObj.getFlowId();
1075 //
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -08001076 String flowEntryIdStr;
1077 Integer idleTimeout;
1078 Integer hardTimeout;
1079 String switchDpidStr;
1080 String userState;
1081 String switchState;
1082 if ( flowEntryObj.asVertex() instanceof RamCloudVertex ) {
1083 RamCloudVertex v = (RamCloudVertex)flowEntryObj.asVertex();
1084 Map<String,Object> propMap = v.getProperties();
1085
1086 flowEntryIdStr = (String) propMap.get("flow_entry_id");
1087 idleTimeout = (Integer) propMap.get("idle_timeout");
1088 hardTimeout = (Integer) propMap.get("hard_timeout");
1089 switchDpidStr = (String) propMap.get("switch_dpid");
1090 userState = (String) propMap.get("user_state");
1091 switchState = (String) propMap.get("switch_state");
1092 } else {
1093 flowEntryIdStr = flowEntryObj.getFlowEntryId();
1094 idleTimeout = flowEntryObj.getIdleTimeout();
1095 hardTimeout = flowEntryObj.getHardTimeout();
1096 switchDpidStr = flowEntryObj.getSwitchDpid();
1097 userState = flowEntryObj.getUserState();
1098 switchState = flowEntryObj.getSwitchState();
1099 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001100
Pavlin Radoslavovcf87e532013-12-13 18:17:00 -08001101 if ((flowIdStr == null) ||
1102 (flowEntryIdStr == null) ||
Pavlin Radoslavov5139c0b2013-12-09 18:04:53 -08001103 (idleTimeout == null) ||
1104 (hardTimeout == null) ||
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001105 (switchDpidStr == null) ||
1106 (userState == null) ||
1107 (switchState == null)) {
Brian O'Connora8e49802013-10-30 20:49:59 -07001108 // TODO: A work-around, because of some bogus database objects
Toshio Koidea9b25142014-01-10 01:15:57 -08001109 log.error("extractFlowEntry: wrong properties");
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001110 return null;
1111 }
1112
1113 FlowEntry flowEntry = new FlowEntry();
1114 flowEntry.setFlowEntryId(new FlowEntryId(flowEntryIdStr));
Pavlin Radoslavovcf87e532013-12-13 18:17:00 -08001115 flowEntry.setFlowId(new FlowId(flowIdStr));
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001116 flowEntry.setDpid(new Dpid(switchDpidStr));
yoshia97632b2013-12-17 15:46:08 -08001117 flowEntry.setIdleTimeout(idleTimeout);
1118 flowEntry.setHardTimeout(hardTimeout);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001119
1120 //
1121 // Extract the match conditions
1122 //
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -08001123 FlowEntryMatch match = extractMatch(flowEntryObj);
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001124 flowEntry.setFlowEntryMatch(match);
1125
1126 //
1127 // Extract the actions
1128 //
1129 FlowEntryActions actions = new FlowEntryActions();
1130 String actionsStr = flowEntryObj.getActions();
1131 if (actionsStr != null)
1132 actions = new FlowEntryActions(actionsStr);
1133 flowEntry.setFlowEntryActions(actions);
1134 flowEntry.setFlowEntryUserState(FlowEntryUserState.valueOf(userState));
1135 flowEntry.setFlowEntrySwitchState(FlowEntrySwitchState.valueOf(switchState));
1136 //
1137 // TODO: Take care of FlowEntryErrorState.
1138 //
Toshio Koidea9b25142014-01-10 01:15:57 -08001139 log.info("extractFlowEntry: end");
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001140 return flowEntry;
1141 }
Yuta HIGUCHIcb32b2a2014-01-10 18:07:33 -08001142
1143 /**
1144 * Extract FlowEntryMatch from IFlowPath or IFlowEntry
1145 * @param flowObj : either IFlowPath or IFlowEntry
1146 * @return extracted Match info
1147 */
1148 private static FlowEntryMatch extractMatch(IBaseObject flowObj) {
1149 FlowEntryMatch match = new FlowEntryMatch();
1150
1151 Short matchInPort = null; // Only for IFlowEntry
1152 String matchSrcMac = null;
1153 String matchDstMac = null;
1154 Short matchEthernetFrameType = null;
1155 Short matchVlanId = null;
1156 Byte matchVlanPriority = null;
1157 String matchSrcIPv4Net = null;
1158 String matchDstIPv4Net = null;
1159 Byte matchIpProto = null;
1160 Byte matchIpToS = null;
1161 Short matchSrcTcpUdpPort = null;
1162 Short matchDstTcpUdpPort = null;
1163
1164 if ( flowObj.asVertex() instanceof RamCloudVertex ) {
1165 RamCloudVertex v = (RamCloudVertex)flowObj.asVertex();
1166 Map<String,Object> propMap = v.getProperties();
1167 matchInPort = (Short) propMap.get("matchInPort");
1168 matchSrcMac = (String) propMap.get("matchSrcMac");
1169 matchDstMac = (String) propMap.get("matchDstMac");
1170 matchEthernetFrameType = (Short) propMap.get("matchEthernetFrameType");
1171 matchVlanId = (Short) propMap.get("matchVlanId");
1172 matchVlanPriority = (Byte) propMap.get("matchVlanPriority");
1173 matchSrcIPv4Net = (String) propMap.get("matchSrcIPv4Net");
1174 matchDstIPv4Net = (String) propMap.get("matchDstIPv4Net");
1175 matchIpProto = (Byte) propMap.get("matchIpProto");
1176 matchIpToS = (Byte) propMap.get("matchIpToS");
1177 matchSrcTcpUdpPort = (Short) propMap.get("matchSrcTcpUdpPort");
1178 matchDstTcpUdpPort = (Short) propMap.get("matchDstTcpUdpPort");
1179 } else {
1180 if (flowObj instanceof IFlowEntry ){
1181 IFlowEntry flowEntry = (IFlowEntry) flowObj;
1182 matchInPort = flowEntry.getMatchInPort();
1183 matchSrcMac = flowEntry.getMatchSrcMac();
1184 matchDstMac = flowEntry.getMatchDstMac();
1185 matchEthernetFrameType = flowEntry.getMatchEthernetFrameType();
1186 matchVlanId = flowEntry.getMatchVlanId();
1187 matchVlanPriority = flowEntry.getMatchVlanPriority();
1188 matchSrcIPv4Net = flowEntry.getMatchSrcIPv4Net();
1189 matchDstIPv4Net = flowEntry.getMatchDstIPv4Net();
1190 matchIpProto = flowEntry.getMatchIpProto();
1191 matchIpToS = flowEntry.getMatchIpToS();
1192 matchSrcTcpUdpPort = flowEntry.getMatchSrcTcpUdpPort();
1193 matchDstTcpUdpPort = flowEntry.getMatchDstTcpUdpPort();
1194 } else if(flowObj instanceof IFlowPath) {
1195 IFlowPath flowPath = (IFlowPath) flowObj;
1196 matchSrcMac = flowPath.getMatchSrcMac();
1197 matchDstMac = flowPath.getMatchDstMac();
1198 matchEthernetFrameType = flowPath.getMatchEthernetFrameType();
1199 matchVlanId = flowPath.getMatchVlanId();
1200 matchVlanPriority = flowPath.getMatchVlanPriority();
1201 matchSrcIPv4Net = flowPath.getMatchSrcIPv4Net();
1202 matchDstIPv4Net = flowPath.getMatchDstIPv4Net();
1203 matchIpProto = flowPath.getMatchIpProto();
1204 matchIpToS = flowPath.getMatchIpToS();
1205 matchSrcTcpUdpPort = flowPath.getMatchSrcTcpUdpPort();
1206 matchDstTcpUdpPort = flowPath.getMatchDstTcpUdpPort();
1207 }
1208 }
1209
1210 if (matchInPort != null)
1211 match.enableInPort(new Port(matchInPort));
1212 if (matchSrcMac != null)
1213 match.enableSrcMac(MACAddress.valueOf(matchSrcMac));
1214 if (matchDstMac != null)
1215 match.enableDstMac(MACAddress.valueOf(matchDstMac));
1216 if (matchEthernetFrameType != null)
1217 match.enableEthernetFrameType(matchEthernetFrameType);
1218 if (matchVlanId != null)
1219 match.enableVlanId(matchVlanId);
1220 if (matchVlanPriority != null)
1221 match.enableVlanPriority(matchVlanPriority);
1222 if (matchSrcIPv4Net != null)
1223 match.enableSrcIPv4Net(new IPv4Net(matchSrcIPv4Net));
1224 if (matchDstIPv4Net != null)
1225 match.enableDstIPv4Net(new IPv4Net(matchDstIPv4Net));
1226 if (matchIpProto != null)
1227 match.enableIpProto(matchIpProto);
1228 if (matchIpToS != null)
1229 match.enableIpToS(matchIpToS);
1230 if (matchSrcTcpUdpPort != null)
1231 match.enableSrcTcpUdpPort(matchSrcTcpUdpPort);
1232 if (matchDstTcpUdpPort != null)
1233 match.enableDstTcpUdpPort(matchDstTcpUdpPort);
1234 return match;
1235 }
Pavlin Radoslavov661c86f2013-10-21 12:40:40 -07001236}