blob: 762d272cdfe9f08586bf7c8b514756b8fe2d914d [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
122 public FlowId getFlowId() { return flowId; }
123
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 /**
152 * Get the Flow Entry Match.
153 *
154 * @return the Flow Entry Match.
155 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800156 @JsonProperty("flowEntryMatch")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800157 public FlowEntryMatch flowEntryMatch() { return flowEntryMatch; }
158
159 /**
160 * Set the Flow Entry Match.
161 *
162 * @param flowEntryMatch the Flow Entry Match to set.
163 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800164 @JsonProperty("flowEntryMatch")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800165 public void setFlowEntryMatch(FlowEntryMatch flowEntryMatch) {
166 this.flowEntryMatch = flowEntryMatch;
167 }
168
169 /**
170 * Get the Flow Entry Actions.
171 *
172 * @return the Flow Entry Actions.
173 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800174 @JsonProperty("flowEntryActions")
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700175 public FlowEntryActions flowEntryActions() {
Pavlin Radoslavovede97582013-03-08 18:57:28 -0800176 return flowEntryActions;
177 }
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800178
179 /**
180 * Set the Flow Entry Actions.
181 *
182 * @param flowEntryActions the Flow Entry Actions to set.
183 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800184 @JsonProperty("flowEntryActions")
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700185 public void setFlowEntryActions(FlowEntryActions flowEntryActions) {
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800186 this.flowEntryActions = flowEntryActions;
187 }
188
189 /**
190 * Get the Switch DPID.
191 *
192 * @return the Switch DPID.
193 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800194 @JsonProperty("dpid")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800195 public Dpid dpid() { return dpid; }
196
197 /**
198 * Set the Switch DPID.
199 *
200 * @param dpid the Switch DPID to set.
201 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800202 @JsonProperty("dpid")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800203 public void setDpid(Dpid dpid) {
204 this.dpid = dpid;
205 }
206
207 /**
208 * Get the Switch incoming port.
209 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700210 * Used only when the entry is used to return Shortest Path computation.
211 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800212 * @return the Switch incoming port.
213 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800214 @JsonProperty("inPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800215 public Port inPort() { return inPort; }
216
217 /**
218 * Set the Switch incoming port.
219 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700220 * Used only when the entry is used to return Shortest Path computation.
221 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800222 * @param inPort the Switch incoming port to set.
223 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800224 @JsonProperty("inPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800225 public void setInPort(Port inPort) {
226 this.inPort = inPort;
227 }
228
229 /**
230 * Get the Switch outgoing port.
231 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700232 * Used only when the entry is used to return Shortest Path computation.
233 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800234 * @return the Switch outgoing port.
235 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800236 @JsonProperty("outPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800237 public Port outPort() { return outPort; }
238
239 /**
240 * Set the Switch outgoing port.
241 *
Pavlin Radoslavov67b3ef32013-04-03 02:44:48 -0700242 * Used only when the entry is used to return Shortest Path computation.
243 *
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800244 * @param outPort the Switch outgoing port to set.
245 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800246 @JsonProperty("outPort")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800247 public void setOutPort(Port outPort) {
248 this.outPort = outPort;
249 }
250
251 /**
252 * Get the Flow Entry User state.
253 *
254 * @return the Flow Entry User state.
255 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800256 @JsonProperty("flowEntryUserState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800257 public FlowEntryUserState flowEntryUserState() {
258 return flowEntryUserState;
259 }
260
261 /**
262 * Set the Flow Entry User state.
263 *
264 * @param flowEntryUserState the Flow Entry User state to set.
265 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800266 @JsonProperty("flowEntryUserState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800267 public void setFlowEntryUserState(FlowEntryUserState flowEntryUserState) {
268 this.flowEntryUserState = flowEntryUserState;
269 }
270
271 /**
272 * Get the Flow Entry Switch state.
273 *
274 * The Flow Entry Error state is used if FlowEntrySwitchState is
275 * FE_SWITCH_FAILED.
276 *
277 * @return the Flow Entry Switch state.
278 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800279 @JsonProperty("flowEntrySwitchState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800280 public FlowEntrySwitchState flowEntrySwitchState() {
281 return flowEntrySwitchState;
282 }
283
284 /**
285 * Set the Flow Entry Switch state.
286 *
287 * The Flow Entry Error state is used if FlowEntrySwitchState is
288 * FE_SWITCH_FAILED.
289 *
290 * @param flowEntrySwitchState the Flow Entry Switch state to set.
291 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800292 @JsonProperty("flowEntrySwitchState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800293 public void setFlowEntrySwitchState(FlowEntrySwitchState flowEntrySwitchState) {
294 this.flowEntrySwitchState = flowEntrySwitchState;
295 }
296
297 /**
298 * Get the Flow Entry Error state.
299 *
300 * @return the Flow Entry Error state.
301 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800302 @JsonProperty("flowEntryErrorState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800303 public FlowEntryErrorState flowEntryErrorState() {
304 return flowEntryErrorState;
305 }
306
307 /**
308 * Set the Flow Entry Error state.
309 *
310 * @param flowEntryErrorState the Flow Entry Error state to set.
311 */
Pavlin Radoslavov2013cbb2013-02-26 10:15:18 -0800312 @JsonProperty("flowEntryErrorState")
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800313 public void setFlowEntryErrorState(FlowEntryErrorState flowEntryErrorState) {
314 this.flowEntryErrorState = flowEntryErrorState;
315 }
316
317 /**
318 * Convert the flow entry to a string.
319 *
Pavlin Radoslavovad008e02013-02-21 18:42:42 -0800320 * The string has the following form:
Pavlin Radoslavov1bc2c472013-07-17 18:11:37 -0700321 * [flowEntryId=XXX flowEntryMatch=XXX flowEntryActions=XXX dpid=XXX
Pavlin Radoslavova10a9a82013-02-22 11:47:54 -0800322 * inPort=XXX outPort=XXX flowEntryUserState=XXX flowEntrySwitchState=XXX
323 * flowEntryErrorState=XXX]
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800324 * @return the flow entry as a string.
325 */
326 @Override
327 public String toString() {
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900328 StringBuilder ret = new StringBuilder();
329 if ( flowEntryId != null ) {
330 ret.append("[flowEntryId=" + this.flowEntryId.toString());
331 } else {
HIGUCHI Yuta64163c02013-08-06 07:51:19 +0900332 ret.append("[");
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900333 }
334 if ( flowEntryMatch != null ) {
335 ret.append(" flowEntryMatch=" + this.flowEntryMatch.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900336 }
337 ret.append( " flowEntryActions=" + this.flowEntryActions.toString() );
338 if ( dpid != null ) {
339 ret.append(" dpid=" + this.dpid.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900340 }
341 if ( inPort != null ) {
342 ret.append(" inPort=" + this.inPort.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900343 }
344 if ( outPort != null ) {
345 ret.append(" outPort=" + this.outPort.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900346 }
347 ret.append(" flowEntryUserState=" + this.flowEntryUserState);
348 ret.append(" flowEntrySwitchState=" + this.flowEntrySwitchState);
349 if ( flowEntryErrorState != null ) {
350 ret.append(" flowEntryErrorState=" + this.flowEntryErrorState.toString());
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900351 }
352 ret.append("]");
Pavlin Radoslavovad008e02013-02-21 18:42:42 -0800353
HIGUCHI Yuta01f4d7d2013-08-04 06:02:24 +0900354 return ret.toString();
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800355 }
Pavlin Radoslavov5363c2a2013-02-18 09:55:42 -0800356}