blob: 98620409de6a2cf299fd3a5a88654789044c2126 [file] [log] [blame]
HIGUCHI Yuta356086e2013-06-12 15:21:19 -07001package net.onrc.onos.ofcontroller.util;
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -08002
Pavlin Radoslavovede97582013-03-08 18:57:28 -08003
Pankaj Berded0ae0ff2013-03-26 15:37:12 -07004import org.codehaus.jackson.annotate.JsonIgnore;
Pavlin Radoslavovad008e02013-02-21 18:42:42 -08005import org.codehaus.jackson.annotate.JsonProperty;
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -08006
7/**
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -08008 * The class representing the Flow Entry.
9 *
10 * NOTE: The specification is incomplete. E.g., the entry needs to
11 * support multiple in-ports and multiple out-ports.
12 */
13public class FlowEntry {
Pavlin Radoslavovd5b21db2013-07-29 17:09:53 -070014 private FlowId flowId; // FlowID of the Flow Entry
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -080015 private FlowEntryId flowEntryId; // The Flow Entry ID
16 private FlowEntryMatch flowEntryMatch; // The Flow Entry Match
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070017 private FlowEntryActions flowEntryActions; // The Flow Entry Actions
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -080018 private Dpid dpid; // The Switch DPID
Pavlin Radoslavovfbcb97c2013-03-21 11:29:58 -070019 private Port inPort; // The Switch incoming port. Used only
20 // when the entry is used to return
21 // Shortest Path computation.
22 private Port outPort; // The Switch outgoing port. Used only
23 // when the entry is used to return
24 // Shortest Path computation.
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -080025 private FlowEntryUserState flowEntryUserState; // The Flow Entry User state
26 private FlowEntrySwitchState flowEntrySwitchState; // The Flow Entry Switch state
27 // The Flow Entry Error state (if FlowEntrySwitchState is FE_SWITCH_FAILED)
28 private FlowEntryErrorState flowEntryErrorState;
29
30 /**
31 * Default constructor.
32 */
33 public FlowEntry() {
Pavlin Radoslavovede97582013-03-08 18:57:28 -080034 // TODO: Test code
35 /*
36 MACAddress mac = MACAddress.valueOf("01:02:03:04:05:06");
37 IPv4 ipv4 = new IPv4("1.2.3.4");
38 IPv4Net ipv4net = new IPv4Net("5.6.7.0/24");
39
40 flowEntryMatch = new FlowEntryMatch();
41 flowEntryMatch.enableInPort(new Port((short)10));
42 flowEntryMatch.enableSrcMac(mac);
43 flowEntryMatch.enableDstMac(mac);
44 flowEntryMatch.enableVlanId((short)20);
45 flowEntryMatch.enableVlanPriority((byte)30);
46 flowEntryMatch.enableEthernetFrameType((short)40);
47 flowEntryMatch.enableIpToS((byte)50);
48 flowEntryMatch.enableIpProto((byte)60);
49 flowEntryMatch.enableSrcIPv4Net(ipv4net);
50 flowEntryMatch.enableDstIPv4Net(ipv4net);
51 flowEntryMatch.enableSrcTcpUdpPort((short)70);
52 flowEntryMatch.enableDstTcpUdpPort((short)80);
53
54 FlowEntryAction action = null;
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070055 FlowEntryActions actions = new FlowEntryActions();
Pavlin Radoslavovede97582013-03-08 18:57:28 -080056
57 action = new FlowEntryAction();
58 action.setActionOutput(new Port((short)12));
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070059 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080060
61 action = new FlowEntryAction();
62 action.setActionOutputToController((short)13);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070063 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080064
65 action = new FlowEntryAction();
66 action.setActionSetVlanId((short)14);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070067 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080068
69 action = new FlowEntryAction();
70 action.setActionSetVlanPriority((byte)15);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070071 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080072
73 action = new FlowEntryAction();
74 action.setActionStripVlan(true);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070075 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080076
77 action = new FlowEntryAction();
78 action.setActionSetEthernetSrcAddr(mac);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070079 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080080
81 action = new FlowEntryAction();
82 action.setActionSetEthernetDstAddr(mac);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070083 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080084
85 action = new FlowEntryAction();
86 action.setActionSetIPv4SrcAddr(ipv4);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070087 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080088
89 action = new FlowEntryAction();
90 action.setActionSetIPv4DstAddr(ipv4);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070091 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080092
93 action = new FlowEntryAction();
94 action.setActionSetIpToS((byte)16);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070095 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -080096
97 action = new FlowEntryAction();
98 action.setActionSetTcpUdpSrcPort((short)17);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -070099 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -0800100
101 action = new FlowEntryAction();
102 action.setActionSetTcpUdpDstPort((short)18);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700103 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -0800104
105 action = new FlowEntryAction();
106 action.setActionEnqueue(new Port((short)19), 20);
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700107 actions.addAction(action);
Pavlin Radoslavovede97582013-03-08 18:57:28 -0800108
109 setFlowEntryActions(actions);
110 */
111
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700112 flowEntryActions = new FlowEntryActions();
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800113 flowEntryUserState = FlowEntryUserState.FE_USER_UNKNOWN;
114 flowEntrySwitchState = FlowEntrySwitchState.FE_SWITCH_UNKNOWN;
115 }
116
117 /**
Pavlin Radoslavov5f85c7b2013-03-28 05:33:57 -0700118 * Get the Flow ID.
119 * @return the Flow ID.
120 */
121 @JsonIgnore
Pavlin Radoslavovb1309e82013-10-30 12:18:28 -0700122 public FlowId flowId() { return flowId; }
Pavlin Radoslavov5f85c7b2013-03-28 05:33:57 -0700123
124 /**
125 * Set the Flow ID.
126 *
127 * @param flowId the Flow ID to set.
128 */
129 public void setFlowId(FlowId flowId) {
130 this.flowId = flowId;
131 }
132
133 /**
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800134 * Get the Flow Entry ID.
135 *
136 * @return the Flow Entry ID.
137 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800138 @JsonProperty("flowEntryId")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800139 public FlowEntryId flowEntryId() { return flowEntryId; }
140
141 /**
142 * Set the Flow Entry ID.
143 *
144 * @param flowEntryId the Flow Entry ID to set.
145 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800146 @JsonProperty("flowEntryId")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800147 public void setFlowEntryId(FlowEntryId flowEntryId) {
148 this.flowEntryId = flowEntryId;
149 }
150
151 /**
Pavlin Radoslavovb1309e82013-10-30 12:18:28 -0700152 * Test whether the Flow Entry ID is valid.
153 *
154 * @return true if the Flow Entry ID is valid, otherwise false.
155 */
156 public boolean isValidFlowEntryId() {
157 if (this.flowEntryId == null)
158 return false;
159 return (this.flowEntryId.value() != 0);
160 }
161
162 /**
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800163 * Get the Flow Entry Match.
164 *
165 * @return the Flow Entry Match.
166 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800167 @JsonProperty("flowEntryMatch")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800168 public FlowEntryMatch flowEntryMatch() { return flowEntryMatch; }
169
170 /**
171 * Set the Flow Entry Match.
172 *
173 * @param flowEntryMatch the Flow Entry Match to set.
174 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800175 @JsonProperty("flowEntryMatch")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800176 public void setFlowEntryMatch(FlowEntryMatch flowEntryMatch) {
177 this.flowEntryMatch = flowEntryMatch;
178 }
179
180 /**
181 * Get the Flow Entry Actions.
182 *
183 * @return the Flow Entry Actions.
184 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800185 @JsonProperty("flowEntryActions")
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700186 public FlowEntryActions flowEntryActions() {
Pavlin Radoslavovede97582013-03-08 18:57:28 -0800187 return flowEntryActions;
188 }
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800189
190 /**
191 * Set the Flow Entry Actions.
192 *
193 * @param flowEntryActions the Flow Entry Actions to set.
194 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800195 @JsonProperty("flowEntryActions")
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700196 public void setFlowEntryActions(FlowEntryActions flowEntryActions) {
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800197 this.flowEntryActions = flowEntryActions;
198 }
199
200 /**
201 * Get the Switch DPID.
202 *
203 * @return the Switch DPID.
204 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800205 @JsonProperty("dpid")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800206 public Dpid dpid() { return dpid; }
207
208 /**
209 * Set the Switch DPID.
210 *
211 * @param dpid the Switch DPID to set.
212 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800213 @JsonProperty("dpid")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800214 public void setDpid(Dpid dpid) {
215 this.dpid = dpid;
216 }
217
218 /**
219 * Get the Switch incoming port.
220 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700221 * Used only when the entry is used to return Shortest Path computation.
222 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800223 * @return the Switch incoming port.
224 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800225 @JsonProperty("inPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800226 public Port inPort() { return inPort; }
227
228 /**
229 * Set the Switch incoming port.
230 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700231 * Used only when the entry is used to return Shortest Path computation.
232 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800233 * @param inPort the Switch incoming port to set.
234 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800235 @JsonProperty("inPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800236 public void setInPort(Port inPort) {
237 this.inPort = inPort;
238 }
239
240 /**
241 * Get the Switch outgoing port.
242 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700243 * Used only when the entry is used to return Shortest Path computation.
244 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800245 * @return the Switch outgoing port.
246 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800247 @JsonProperty("outPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800248 public Port outPort() { return outPort; }
249
250 /**
251 * Set the Switch outgoing port.
252 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700253 * Used only when the entry is used to return Shortest Path computation.
254 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800255 * @param outPort the Switch outgoing port to set.
256 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800257 @JsonProperty("outPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800258 public void setOutPort(Port outPort) {
259 this.outPort = outPort;
260 }
261
262 /**
263 * Get the Flow Entry User state.
264 *
265 * @return the Flow Entry User state.
266 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800267 @JsonProperty("flowEntryUserState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800268 public FlowEntryUserState flowEntryUserState() {
269 return flowEntryUserState;
270 }
271
272 /**
273 * Set the Flow Entry User state.
274 *
275 * @param flowEntryUserState the Flow Entry User state to set.
276 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800277 @JsonProperty("flowEntryUserState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800278 public void setFlowEntryUserState(FlowEntryUserState flowEntryUserState) {
279 this.flowEntryUserState = flowEntryUserState;
280 }
281
282 /**
283 * Get the Flow Entry Switch state.
284 *
285 * The Flow Entry Error state is used if FlowEntrySwitchState is
286 * FE_SWITCH_FAILED.
287 *
288 * @return the Flow Entry Switch state.
289 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800290 @JsonProperty("flowEntrySwitchState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800291 public FlowEntrySwitchState flowEntrySwitchState() {
292 return flowEntrySwitchState;
293 }
294
295 /**
296 * Set the Flow Entry Switch state.
297 *
298 * The Flow Entry Error state is used if FlowEntrySwitchState is
299 * FE_SWITCH_FAILED.
300 *
301 * @param flowEntrySwitchState the Flow Entry Switch state to set.
302 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800303 @JsonProperty("flowEntrySwitchState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800304 public void setFlowEntrySwitchState(FlowEntrySwitchState flowEntrySwitchState) {
305 this.flowEntrySwitchState = flowEntrySwitchState;
306 }
307
308 /**
309 * Get the Flow Entry Error state.
310 *
311 * @return the Flow Entry Error state.
312 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800313 @JsonProperty("flowEntryErrorState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800314 public FlowEntryErrorState flowEntryErrorState() {
315 return flowEntryErrorState;
316 }
317
318 /**
319 * Set the Flow Entry Error state.
320 *
321 * @param flowEntryErrorState the Flow Entry Error state to set.
322 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800323 @JsonProperty("flowEntryErrorState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800324 public void setFlowEntryErrorState(FlowEntryErrorState flowEntryErrorState) {
325 this.flowEntryErrorState = flowEntryErrorState;
326 }
327
328 /**
329 * Convert the flow entry to a string.
330 *
Pavlin Radoslavovad008e02013-02-21 18:42:42 -0800331 * The string has the following form:
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700332 * [flowEntryId=XXX flowEntryMatch=XXX flowEntryActions=XXX dpid=XXX
Pavlin Radoslavova10a9a82013-02-22 11:47:54 -0800333 * inPort=XXX outPort=XXX flowEntryUserState=XXX flowEntrySwitchState=XXX
334 * flowEntryErrorState=XXX]
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800335 * @return the flow entry as a string.
336 */
337 @Override
338 public String toString() {
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900339 StringBuilder ret = new StringBuilder();
340 if ( flowEntryId != null ) {
341 ret.append("[flowEntryId=" + this.flowEntryId.toString());
342 } else {
HIGUCHI Yuta64163c02013-08-06 07:51:19 +0900343 ret.append("[");
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900344 }
345 if ( flowEntryMatch != null ) {
346 ret.append(" flowEntryMatch=" + this.flowEntryMatch.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900347 }
348 ret.append( " flowEntryActions=" + this.flowEntryActions.toString() );
349 if ( dpid != null ) {
350 ret.append(" dpid=" + this.dpid.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900351 }
352 if ( inPort != null ) {
353 ret.append(" inPort=" + this.inPort.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900354 }
355 if ( outPort != null ) {
356 ret.append(" outPort=" + this.outPort.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900357 }
358 ret.append(" flowEntryUserState=" + this.flowEntryUserState);
359 ret.append(" flowEntrySwitchState=" + this.flowEntrySwitchState);
360 if ( flowEntryErrorState != null ) {
361 ret.append(" flowEntryErrorState=" + this.flowEntryErrorState.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900362 }
363 ret.append("]");
Pavlin Radoslavovad008e02013-02-21 18:42:42 -0800364
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900365 return ret.toString();
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800366 }
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800367}