blob: 17557b9dbd96e157292b5daa21a23aab2c10df11 [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
Jonathan Hart26a8d952015-12-02 15:16:35 -0800180 /** Extension criterion. */
181 EXTENSION,
182
Jian Li79bdf3c2015-11-30 14:54:54 -0800183 /** An empty criterion. */
alshabiba3a476d2015-04-10 14:35:38 -0700184 DUMMY
tom8bb16062014-09-12 14:47:46 -0700185 }
186
alshabib7b795492014-09-16 14:38:39 -0700187 /**
188 * Returns the type of criterion.
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800189 *
alshabib7b795492014-09-16 14:38:39 -0700190 * @return type of criterion
191 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700192 Type type();
alshabib7b795492014-09-16 14:38:39 -0700193
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800194 /**
195 * Bit definitions for IPv6 Extension Header pseudo-field.
196 * From page 79 of OpenFlow 1.5.0 spec.
197 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700198 enum IPv6ExthdrFlags {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800199 /** "No next header" encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800200 NONEXT((short) (1 << 0)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800201 /** Encrypted Sec Payload header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800202 ESP((short) (1 << 1)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800203 /** Authentication header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800204 AUTH((short) (1 << 2)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800205 /** 1 or 2 dest headers present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800206 DEST((short) (1 << 3)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800207 /** Fragment header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800208 FRAG((short) (1 << 4)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800209 /** Router header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800210 ROUTER((short) (1 << 5)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800211 /** Hop-by-hop header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800212 HOP((short) (1 << 6)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800213 /** Unexpected repeats encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800214 UNREP((short) (1 << 7)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800215 /** Unexpected sequencing encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800216 UNSEQ((short) (1 << 8));
tom8bb16062014-09-12 14:47:46 -0700217
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800218 private short value;
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800219
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800220 IPv6ExthdrFlags(short value) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800221 this.value = value;
222 }
223
224 /**
225 * Gets the value as an integer.
226 *
227 * @return the value as an integer
228 */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800229 public short getValue() {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800230 return this.value;
231 }
232 }
Jian Li79bdf3c2015-11-30 14:54:54 -0800233
234 enum TCPFlags {
235
236 /** ECN-nonce concealment protection. */
237 NS((short) (1 << 0)),
238 /** Congestion Window Reduced. */
239 CWR((short) (1 << 1)),
240 /** ECN-Echo. **/
241 ECE((short) (1 << 2)),
242 /** Urgent pointer field is significant. */
243 URG((short) (1 << 3)),
244 /** Acknowledgment field is significant. */
245 ACK((short) (1 << 4)),
246 /** Push the buffered data to the receiving application. */
247 PSH((short) (1 << 5)),
248 /** Reset the connection. */
249 RST((short) (1 << 6)),
250 /** Synchronize sequence numbers. */
251 SYN((short) (1 << 7)),
252 /** No more data from sender. */
253 FIN((short) (1 << 8));
254
255 private short value;
256
257 TCPFlags(short value) {
258 this.value = value;
259 }
260
261 /**
262 * Gets the value as an integer.
263 *
264 * @return the value as an integer
265 */
266 public short getValue() {
267 return this.value;
268 }
269 }
tom8bb16062014-09-12 14:47:46 -0700270}