blob: e6b4939114ae30dc3f57c4164d81837b00271e64 [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
alshabibfa0dc662016-01-13 11:23:53 -080053 /**
54 * Inner VLAN id.
55 *
56 * Note: Some drivers may not support this.
57 */
58 INNER_VLAN_VID,
59
60 /**
61 * Inner VLAN pcp.
62 *
63 * Note: Some drivers may not support this.
64 */
65 INNER_VLAN_PCP,
66
tom8bb16062014-09-12 14:47:46 -070067 /** IP DSCP (6 bits in ToS field). */
68 IP_DSCP,
Jian Li79bdf3c2015-11-30 14:54:54 -080069
tom8bb16062014-09-12 14:47:46 -070070 /** IP ECN (2 bits in ToS field). */
71 IP_ECN,
Jian Li79bdf3c2015-11-30 14:54:54 -080072
tom8bb16062014-09-12 14:47:46 -070073 /** IP protocol. */
74 IP_PROTO,
Jian Li79bdf3c2015-11-30 14:54:54 -080075
tom8bb16062014-09-12 14:47:46 -070076 /** IPv4 source address. */
77 IPV4_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080078
tom8bb16062014-09-12 14:47:46 -070079 /** IPv4 destination address. */
80 IPV4_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080081
tom8bb16062014-09-12 14:47:46 -070082 /** TCP source port. */
83 TCP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080084
tom8bb16062014-09-12 14:47:46 -070085 /** TCP destination port. */
86 TCP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080087
tom8bb16062014-09-12 14:47:46 -070088 /** UDP source port. */
89 UDP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080090
tom8bb16062014-09-12 14:47:46 -070091 /** UDP destination port. */
92 UDP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080093
tom8bb16062014-09-12 14:47:46 -070094 /** SCTP source port. */
95 SCTP_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -080096
tom8bb16062014-09-12 14:47:46 -070097 /** SCTP destination port. */
98 SCTP_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -080099
tom8bb16062014-09-12 14:47:46 -0700100 /** ICMP type. */
101 ICMPV4_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800102
tom8bb16062014-09-12 14:47:46 -0700103 /** ICMP code. */
104 ICMPV4_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800105
tom8bb16062014-09-12 14:47:46 -0700106 /** ARP opcode. */
107 ARP_OP,
Jian Li79bdf3c2015-11-30 14:54:54 -0800108
tom8bb16062014-09-12 14:47:46 -0700109 /** ARP source IPv4 address. */
110 ARP_SPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800111
tom8bb16062014-09-12 14:47:46 -0700112 /** ARP target IPv4 address. */
113 ARP_TPA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800114
tom8bb16062014-09-12 14:47:46 -0700115 /** ARP source hardware address. */
116 ARP_SHA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800117
tom8bb16062014-09-12 14:47:46 -0700118 /** ARP target hardware address. */
119 ARP_THA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800120
tom8bb16062014-09-12 14:47:46 -0700121 /** IPv6 source address. */
122 IPV6_SRC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800123
tom8bb16062014-09-12 14:47:46 -0700124 /** IPv6 destination address. */
125 IPV6_DST,
Jian Li79bdf3c2015-11-30 14:54:54 -0800126
tom8bb16062014-09-12 14:47:46 -0700127 /** IPv6 Flow Label. */
128 IPV6_FLABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800129
tom8bb16062014-09-12 14:47:46 -0700130 /** ICMPv6 type. */
131 ICMPV6_TYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800132
tom8bb16062014-09-12 14:47:46 -0700133 /** ICMPv6 code. */
134 ICMPV6_CODE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800135
tom8bb16062014-09-12 14:47:46 -0700136 /** Target address for ND. */
137 IPV6_ND_TARGET,
Jian Li79bdf3c2015-11-30 14:54:54 -0800138
tom8bb16062014-09-12 14:47:46 -0700139 /** Source link-layer for ND. */
140 IPV6_ND_SLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800141
tom8bb16062014-09-12 14:47:46 -0700142 /** Target link-layer for ND. */
143 IPV6_ND_TLL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800144
tom8bb16062014-09-12 14:47:46 -0700145 /** MPLS label. */
146 MPLS_LABEL,
Jian Li79bdf3c2015-11-30 14:54:54 -0800147
tom8bb16062014-09-12 14:47:46 -0700148 /** MPLS TC. */
149 MPLS_TC,
Jian Li79bdf3c2015-11-30 14:54:54 -0800150
151 /** MPLS BoS bit. */
tom8bb16062014-09-12 14:47:46 -0700152 MPLS_BOS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800153
tom8bb16062014-09-12 14:47:46 -0700154 /** PBB I-SID. */
155 PBB_ISID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800156
tom8bb16062014-09-12 14:47:46 -0700157 /** Logical Port Metadata. */
158 TUNNEL_ID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800159
tom8bb16062014-09-12 14:47:46 -0700160 /** IPv6 Extension Header pseudo-field. */
Marc De Leenheer49087752014-10-23 13:54:09 -0700161 IPV6_EXTHDR,
Jian Li79bdf3c2015-11-30 14:54:54 -0800162
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800163 /** Unassigned value: 40. */
164 UNASSIGNED_40,
Jian Li79bdf3c2015-11-30 14:54:54 -0800165
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800166 /** PBB UCA header field. */
167 PBB_UCA,
Jian Li79bdf3c2015-11-30 14:54:54 -0800168
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800169 /** TCP flags. */
170 TCP_FLAGS,
Jian Li79bdf3c2015-11-30 14:54:54 -0800171
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800172 /** Output port from action set metadata. */
173 ACTSET_OUTPUT,
Jian Li79bdf3c2015-11-30 14:54:54 -0800174
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800175 /** Packet type value. */
176 PACKET_TYPE,
177
178 //
179 // NOTE: Everything below is defined elsewhere: ONOS-specific,
180 // extensions, etc.
181 //
Marc De Leenheer49087752014-10-23 13:54:09 -0700182 /** Optical channel signal ID (lambda). */
183 OCH_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800184
Marc De Leenheer49087752014-10-23 13:54:09 -0700185 /** Optical channel signal type (fixed or flexible). */
alshabiba3a476d2015-04-10 14:35:38 -0700186 OCH_SIGTYPE,
Jian Li79bdf3c2015-11-30 14:54:54 -0800187
Yafit Hadar52d81552015-10-07 12:26:52 +0300188 /** ODU (Optical channel Data Unit) signal ID. */
189 ODU_SIGID,
Jian Li79bdf3c2015-11-30 14:54:54 -0800190
Yafit Hadar52d81552015-10-07 12:26:52 +0300191 /** ODU (Optical channel Data Unit) signal type. */
192 ODU_SIGTYPE,
alshabiba3a476d2015-04-10 14:35:38 -0700193
Jonathan Hart26a8d952015-12-02 15:16:35 -0800194 /** Extension criterion. */
195 EXTENSION,
196
Jian Li79bdf3c2015-11-30 14:54:54 -0800197 /** An empty criterion. */
alshabiba3a476d2015-04-10 14:35:38 -0700198 DUMMY
tom8bb16062014-09-12 14:47:46 -0700199 }
200
alshabib7b795492014-09-16 14:38:39 -0700201 /**
202 * Returns the type of criterion.
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800203 *
alshabib7b795492014-09-16 14:38:39 -0700204 * @return type of criterion
205 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700206 Type type();
alshabib7b795492014-09-16 14:38:39 -0700207
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800208 /**
209 * Bit definitions for IPv6 Extension Header pseudo-field.
210 * From page 79 of OpenFlow 1.5.0 spec.
211 */
Sho SHIMIZU3310a342015-05-13 12:14:05 -0700212 enum IPv6ExthdrFlags {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800213 /** "No next header" encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800214 NONEXT((short) (1 << 0)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800215 /** Encrypted Sec Payload header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800216 ESP((short) (1 << 1)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800217 /** Authentication header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800218 AUTH((short) (1 << 2)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800219 /** 1 or 2 dest headers present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800220 DEST((short) (1 << 3)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800221 /** Fragment header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800222 FRAG((short) (1 << 4)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800223 /** Router header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800224 ROUTER((short) (1 << 5)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800225 /** Hop-by-hop header present. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800226 HOP((short) (1 << 6)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800227 /** Unexpected repeats encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800228 UNREP((short) (1 << 7)),
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800229 /** Unexpected sequencing encountered. */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800230 UNSEQ((short) (1 << 8));
tom8bb16062014-09-12 14:47:46 -0700231
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800232 private short value;
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800233
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800234 IPv6ExthdrFlags(short value) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800235 this.value = value;
236 }
237
238 /**
239 * Gets the value as an integer.
240 *
241 * @return the value as an integer
242 */
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800243 public short getValue() {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800244 return this.value;
245 }
246 }
Jian Li79bdf3c2015-11-30 14:54:54 -0800247
248 enum TCPFlags {
249
250 /** ECN-nonce concealment protection. */
251 NS((short) (1 << 0)),
252 /** Congestion Window Reduced. */
253 CWR((short) (1 << 1)),
254 /** ECN-Echo. **/
255 ECE((short) (1 << 2)),
256 /** Urgent pointer field is significant. */
257 URG((short) (1 << 3)),
258 /** Acknowledgment field is significant. */
259 ACK((short) (1 << 4)),
260 /** Push the buffered data to the receiving application. */
261 PSH((short) (1 << 5)),
262 /** Reset the connection. */
263 RST((short) (1 << 6)),
264 /** Synchronize sequence numbers. */
265 SYN((short) (1 << 7)),
266 /** No more data from sender. */
267 FIN((short) (1 << 8));
268
269 private short value;
270
271 TCPFlags(short value) {
272 this.value = value;
273 }
274
275 /**
276 * Gets the value as an integer.
277 *
278 * @return the value as an integer
279 */
280 public short getValue() {
281 return this.value;
282 }
283 }
tom8bb16062014-09-12 14:47:46 -0700284}