blob: 2666524614a7925531b96d210e739015e686db5b [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 Open Networking Laboratory
Thomas Vachuska83e090e2014-10-22 14:25:35 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska83e090e2014-10-22 14:25:35 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska83e090e2014-10-22 14:25:35 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.flow.criteria;
tom8bb16062014-09-12 14:47:46 -070017
alshabib7b795492014-09-16 14:38:39 -070018
tom8bb16062014-09-12 14:47:46 -070019/**
20 * Representation of a single header field selection.
21 */
22public interface Criterion {
23
24 /**
25 * Types of fields to which the selection criterion may apply.
26 */
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080027 // From page 75 of OpenFlow 1.5.0 spec
Sho SHIMIZU3310a342015-05-13 12:14:05 -070028 enum Type {
tom8bb16062014-09-12 14:47:46 -070029 /** Switch input port. */
30 IN_PORT,
Jian Li79bdf3c2015-11-30 14:54:54 -080031
tom8bb16062014-09-12 14:47:46 -070032 /** Switch physical input port. */
33 IN_PHY_PORT,
Jian Li79bdf3c2015-11-30 14:54:54 -080034
tom8bb16062014-09-12 14:47:46 -070035 /** Metadata passed between tables. */
36 METADATA,
Jian Li79bdf3c2015-11-30 14:54:54 -080037
tom8bb16062014-09-12 14:47:46 -070038 /** Ethernet destination address. */
39 ETH_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080040
tom8bb16062014-09-12 14:47:46 -070041 /** Ethernet source address. */
42 ETH_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080043
tom8bb16062014-09-12 14:47:46 -070044 /** Ethernet frame type. */
45 ETH_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -080046
tom8bb16062014-09-12 14:47:46 -070047 /** VLAN id. */
48 VLAN_VID,
Jian Li79bdf3c2015-11-30 14:54:54 -080049
tom8bb16062014-09-12 14:47:46 -070050 /** VLAN priority. */
51 VLAN_PCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080052
tom8bb16062014-09-12 14:47:46 -070053 /** IP DSCP (6 bits in ToS field). */
54 IP_DSCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080055
tom8bb16062014-09-12 14:47:46 -070056 /** IP ECN (2 bits in ToS field). */
57 IP_ECN,
Jian Li79bdf3c2015-11-30 14:54:54 -080058
tom8bb16062014-09-12 14:47:46 -070059 /** IP protocol. */
60 IP_PROTO,
Jian Li79bdf3c2015-11-30 14:54:54 -080061
tom8bb16062014-09-12 14:47:46 -070062 /** IPv4 source address. */
63 IPV4_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080064
tom8bb16062014-09-12 14:47:46 -070065 /** IPv4 destination address. */
66 IPV4_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080067
tom8bb16062014-09-12 14:47:46 -070068 /** TCP source port. */
69 TCP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080070
tom8bb16062014-09-12 14:47:46 -070071 /** TCP destination port. */
72 TCP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080073
tom8bb16062014-09-12 14:47:46 -070074 /** UDP source port. */
75 UDP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080076
tom8bb16062014-09-12 14:47:46 -070077 /** UDP destination port. */
78 UDP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080079
tom8bb16062014-09-12 14:47:46 -070080 /** SCTP source port. */
81 SCTP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080082
tom8bb16062014-09-12 14:47:46 -070083 /** SCTP destination port. */
84 SCTP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080085
tom8bb16062014-09-12 14:47:46 -070086 /** ICMP type. */
87 ICMPV4_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -080088
tom8bb16062014-09-12 14:47:46 -070089 /** ICMP code. */
90 ICMPV4_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -080091
tom8bb16062014-09-12 14:47:46 -070092 /** ARP opcode. */
93 ARP_OP,
Jian Li79bdf3c2015-11-30 14:54:54 -080094
tom8bb16062014-09-12 14:47:46 -070095 /** ARP source IPv4 address. */
96 ARP_SPA,
Jian Li79bdf3c2015-11-30 14:54:54 -080097
tom8bb16062014-09-12 14:47:46 -070098 /** ARP target IPv4 address. */
99 ARP_TPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800100
tom8bb16062014-09-12 14:47:46 -0700101 /** ARP source hardware address. */
102 ARP_SHA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800103
tom8bb16062014-09-12 14:47:46 -0700104 /** ARP target hardware address. */
105 ARP_THA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800106
tom8bb16062014-09-12 14:47:46 -0700107 /** IPv6 source address. */
108 IPV6_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800109
tom8bb16062014-09-12 14:47:46 -0700110 /** IPv6 destination address. */
111 IPV6_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800112
tom8bb16062014-09-12 14:47:46 -0700113 /** IPv6 Flow Label. */
114 IPV6_FLABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800115
tom8bb16062014-09-12 14:47:46 -0700116 /** ICMPv6 type. */
117 ICMPV6_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800118
tom8bb16062014-09-12 14:47:46 -0700119 /** ICMPv6 code. */
120 ICMPV6_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800121
tom8bb16062014-09-12 14:47:46 -0700122 /** Target address for ND. */
123 IPV6_ND_TARGET,
Jian Li79bdf3c2015-11-30 14:54:54 -0800124
tom8bb16062014-09-12 14:47:46 -0700125 /** Source link-layer for ND. */
126 IPV6_ND_SLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800127
tom8bb16062014-09-12 14:47:46 -0700128 /** Target link-layer for ND. */
129 IPV6_ND_TLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800130
tom8bb16062014-09-12 14:47:46 -0700131 /** MPLS label. */
132 MPLS_LABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800133
tom8bb16062014-09-12 14:47:46 -0700134 /** MPLS TC. */
135 MPLS_TC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800136
137 /** MPLS BoS bit. */
tom8bb16062014-09-12 14:47:46 -0700138 MPLS_BOS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800139
tom8bb16062014-09-12 14:47:46 -0700140 /** PBB I-SID. */
141 PBB_ISID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800142
tom8bb16062014-09-12 14:47:46 -0700143 /** Logical Port Metadata. */
144 TUNNEL_ID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800145
tom8bb16062014-09-12 14:47:46 -0700146 /** IPv6 Extension Header pseudo-field. */
Marc De Leenheer49087752014-10-23 13:54:09 -0700147 IPV6_EXTHDR,
Jian Li79bdf3c2015-11-30 14:54:54 -0800148
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800149 /** Unassigned value: 40. */
150 UNASSIGNED_40,
Jian Li79bdf3c2015-11-30 14:54:54 -0800151
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800152 /** PBB UCA header field. */
153 PBB_UCA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800154
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800155 /** TCP flags. */
156 TCP_FLAGS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800157
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800158 /** Output port from action set metadata. */
159 ACTSET_OUTPUT,
Jian Li79bdf3c2015-11-30 14:54:54 -0800160
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800161 /** Packet type value. */
162 PACKET_TYPE,
163
164 //
165 // NOTE: Everything below is defined elsewhere: ONOS-specific,
166 // extensions, etc.
167 //
Marc De Leenheer49087752014-10-23 13:54:09 -0700168 /** Optical channel signal ID (lambda). */
169 OCH_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800170
Marc De Leenheer49087752014-10-23 13:54:09 -0700171 /** Optical channel signal type (fixed or flexible). */
alshabiba3a476d2015-04-10 14:35:38 -0700172 OCH_SIGTYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800173
Yafit Hadar52d81552015-10-07 12:26:52 +0300174 /** ODU (Optical channel Data Unit) signal ID. */
175 ODU_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800176
Yafit Hadar52d81552015-10-07 12:26:52 +0300177 /** ODU (Optical channel Data Unit) signal type. */
178 ODU_SIGTYPE,
alshabiba3a476d2015-04-10 14:35:38 -0700179
Jian Li79bdf3c2015-11-30 14:54:54 -0800180 /** An empty criterion. */
alshabiba3a476d2015-04-10 14:35:38 -0700181 DUMMY
tom8bb16062014-09-12 14:47:46 -0700182 }
183
alshabib7b795492014-09-16 14:38:39 -0700184 /**
185 * Returns the type of criterion.
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800186 *
alshabib7b795492014-09-16 14:38:39 -0700187 * @return type of criterion
188 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700189 Type type();
alshabib7b795492014-09-16 14:38:39 -0700190
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800191 /**
192 * Bit definitions for IPv6 Extension Header pseudo-field.
193 * From page 79 of OpenFlow 1.5.0 spec.
194 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700195 enum IPv6ExthdrFlags {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800196 /** "No next header" encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800197 NONEXT((short) (1 << 0)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800198 /** Encrypted Sec Payload header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800199 ESP((short) (1 << 1)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800200 /** Authentication header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800201 AUTH((short) (1 << 2)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800202 /** 1 or 2 dest headers present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800203 DEST((short) (1 << 3)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800204 /** Fragment header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800205 FRAG((short) (1 << 4)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800206 /** Router header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800207 ROUTER((short) (1 << 5)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800208 /** Hop-by-hop header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800209 HOP((short) (1 << 6)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800210 /** Unexpected repeats encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800211 UNREP((short) (1 << 7)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800212 /** Unexpected sequencing encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800213 UNSEQ((short) (1 << 8));
tom8bb16062014-09-12 14:47:46 -0700214
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800215 private short value;
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800216
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800217 IPv6ExthdrFlags(short value) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800218 this.value = value;
219 }
220
221 /**
222 * Gets the value as an integer.
223 *
224 * @return the value as an integer
225 */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800226 public short getValue() {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800227 return this.value;
228 }
229 }
Jian Li79bdf3c2015-11-30 14:54:54 -0800230
231 enum TCPFlags {
232
233 /** ECN-nonce concealment protection. */
234 NS((short) (1 << 0)),
235 /** Congestion Window Reduced. */
236 CWR((short) (1 << 1)),
237 /** ECN-Echo. **/
238 ECE((short) (1 << 2)),
239 /** Urgent pointer field is significant. */
240 URG((short) (1 << 3)),
241 /** Acknowledgment field is significant. */
242 ACK((short) (1 << 4)),
243 /** Push the buffered data to the receiving application. */
244 PSH((short) (1 << 5)),
245 /** Reset the connection. */
246 RST((short) (1 << 6)),
247 /** Synchronize sequence numbers. */
248 SYN((short) (1 << 7)),
249 /** No more data from sender. */
250 FIN((short) (1 << 8));
251
252 private short value;
253
254 TCPFlags(short value) {
255 this.value = value;
256 }
257
258 /**
259 * Gets the value as an integer.
260 *
261 * @return the value as an integer
262 */
263 public short getValue() {
264 return this.value;
265 }
266 }
tom8bb16062014-09-12 14:47:46 -0700267}