blob: 4772a350603e601172e3d7df282dcea684300b93 [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2014-present 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
Jonathan Hartc7840bd2016-01-21 23:26:29 -080024 static final String SEPARATOR = ":";
25
tom8bb16062014-09-12 14:47:46 -070026 /**
27 * Types of fields to which the selection criterion may apply.
28 */
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -080029 // From page 75 of OpenFlow 1.5.0 spec
Sho SHIMIZU3310a342015-05-13 12:14:05 -070030 enum Type {
tom8bb16062014-09-12 14:47:46 -070031 /** Switch input port. */
32 IN_PORT,
Jian Li79bdf3c2015-11-30 14:54:54 -080033
tom8bb16062014-09-12 14:47:46 -070034 /** Switch physical input port. */
35 IN_PHY_PORT,
Jian Li79bdf3c2015-11-30 14:54:54 -080036
tom8bb16062014-09-12 14:47:46 -070037 /** Metadata passed between tables. */
38 METADATA,
Jian Li79bdf3c2015-11-30 14:54:54 -080039
tom8bb16062014-09-12 14:47:46 -070040 /** Ethernet destination address. */
41 ETH_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080042
Saurav Das9d6c86b2016-02-19 09:01:07 -080043 /** Ethernet destination address with masking. */
44 ETH_DST_MASKED,
45
tom8bb16062014-09-12 14:47:46 -070046 /** Ethernet source address. */
47 ETH_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080048
Saurav Das9d6c86b2016-02-19 09:01:07 -080049 /** Ethernet source address with masking. */
50 ETH_SRC_MASKED,
51
tom8bb16062014-09-12 14:47:46 -070052 /** Ethernet frame type. */
53 ETH_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -080054
tom8bb16062014-09-12 14:47:46 -070055 /** VLAN id. */
56 VLAN_VID,
Jian Li79bdf3c2015-11-30 14:54:54 -080057
tom8bb16062014-09-12 14:47:46 -070058 /** VLAN priority. */
59 VLAN_PCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080060
alshabibfa0dc662016-01-13 11:23:53 -080061 /**
62 * Inner VLAN id.
63 *
64 * Note: Some drivers may not support this.
65 */
66 INNER_VLAN_VID,
67
68 /**
69 * Inner VLAN pcp.
70 *
71 * Note: Some drivers may not support this.
72 */
73 INNER_VLAN_PCP,
74
tom8bb16062014-09-12 14:47:46 -070075 /** IP DSCP (6 bits in ToS field). */
76 IP_DSCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080077
tom8bb16062014-09-12 14:47:46 -070078 /** IP ECN (2 bits in ToS field). */
79 IP_ECN,
Jian Li79bdf3c2015-11-30 14:54:54 -080080
tom8bb16062014-09-12 14:47:46 -070081 /** IP protocol. */
82 IP_PROTO,
Jian Li79bdf3c2015-11-30 14:54:54 -080083
tom8bb16062014-09-12 14:47:46 -070084 /** IPv4 source address. */
85 IPV4_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080086
tom8bb16062014-09-12 14:47:46 -070087 /** IPv4 destination address. */
88 IPV4_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080089
tom8bb16062014-09-12 14:47:46 -070090 /** TCP source port. */
91 TCP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080092
tom8bb16062014-09-12 14:47:46 -070093 /** TCP destination port. */
94 TCP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080095
tom8bb16062014-09-12 14:47:46 -070096 /** UDP source port. */
97 UDP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080098
tom8bb16062014-09-12 14:47:46 -070099 /** UDP destination port. */
100 UDP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800101
tom8bb16062014-09-12 14:47:46 -0700102 /** SCTP source port. */
103 SCTP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800104
tom8bb16062014-09-12 14:47:46 -0700105 /** SCTP destination port. */
106 SCTP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800107
tom8bb16062014-09-12 14:47:46 -0700108 /** ICMP type. */
109 ICMPV4_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800110
tom8bb16062014-09-12 14:47:46 -0700111 /** ICMP code. */
112 ICMPV4_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800113
tom8bb16062014-09-12 14:47:46 -0700114 /** ARP opcode. */
115 ARP_OP,
Jian Li79bdf3c2015-11-30 14:54:54 -0800116
tom8bb16062014-09-12 14:47:46 -0700117 /** ARP source IPv4 address. */
118 ARP_SPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800119
tom8bb16062014-09-12 14:47:46 -0700120 /** ARP target IPv4 address. */
121 ARP_TPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800122
tom8bb16062014-09-12 14:47:46 -0700123 /** ARP source hardware address. */
124 ARP_SHA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800125
tom8bb16062014-09-12 14:47:46 -0700126 /** ARP target hardware address. */
127 ARP_THA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800128
tom8bb16062014-09-12 14:47:46 -0700129 /** IPv6 source address. */
130 IPV6_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800131
tom8bb16062014-09-12 14:47:46 -0700132 /** IPv6 destination address. */
133 IPV6_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800134
tom8bb16062014-09-12 14:47:46 -0700135 /** IPv6 Flow Label. */
136 IPV6_FLABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800137
tom8bb16062014-09-12 14:47:46 -0700138 /** ICMPv6 type. */
139 ICMPV6_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800140
tom8bb16062014-09-12 14:47:46 -0700141 /** ICMPv6 code. */
142 ICMPV6_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800143
tom8bb16062014-09-12 14:47:46 -0700144 /** Target address for ND. */
145 IPV6_ND_TARGET,
Jian Li79bdf3c2015-11-30 14:54:54 -0800146
tom8bb16062014-09-12 14:47:46 -0700147 /** Source link-layer for ND. */
148 IPV6_ND_SLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800149
tom8bb16062014-09-12 14:47:46 -0700150 /** Target link-layer for ND. */
151 IPV6_ND_TLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800152
tom8bb16062014-09-12 14:47:46 -0700153 /** MPLS label. */
154 MPLS_LABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800155
tom8bb16062014-09-12 14:47:46 -0700156 /** MPLS TC. */
157 MPLS_TC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800158
159 /** MPLS BoS bit. */
tom8bb16062014-09-12 14:47:46 -0700160 MPLS_BOS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800161
tom8bb16062014-09-12 14:47:46 -0700162 /** PBB I-SID. */
163 PBB_ISID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800164
tom8bb16062014-09-12 14:47:46 -0700165 /** Logical Port Metadata. */
166 TUNNEL_ID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800167
tom8bb16062014-09-12 14:47:46 -0700168 /** IPv6 Extension Header pseudo-field. */
Marc De Leenheer49087752014-10-23 13:54:09 -0700169 IPV6_EXTHDR,
Jian Li79bdf3c2015-11-30 14:54:54 -0800170
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800171 /** Unassigned value: 40. */
172 UNASSIGNED_40,
Jian Li79bdf3c2015-11-30 14:54:54 -0800173
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800174 /** PBB UCA header field. */
175 PBB_UCA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800176
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800177 /** TCP flags. */
178 TCP_FLAGS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800179
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800180 /** Output port from action set metadata. */
181 ACTSET_OUTPUT,
Jian Li79bdf3c2015-11-30 14:54:54 -0800182
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800183 /** Packet type value. */
184 PACKET_TYPE,
185
186 //
187 // NOTE: Everything below is defined elsewhere: ONOS-specific,
188 // extensions, etc.
189 //
Marc De Leenheer49087752014-10-23 13:54:09 -0700190 /** Optical channel signal ID (lambda). */
191 OCH_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800192
Marc De Leenheer49087752014-10-23 13:54:09 -0700193 /** Optical channel signal type (fixed or flexible). */
alshabiba3a476d2015-04-10 14:35:38 -0700194 OCH_SIGTYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800195
Yafit Hadar52d81552015-10-07 12:26:52 +0300196 /** ODU (Optical channel Data Unit) signal ID. */
197 ODU_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800198
Yafit Hadar52d81552015-10-07 12:26:52 +0300199 /** ODU (Optical channel Data Unit) signal type. */
200 ODU_SIGTYPE,
alshabiba3a476d2015-04-10 14:35:38 -0700201
Jonathan Hart26a8d952015-12-02 15:16:35 -0800202 /** Extension criterion. */
203 EXTENSION,
204
Jian Li79bdf3c2015-11-30 14:54:54 -0800205 /** An empty criterion. */
alshabiba3a476d2015-04-10 14:35:38 -0700206 DUMMY
tom8bb16062014-09-12 14:47:46 -0700207 }
208
alshabib7b795492014-09-16 14:38:39 -0700209 /**
210 * Returns the type of criterion.
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800211 *
alshabib7b795492014-09-16 14:38:39 -0700212 * @return type of criterion
213 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700214 Type type();
alshabib7b795492014-09-16 14:38:39 -0700215
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800216 /**
217 * Bit definitions for IPv6 Extension Header pseudo-field.
218 * From page 79 of OpenFlow 1.5.0 spec.
219 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700220 enum IPv6ExthdrFlags {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800221 /** "No next header" encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800222 NONEXT((short) (1 << 0)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800223 /** Encrypted Sec Payload header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800224 ESP((short) (1 << 1)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800225 /** Authentication header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800226 AUTH((short) (1 << 2)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800227 /** 1 or 2 dest headers present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800228 DEST((short) (1 << 3)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800229 /** Fragment header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800230 FRAG((short) (1 << 4)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800231 /** Router header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800232 ROUTER((short) (1 << 5)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800233 /** Hop-by-hop header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800234 HOP((short) (1 << 6)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800235 /** Unexpected repeats encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800236 UNREP((short) (1 << 7)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800237 /** Unexpected sequencing encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800238 UNSEQ((short) (1 << 8));
tom8bb16062014-09-12 14:47:46 -0700239
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800240 private short value;
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800241
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800242 IPv6ExthdrFlags(short value) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800243 this.value = value;
244 }
245
246 /**
247 * Gets the value as an integer.
248 *
249 * @return the value as an integer
250 */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800251 public short getValue() {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800252 return this.value;
253 }
254 }
Jian Li79bdf3c2015-11-30 14:54:54 -0800255
Jonathan Hart51539b82015-10-29 09:53:04 -0700256 enum TcpFlags {
Jian Li79bdf3c2015-11-30 14:54:54 -0800257
258 /** ECN-nonce concealment protection. */
259 NS((short) (1 << 0)),
260 /** Congestion Window Reduced. */
261 CWR((short) (1 << 1)),
262 /** ECN-Echo. **/
263 ECE((short) (1 << 2)),
264 /** Urgent pointer field is significant. */
265 URG((short) (1 << 3)),
266 /** Acknowledgment field is significant. */
267 ACK((short) (1 << 4)),
268 /** Push the buffered data to the receiving application. */
269 PSH((short) (1 << 5)),
270 /** Reset the connection. */
271 RST((short) (1 << 6)),
272 /** Synchronize sequence numbers. */
273 SYN((short) (1 << 7)),
274 /** No more data from sender. */
275 FIN((short) (1 << 8));
276
277 private short value;
278
Jonathan Hart51539b82015-10-29 09:53:04 -0700279 TcpFlags(short value) {
Jian Li79bdf3c2015-11-30 14:54:54 -0800280 this.value = value;
281 }
282
283 /**
284 * Gets the value as an integer.
285 *
286 * @return the value as an integer
287 */
288 public short getValue() {
289 return this.value;
290 }
291 }
tom8bb16062014-09-12 14:47:46 -0700292}