blob: 5b2cfccdc56e241cf4fbb3be7b23dceb136d52e4 [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
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
tom8bb16062014-09-12 14:47:46 -070043 /** Ethernet source address. */
44 ETH_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080045
tom8bb16062014-09-12 14:47:46 -070046 /** Ethernet frame type. */
47 ETH_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -080048
tom8bb16062014-09-12 14:47:46 -070049 /** VLAN id. */
50 VLAN_VID,
Jian Li79bdf3c2015-11-30 14:54:54 -080051
tom8bb16062014-09-12 14:47:46 -070052 /** VLAN priority. */
53 VLAN_PCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080054
alshabibfa0dc662016-01-13 11:23:53 -080055 /**
56 * Inner VLAN id.
57 *
58 * Note: Some drivers may not support this.
59 */
60 INNER_VLAN_VID,
61
62 /**
63 * Inner VLAN pcp.
64 *
65 * Note: Some drivers may not support this.
66 */
67 INNER_VLAN_PCP,
68
tom8bb16062014-09-12 14:47:46 -070069 /** IP DSCP (6 bits in ToS field). */
70 IP_DSCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080071
tom8bb16062014-09-12 14:47:46 -070072 /** IP ECN (2 bits in ToS field). */
73 IP_ECN,
Jian Li79bdf3c2015-11-30 14:54:54 -080074
tom8bb16062014-09-12 14:47:46 -070075 /** IP protocol. */
76 IP_PROTO,
Jian Li79bdf3c2015-11-30 14:54:54 -080077
tom8bb16062014-09-12 14:47:46 -070078 /** IPv4 source address. */
79 IPV4_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080080
tom8bb16062014-09-12 14:47:46 -070081 /** IPv4 destination address. */
82 IPV4_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080083
tom8bb16062014-09-12 14:47:46 -070084 /** TCP source port. */
85 TCP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080086
tom8bb16062014-09-12 14:47:46 -070087 /** TCP destination port. */
88 TCP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080089
tom8bb16062014-09-12 14:47:46 -070090 /** UDP source port. */
91 UDP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080092
tom8bb16062014-09-12 14:47:46 -070093 /** UDP destination port. */
94 UDP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080095
tom8bb16062014-09-12 14:47:46 -070096 /** SCTP source port. */
97 SCTP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080098
tom8bb16062014-09-12 14:47:46 -070099 /** SCTP destination port. */
100 SCTP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800101
tom8bb16062014-09-12 14:47:46 -0700102 /** ICMP type. */
103 ICMPV4_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800104
tom8bb16062014-09-12 14:47:46 -0700105 /** ICMP code. */
106 ICMPV4_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800107
tom8bb16062014-09-12 14:47:46 -0700108 /** ARP opcode. */
109 ARP_OP,
Jian Li79bdf3c2015-11-30 14:54:54 -0800110
tom8bb16062014-09-12 14:47:46 -0700111 /** ARP source IPv4 address. */
112 ARP_SPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800113
tom8bb16062014-09-12 14:47:46 -0700114 /** ARP target IPv4 address. */
115 ARP_TPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800116
tom8bb16062014-09-12 14:47:46 -0700117 /** ARP source hardware address. */
118 ARP_SHA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800119
tom8bb16062014-09-12 14:47:46 -0700120 /** ARP target hardware address. */
121 ARP_THA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800122
tom8bb16062014-09-12 14:47:46 -0700123 /** IPv6 source address. */
124 IPV6_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800125
tom8bb16062014-09-12 14:47:46 -0700126 /** IPv6 destination address. */
127 IPV6_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800128
tom8bb16062014-09-12 14:47:46 -0700129 /** IPv6 Flow Label. */
130 IPV6_FLABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800131
tom8bb16062014-09-12 14:47:46 -0700132 /** ICMPv6 type. */
133 ICMPV6_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800134
tom8bb16062014-09-12 14:47:46 -0700135 /** ICMPv6 code. */
136 ICMPV6_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800137
tom8bb16062014-09-12 14:47:46 -0700138 /** Target address for ND. */
139 IPV6_ND_TARGET,
Jian Li79bdf3c2015-11-30 14:54:54 -0800140
tom8bb16062014-09-12 14:47:46 -0700141 /** Source link-layer for ND. */
142 IPV6_ND_SLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800143
tom8bb16062014-09-12 14:47:46 -0700144 /** Target link-layer for ND. */
145 IPV6_ND_TLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800146
tom8bb16062014-09-12 14:47:46 -0700147 /** MPLS label. */
148 MPLS_LABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800149
tom8bb16062014-09-12 14:47:46 -0700150 /** MPLS TC. */
151 MPLS_TC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800152
153 /** MPLS BoS bit. */
tom8bb16062014-09-12 14:47:46 -0700154 MPLS_BOS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800155
tom8bb16062014-09-12 14:47:46 -0700156 /** PBB I-SID. */
157 PBB_ISID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800158
tom8bb16062014-09-12 14:47:46 -0700159 /** Logical Port Metadata. */
160 TUNNEL_ID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800161
tom8bb16062014-09-12 14:47:46 -0700162 /** IPv6 Extension Header pseudo-field. */
Marc De Leenheer49087752014-10-23 13:54:09 -0700163 IPV6_EXTHDR,
Jian Li79bdf3c2015-11-30 14:54:54 -0800164
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800165 /** Unassigned value: 40. */
166 UNASSIGNED_40,
Jian Li79bdf3c2015-11-30 14:54:54 -0800167
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800168 /** PBB UCA header field. */
169 PBB_UCA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800170
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800171 /** TCP flags. */
172 TCP_FLAGS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800173
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800174 /** Output port from action set metadata. */
175 ACTSET_OUTPUT,
Jian Li79bdf3c2015-11-30 14:54:54 -0800176
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800177 /** Packet type value. */
178 PACKET_TYPE,
179
180 //
181 // NOTE: Everything below is defined elsewhere: ONOS-specific,
182 // extensions, etc.
183 //
Marc De Leenheer49087752014-10-23 13:54:09 -0700184 /** Optical channel signal ID (lambda). */
185 OCH_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800186
Marc De Leenheer49087752014-10-23 13:54:09 -0700187 /** Optical channel signal type (fixed or flexible). */
alshabiba3a476d2015-04-10 14:35:38 -0700188 OCH_SIGTYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800189
Yafit Hadar52d81552015-10-07 12:26:52 +0300190 /** ODU (Optical channel Data Unit) signal ID. */
191 ODU_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800192
Yafit Hadar52d81552015-10-07 12:26:52 +0300193 /** ODU (Optical channel Data Unit) signal type. */
194 ODU_SIGTYPE,
alshabiba3a476d2015-04-10 14:35:38 -0700195
Jonathan Hart26a8d952015-12-02 15:16:35 -0800196 /** Extension criterion. */
197 EXTENSION,
198
Jian Li79bdf3c2015-11-30 14:54:54 -0800199 /** An empty criterion. */
alshabiba3a476d2015-04-10 14:35:38 -0700200 DUMMY
tom8bb16062014-09-12 14:47:46 -0700201 }
202
alshabib7b795492014-09-16 14:38:39 -0700203 /**
204 * Returns the type of criterion.
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800205 *
alshabib7b795492014-09-16 14:38:39 -0700206 * @return type of criterion
207 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700208 Type type();
alshabib7b795492014-09-16 14:38:39 -0700209
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800210 /**
211 * Bit definitions for IPv6 Extension Header pseudo-field.
212 * From page 79 of OpenFlow 1.5.0 spec.
213 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700214 enum IPv6ExthdrFlags {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800215 /** "No next header" encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800216 NONEXT((short) (1 << 0)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800217 /** Encrypted Sec Payload header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800218 ESP((short) (1 << 1)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800219 /** Authentication header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800220 AUTH((short) (1 << 2)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800221 /** 1 or 2 dest headers present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800222 DEST((short) (1 << 3)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800223 /** Fragment header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800224 FRAG((short) (1 << 4)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800225 /** Router header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800226 ROUTER((short) (1 << 5)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800227 /** Hop-by-hop header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800228 HOP((short) (1 << 6)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800229 /** Unexpected repeats encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800230 UNREP((short) (1 << 7)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800231 /** Unexpected sequencing encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800232 UNSEQ((short) (1 << 8));
tom8bb16062014-09-12 14:47:46 -0700233
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800234 private short value;
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800235
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800236 IPv6ExthdrFlags(short value) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800237 this.value = value;
238 }
239
240 /**
241 * Gets the value as an integer.
242 *
243 * @return the value as an integer
244 */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800245 public short getValue() {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800246 return this.value;
247 }
248 }
Jian Li79bdf3c2015-11-30 14:54:54 -0800249
Jonathan Hart51539b82015-10-29 09:53:04 -0700250 enum TcpFlags {
Jian Li79bdf3c2015-11-30 14:54:54 -0800251
252 /** ECN-nonce concealment protection. */
253 NS((short) (1 << 0)),
254 /** Congestion Window Reduced. */
255 CWR((short) (1 << 1)),
256 /** ECN-Echo. **/
257 ECE((short) (1 << 2)),
258 /** Urgent pointer field is significant. */
259 URG((short) (1 << 3)),
260 /** Acknowledgment field is significant. */
261 ACK((short) (1 << 4)),
262 /** Push the buffered data to the receiving application. */
263 PSH((short) (1 << 5)),
264 /** Reset the connection. */
265 RST((short) (1 << 6)),
266 /** Synchronize sequence numbers. */
267 SYN((short) (1 << 7)),
268 /** No more data from sender. */
269 FIN((short) (1 << 8));
270
271 private short value;
272
Jonathan Hart51539b82015-10-29 09:53:04 -0700273 TcpFlags(short value) {
Jian Li79bdf3c2015-11-30 14:54:54 -0800274 this.value = value;
275 }
276
277 /**
278 * Gets the value as an integer.
279 *
280 * @return the value as an integer
281 */
282 public short getValue() {
283 return this.value;
284 }
285 }
tom8bb16062014-09-12 14:47:46 -0700286}