]>
Commit | Line | Data |
---|---|---|
6a885fd0 | 1 | /* |
d3cb080e | 2 | * Copyright (c) 2011, 2012, 2013, 2014, 2015 Nicira, Inc. |
6a885fd0 BP |
3 | * |
4 | * 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: | |
7 | * | |
8 | * 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. | |
15 | */ | |
16 | ||
17 | #ifndef META_FLOW_H | |
18 | #define META_FLOW_H 1 | |
19 | ||
6ca00f6f ETN |
20 | #include <sys/types.h> |
21 | #include <netinet/in.h> | |
6a885fd0 | 22 | #include <netinet/ip6.h> |
abadfcb0 | 23 | #include "bitmap.h" |
6a885fd0 | 24 | #include "flow.h" |
816fd533 | 25 | #include "ofp-errors.h" |
6a885fd0 | 26 | #include "packets.h" |
7f98c44d | 27 | #include "util.h" |
6a885fd0 | 28 | |
6a885fd0 | 29 | struct ds; |
81a76618 | 30 | struct match; |
6a885fd0 | 31 | |
a4ce8b25 BP |
32 | /* Open vSwitch fields |
33 | * =================== | |
34 | * | |
35 | * A "field" is a property of a packet. Most familiarly, "data fields" are | |
36 | * fields that can be extracted from a packet. | |
37 | * | |
38 | * Some data fields are always present as a consequence of the basic networking | |
39 | * technology in use. Ethernet is the assumed base technology for current | |
40 | * versions of OpenFlow and Open vSwitch, so Ethernet header fields are always | |
41 | * available. | |
42 | * | |
43 | * Other data fields are not always present. A packet contains ARP fields, for | |
44 | * example, only when its Ethernet header indicates the Ethertype for ARP, | |
45 | * 0x0806. We say that a field is "applicable" when it is it present in a | |
46 | * packet, and "inapplicable" when it is not, and refer to the conditions that | |
47 | * determine whether a field is applicable as "prerequisites". Some | |
48 | * VLAN-related fields are a special case: these fields are always applicable, | |
49 | * but have a designated value or bit that indicates whether a VLAN header is | |
50 | * present, with the remaining values or bits indicating the VLAN header's | |
51 | * content (if it is present). See MFF_VLAN_TCI for an example. | |
52 | * | |
53 | * Conceptually, an inapplicable field does not have a value, not even a | |
54 | * nominal ``value'' such as all-zero-bits. In many circumstances, OpenFlow | |
55 | * and Open vSwitch allow references only to applicable fields. For example, | |
56 | * one may match a given field only if the match includes the field's | |
57 | * prerequisite, e.g. matching an ARP field is only allowed if one also matches | |
58 | * on Ethertype 0x0806. | |
59 | * | |
60 | * (Practically, however, OVS represents a field's value as some fixed member | |
61 | * in its "struct flow", so accessing that member will obtain some value. Some | |
62 | * members are used for more than one purpose, e.g. the "tp_src" member | |
63 | * represents the TCP, UDP, and SCTP source port, so the value read may not | |
64 | * even make sense. For this reason, it is important to know whether a field's | |
65 | * prerequisites are satisfied before attempting to read it.) | |
66 | * | |
67 | * Sometimes a packet may contain multiple instances of a header. For example, | |
68 | * a packet may contain multiple VLAN or MPLS headers, and tunnels can cause | |
69 | * any data field to recur. OpenFlow and Open vSwitch do not address these | |
70 | * cases uniformly. For VLAN and MPLS headers, only the outermost header is | |
71 | * accessible, so that inner headers may be accessed only by ``popping'' | |
72 | * (removing) the outer header. (Open vSwitch supports only a single VLAN | |
73 | * header in any case.) For tunnels, e.g. GRE or VXLAN, the outer header and | |
74 | * inner headers are treated as different data fields. | |
75 | * | |
76 | * OpenFlow and Open vSwitch support some fields other than data fields. | |
77 | * "Metadata fields" relate to the origin or treatment of a packet, but they | |
78 | * are not extracted from the packet data itself. One example is the physical | |
79 | * port on which a packet arrived at the switch. "Register fields" act like | |
80 | * variables: they give an OpenFlow switch space for temporary storage while | |
81 | * processing a packet. Existing metadata and register fields have no | |
82 | * prerequisites. | |
83 | * | |
84 | * A field's value consists of an integral number of bytes. Most data fields | |
85 | * are copied directly from protocol headers, e.g. at layer 2, MFF_ETH_SRC is | |
86 | * copied from the Ethernet source address and MFF_ETH_DST from the destination | |
87 | * address. Other data fields are copied from a packet with padding, usually | |
88 | * with zeros and in the most significant positions (see e.g. MFF_MPLS_LABEL) | |
89 | * but not always (see e.g. MFF_IP_DSCP). A final category of data fields is | |
90 | * transformed in other ways as they are copied from the packets, to make them | |
91 | * more useful for matching, e.g. MFF_IP_FRAG describes whether a packet is a | |
92 | * fragment but it is not copied directly from the IP header. | |
93 | * | |
94 | * | |
95 | * Field specifications | |
96 | * ==================== | |
97 | * | |
98 | * Each of the enumeration values below represents a field. The comments | |
99 | * preceding each enum must be in a stylized form that is parsed at compile | |
100 | * time by the extract-ofp-fields program. The comment itself consists of a | |
101 | * series of paragraphs separate by blank lines. The paragraphs consist of: | |
102 | * | |
103 | * - The first paragraph gives the user-visible name of the field as a | |
104 | * quoted string. This is the name used for parsing and formatting the | |
105 | * field. | |
106 | * | |
107 | * For historical reasons, some fields have an additional name that is | |
108 | * accepted as an alternative in parsing. This name, when there is one, | |
109 | * is given as a quoted string in parentheses along with "aka". For | |
110 | * example: | |
111 | * | |
112 | * "tun_id" (aka "tunnel_id"). | |
113 | * | |
114 | * New fields should have only one name. | |
115 | * | |
116 | * - Any number of paragraphs of free text that describe the field. This | |
117 | * is meant for human readers, so extract-ofp-fields ignores it. | |
118 | * | |
119 | * - A final paragraph that consists of a series of key-value pairs, one | |
120 | * per line, in the form "key: value." where the period at the end of the | |
121 | * line is a mandatory part of the syntax. | |
122 | * | |
123 | * Every field must specify the following key-value pairs: | |
124 | * | |
125 | * Type: | |
126 | * | |
127 | * The format and size of the field's value. Some possible values are | |
128 | * generic: | |
129 | * | |
130 | * u8: A one-byte field. | |
131 | * be16: A two-byte field. | |
132 | * be32: A four-byte field. | |
133 | * be64: An eight-byte field. | |
134 | * | |
135 | * The remaining values imply more about the value's semantics, though OVS | |
136 | * does not currently take advantage of this additional information: | |
137 | * | |
138 | * MAC: A six-byte field whose value is an Ethernet address. | |
139 | * IPv6: A 16-byte field whose value is an IPv6 address. | |
140 | * | |
141 | * Maskable: | |
142 | * | |
143 | * Either "bitwise", if OVS supports matching any subset of bits in the | |
144 | * field, or "no", if OVS only supports matching or wildcarding the entire | |
145 | * field. | |
146 | * | |
147 | * Formatting: | |
148 | * | |
149 | * Explains how a field's value is formatted and parsed for human | |
150 | * consumption. Some of the options are fairly generally useful: | |
151 | * | |
152 | * decimal: Formats the value as a decimal number. On parsing, accepts | |
153 | * decimal (with no prefix), hexadecimal with 0x prefix, or octal | |
154 | * with 0 prefix. | |
155 | * | |
156 | * hexadecimal: Same as decimal except nonzero values are formatted in | |
157 | * hex with 0x prefix. The default for parsing is *not* hexadecimal: | |
158 | * only with a 0x prefix is the input in hexadecimal. | |
159 | * | |
160 | * Ethernet: Formats and accepts the common format xx:xx:xx:xx:xx:xx. | |
161 | * 6-byte fields only. | |
162 | * | |
163 | * IPv4: Formats and accepts the common format w.x.y.z. 4-byte fields | |
164 | * only. | |
165 | * | |
166 | * IPv6: Formats and accepts the common IPv6 formats. 16-byte fields | |
167 | * only. | |
168 | * | |
169 | * OpenFlow 1.0 port: Accepts an OpenFlow well-known port name | |
170 | * (e.g. "IN_PORT") in uppercase or lowercase, or a 16-bit port | |
171 | * number in decimal. Formats ports using their well-known names in | |
172 | * uppercase, or in decimal otherwise. 2-byte fields only. | |
173 | * | |
174 | * OpenFlow 1.1+ port: Same syntax as for OpenFlow 1.0 ports but for | |
175 | * 4-byte OpenFlow 1.1+ port number fields. | |
176 | * | |
177 | * Others are very specific to particular fields: | |
178 | * | |
179 | * frag: One of the strings "no", "first", "later", "yes", "not_later" | |
180 | * describing which IPv4/v6 fragments are matched. | |
181 | * | |
182 | * tunnel flags: Any number of the strings "df", "csum", "key", or | |
183 | * "oam" separated by "|". | |
184 | * | |
185 | * TCP flags: See the description of tcp_flags in ovs-ofctl(8). | |
186 | * | |
187 | * Prerequisites: | |
188 | * | |
189 | * The field's prerequisites. The values should be straightfoward. | |
190 | * | |
191 | * Access: | |
192 | * | |
193 | * Either "read-only", for a field that cannot be changed via OpenFlow, or | |
194 | * "read/write" for a modifiable field. | |
195 | * | |
196 | * NXM: | |
197 | * | |
198 | * If the field has an NXM field assignment, then this specifies the NXM | |
199 | * name of the field (e.g. "NXM_OF_ETH_SRC"), followed by its nxm_type in | |
200 | * parentheses, followed by "since v<x>.<y>" specifying the version of Open | |
201 | * vSwitch that first supported this field in NXM (e.g. "since v1.1" if it | |
202 | * was introduced in Open vSwitch 1.1). | |
203 | * | |
204 | * The NXM name must begin with NXM_OF_ or NXM_NX_. This allows OVS to | |
205 | * determine the correct NXM class. | |
206 | * | |
207 | * If the field does not have an NXM field assignment, specify "none". | |
208 | * | |
209 | * OXM: | |
210 | * | |
211 | * If the field has an OXM field assignment, then this specifies the OXM | |
212 | * name of the field (e.g. "OXM_OF_ETH_SRC"), followed by its nxm_type in | |
213 | * parentheses, followed by "since OF<a>.<b> v<x>.<y>" specifying the | |
214 | * versions of OpenFlow and Open vSwitch that first supported this field in | |
215 | * OXM (e.g. "since OF1.3 and v1.10" if it was introduced in OpenFlow 1.3 | |
216 | * and first supported by Open vSwitch in version 1.10). | |
217 | * | |
e6556fe3 BP |
218 | * Some fields have more than one OXM field assignment. For example, |
219 | * actset_output has an experimenter OXM assignment in OpenFlow 1.3 and a | |
220 | * standard OXM assignment in OpenFlow 1.5. In such a case, specify both, | |
221 | * separated by commas. | |
222 | * | |
a4ce8b25 BP |
223 | * OVS uses the start of the OXM field name to determine the correct OXM |
224 | * class. To support a new OXM class, edit the mapping table in | |
225 | * build-aux/extract-ofp-fields. | |
226 | * | |
227 | * If the field does not have an OXM field assignment, specify "none". | |
228 | * | |
229 | * The following key-value pairs are optional. Open vSwitch already supports | |
230 | * all the fields to which they apply, so new fields should probably not | |
231 | * include these pairs: | |
232 | * | |
233 | * OF1.0: | |
234 | * | |
235 | * Specify this as "exact match" if OpenFlow 1.0 can match or wildcard the | |
236 | * entire field, or as "CIDR mask" if OpenFlow 1.0 can match any CIDR | |
237 | * prefix of the field. (OpenFlow 1.0 did not support bitwise matching.) | |
238 | * Omit, if OpenFlow 1.0 did not support this field. | |
239 | * | |
240 | * OF1.1: | |
241 | * | |
242 | * Specify this as "exact match" if OpenFlow 1.1 can match or wildcard the | |
243 | * entire field, or as "bitwise" if OpenFlow 1.1 can match any subset of | |
244 | * bits in the field. Omit, if OpenFlow 1.1 did not support this field. | |
245 | * | |
246 | * The following key-value pair is optional: | |
247 | * | |
248 | * Prefix lookup member: | |
249 | * | |
250 | * If this field makes sense for use with classifier_set_prefix_fields(), | |
251 | * specify the name of the "struct flow" member that corresponds to the | |
252 | * field. | |
253 | * | |
254 | * Finally, a few "register" fields have very similar names and purposes, | |
255 | * e.g. MFF_REG0 through MFF_REG7. For these, the comments may be merged | |
256 | * together using <N> as a metasyntactic variable for the numeric suffix. | |
257 | * Lines in the comment that are specific to one of the particular fields by | |
258 | * writing, e.g. <1>, to consider that line only for e.g. MFF_REG1. | |
259 | */ | |
260 | ||
7f98c44d | 261 | enum OVS_PACKED_ENUM mf_field_id { |
a4ce8b25 BP |
262 | /* ## -------- ## */ |
263 | /* ## Metadata ## */ | |
264 | /* ## -------- ## */ | |
265 | ||
266 | /* "dp_hash". | |
267 | * | |
268 | * Flow hash computed in the datapath. Internal use only, not programmable | |
269 | * from controller. | |
270 | * | |
508a9338 BP |
271 | * The OXM code point for this is an attempt to test OXM experimenter |
272 | * support, which is otherwise difficult to test due to the dearth of use | |
273 | * out in the wild. Because controllers can't add flows that match on | |
274 | * dp_hash, this doesn't commit OVS to supporting this OXM experimenter | |
275 | * code point in the future. | |
276 | * | |
a4ce8b25 BP |
277 | * Type: be32. |
278 | * Maskable: bitwise. | |
279 | * Formatting: hexadecimal. | |
280 | * Prerequisites: none. | |
281 | * Access: read-only. | |
282 | * NXM: NXM_NX_DP_HASH(35) since v2.2. | |
508a9338 | 283 | * OXM: NXOXM_ET_DP_HASH(0) since OF1.5 and v2.4. |
a4ce8b25 BP |
284 | */ |
285 | MFF_DP_HASH, | |
286 | ||
287 | /* "recirc_id". | |
288 | * | |
289 | * ID for recirculation. The value 0 is reserved for initially received | |
290 | * packets. Internal use only, not programmable from controller. | |
291 | * | |
292 | * Type: be32. | |
293 | * Maskable: no. | |
294 | * Formatting: decimal. | |
295 | * Prerequisites: none. | |
296 | * Access: read-only. | |
297 | * NXM: NXM_NX_RECIRC_ID(36) since v2.2. | |
298 | * OXM: none. | |
299 | */ | |
300 | MFF_RECIRC_ID, | |
301 | ||
18080541 BP |
302 | /* "conj_id". |
303 | * | |
304 | * ID for "conjunction" actions. Please refer to ovs-ofctl(8) | |
305 | * documentation of "conjunction" for details. | |
306 | * | |
307 | * Type: be32. | |
308 | * Maskable: no. | |
309 | * Formatting: decimal. | |
310 | * Prerequisites: none. | |
311 | * Access: read-only. | |
312 | * NXM: NXM_NX_CONJ_ID(37) since v2.4. | |
313 | * OXM: none. */ | |
314 | MFF_CONJ_ID, | |
315 | ||
a4ce8b25 BP |
316 | /* "tun_id" (aka "tunnel_id"). |
317 | * | |
318 | * The "key" or "tunnel ID" or "VNI" in a packet received via a keyed | |
319 | * tunnel. For protocols in which the key is shorter than 64 bits, the key | |
320 | * is stored in the low bits and the high bits are zeroed. For non-keyed | |
321 | * tunnels and packets not received via a tunnel, the value is 0. | |
322 | * | |
323 | * Type: be64. | |
324 | * Maskable: bitwise. | |
325 | * Formatting: hexadecimal. | |
326 | * Prerequisites: none. | |
327 | * Access: read/write. | |
328 | * NXM: NXM_NX_TUN_ID(16) since v1.1. | |
329 | * OXM: OXM_OF_TUNNEL_ID(38) since OF1.3 and v1.10. | |
330 | * Prefix lookup member: tunnel.tun_id. | |
331 | */ | |
332 | MFF_TUN_ID, | |
333 | ||
334 | /* "tun_src". | |
335 | * | |
336 | * The IPv4 source address in the outer IP header of a tunneled packet. | |
337 | * | |
338 | * For non-tunneled packets, the value is 0. | |
339 | * | |
340 | * Type: be32. | |
341 | * Maskable: bitwise. | |
342 | * Formatting: IPv4. | |
343 | * Prerequisites: none. | |
344 | * Access: read/write. | |
345 | * NXM: NXM_NX_TUN_IPV4_SRC(31) since v2.0. | |
346 | * OXM: none. | |
347 | * Prefix lookup member: tunnel.ip_src. | |
348 | */ | |
349 | MFF_TUN_SRC, | |
350 | ||
351 | /* "tun_dst". | |
352 | * | |
353 | * The IPv4 destination address in the outer IP header of a tunneled | |
354 | * packet. | |
355 | * | |
356 | * For non-tunneled packets, the value is 0. | |
357 | * | |
358 | * Type: be32. | |
359 | * Maskable: bitwise. | |
360 | * Formatting: IPv4. | |
361 | * Prerequisites: none. | |
362 | * Access: read/write. | |
363 | * NXM: NXM_NX_TUN_IPV4_DST(32) since v2.0. | |
364 | * OXM: none. | |
365 | * Prefix lookup member: tunnel.ip_dst. | |
366 | */ | |
367 | MFF_TUN_DST, | |
368 | ||
369 | /* "tun_flags". | |
370 | * | |
371 | * Combination of FLOW_TNL_F_* bitmapped flags that indicate properties of | |
372 | * a tunneled packet. Internal use only, not programmable from controller. | |
373 | * | |
374 | * For non-tunneled packets, the value is 0. | |
375 | * | |
376 | * Type: be16. | |
377 | * Maskable: no. | |
378 | * Formatting: tunnel flags. | |
379 | * Prerequisites: none. | |
380 | * Access: read-only. | |
381 | * NXM: none. | |
382 | * OXM: none. | |
383 | */ | |
384 | MFF_TUN_FLAGS, | |
385 | ||
386 | /* "tun_ttl". | |
387 | * | |
388 | * The TTL in the outer IP header of a tunneled packet. Internal use only, | |
389 | * not programmable from controller. | |
390 | * | |
391 | * For non-tunneled packets, the value is 0. | |
392 | * | |
393 | * Type: u8. | |
394 | * Maskable: no. | |
395 | * Formatting: decimal. | |
396 | * Prerequisites: none. | |
397 | * Access: read-only. | |
398 | * NXM: none. | |
399 | * OXM: none. | |
400 | */ | |
401 | MFF_TUN_TTL, | |
402 | ||
403 | /* "tun_tos". | |
404 | * | |
405 | * The ToS value in the outer IP header of a tunneled packet. Internal use | |
406 | * only, not programmable from controller. | |
407 | * | |
408 | * Type: u8. | |
409 | * Maskable: no. | |
410 | * Formatting: decimal. | |
411 | * Prerequisites: none. | |
412 | * Access: read-only. | |
413 | * NXM: none. | |
414 | * OXM: none. | |
415 | */ | |
416 | MFF_TUN_TOS, | |
417 | ||
ac6073e3 MC |
418 | /* "tun_gbp_id". |
419 | * | |
420 | * VXLAN Group Policy ID | |
421 | * | |
422 | * Type: be16. | |
423 | * Maskable: bitwise. | |
424 | * Formatting: decimal. | |
425 | * Prerequisites: none. | |
426 | * Access: read/write. | |
427 | * NXM: NXM_NX_TUN_GBP_ID(38) since v2.4. | |
428 | * OXM: none. | |
429 | */ | |
430 | MFF_TUN_GBP_ID, | |
431 | ||
432 | /* "tun_gbp_flags". | |
433 | * | |
434 | * VXLAN Group Policy flags | |
435 | * | |
436 | * Type: u8. | |
437 | * Maskable: bitwise. | |
438 | * Formatting: hexadecimal. | |
439 | * Prerequisites: none. | |
440 | * Access: read/write. | |
441 | * NXM: NXM_NX_TUN_GBP_FLAGS(39) since v2.4. | |
442 | * OXM: none. | |
443 | */ | |
444 | MFF_TUN_GBP_FLAGS, | |
445 | ||
a4ce8b25 BP |
446 | /* "metadata". |
447 | * | |
448 | * A scratch pad value standardized in OpenFlow 1.1+. Initially zero, at | |
449 | * the beginning of the pipeline. | |
450 | * | |
451 | * Type: be64. | |
452 | * Maskable: bitwise. | |
453 | * Formatting: hexadecimal. | |
454 | * Prerequisites: none. | |
455 | * Access: read/write. | |
456 | * NXM: none. | |
457 | * OXM: OXM_OF_METADATA(2) since OF1.2 and v1.8. | |
458 | * OF1.1: bitwise mask. | |
459 | */ | |
460 | MFF_METADATA, | |
461 | ||
462 | /* "in_port". | |
463 | * | |
464 | * 16-bit (OpenFlow 1.0) view of the physical or virtual port on which the | |
465 | * packet was received. | |
466 | * | |
467 | * Type: be16. | |
468 | * Maskable: no. | |
469 | * Formatting: OpenFlow 1.0 port. | |
470 | * Prerequisites: none. | |
471 | * Access: read/write. | |
472 | * NXM: NXM_OF_IN_PORT(0) since v1.1. | |
473 | * OXM: none. | |
474 | * OF1.0: exact match. | |
475 | * OF1.1: exact match. | |
476 | */ | |
477 | MFF_IN_PORT, | |
478 | ||
479 | /* "in_port_oxm". | |
480 | * | |
481 | * 32-bit (OpenFlow 1.1+) view of the physical or virtual port on which the | |
482 | * packet was received. | |
483 | * | |
484 | * Type: be32. | |
485 | * Maskable: no. | |
486 | * Formatting: OpenFlow 1.1+ port. | |
487 | * Prerequisites: none. | |
488 | * Access: read/write. | |
489 | * NXM: none. | |
490 | * OXM: OXM_OF_IN_PORT(0) since OF1.2 and v1.7. | |
491 | * OF1.1: exact match. | |
492 | */ | |
493 | MFF_IN_PORT_OXM, | |
494 | ||
c61f3870 BP |
495 | /* "actset_output". |
496 | * | |
497 | * Type: be32. | |
498 | * Maskable: no. | |
499 | * Formatting: OpenFlow 1.1+ port. | |
500 | * Prerequisites: none. | |
501 | * Access: read-only. | |
502 | * NXM: none. | |
503 | * OXM: ONFOXM_ET_ACTSET_OUTPUT(43) since OF1.3 and v2.4, | |
504 | * OXM_OF_ACTSET_OUTPUT(43) since OF1.5 and v2.4. | |
505 | */ | |
506 | MFF_ACTSET_OUTPUT, | |
507 | ||
a4ce8b25 BP |
508 | /* "skb_priority". |
509 | * | |
510 | * Designates the queue to which output will be directed. The value in | |
511 | * this field is not necessarily the OpenFlow queue number; with the Linux | |
512 | * kernel switch, it instead has a pair of subfields designating the | |
513 | * "major" and "minor" numbers of a Linux kernel qdisc handle. | |
514 | * | |
515 | * This field is "semi-internal" in that it can be set with the "set_queue" | |
516 | * action but not matched or read or written other ways. | |
517 | * | |
518 | * Type: be32. | |
519 | * Maskable: no. | |
520 | * Formatting: hexadecimal. | |
521 | * Prerequisites: none. | |
522 | * Access: read-only. | |
523 | * NXM: none. | |
524 | * OXM: none. | |
525 | */ | |
526 | MFF_SKB_PRIORITY, | |
527 | ||
528 | /* "pkt_mark". | |
529 | * | |
530 | * Packet metadata mark. The mark may be passed into other system | |
531 | * components in order to facilitate interaction between subsystems. On | |
532 | * Linux this corresponds to struct sk_buff's "skb_mark" member but the | |
533 | * exact implementation is platform-dependent. | |
534 | * | |
535 | * Type: be32. | |
536 | * Maskable: bitwise. | |
537 | * Formatting: hexadecimal. | |
538 | * Prerequisites: none. | |
539 | * Access: read/write. | |
540 | * NXM: NXM_NX_PKT_MARK(33) since v2.0. | |
541 | * OXM: none. | |
542 | */ | |
543 | MFF_PKT_MARK, | |
6a885fd0 | 544 | |
771c99c1 | 545 | #if FLOW_N_REGS == 8 |
a4ce8b25 BP |
546 | /* "reg<N>". |
547 | * | |
548 | * Nicira extension scratch pad register with initial value 0. | |
549 | * | |
550 | * Type: be32. | |
551 | * Maskable: bitwise. | |
552 | * Formatting: hexadecimal. | |
553 | * Prerequisites: none. | |
554 | * Access: read/write. | |
555 | * NXM: NXM_NX_REG0(0) since v1.1. <0> | |
556 | * NXM: NXM_NX_REG1(1) since v1.1. <1> | |
557 | * NXM: NXM_NX_REG2(2) since v1.1. <2> | |
558 | * NXM: NXM_NX_REG3(3) since v1.1. <3> | |
559 | * NXM: NXM_NX_REG4(4) since v1.3. <4> | |
560 | * NXM: NXM_NX_REG5(5) since v1.7. <5> | |
561 | * NXM: NXM_NX_REG6(6) since v1.7. <6> | |
562 | * NXM: NXM_NX_REG7(7) since v1.7. <7> | |
563 | * OXM: none. | |
564 | */ | |
565 | MFF_REG0, | |
566 | MFF_REG1, | |
567 | MFF_REG2, | |
568 | MFF_REG3, | |
569 | MFF_REG4, | |
570 | MFF_REG5, | |
571 | MFF_REG6, | |
572 | MFF_REG7, | |
771c99c1 BP |
573 | #else |
574 | #error "Need to update MFF_REG* to match FLOW_N_REGS" | |
79fe0f46 BP |
575 | #endif |
576 | ||
577 | #if FLOW_N_XREGS == 4 | |
a4ce8b25 BP |
578 | /* "xreg<N>". |
579 | * | |
d3cb080e | 580 | * OpenFlow 1.5 ``extended register". Each extended register |
a4ce8b25 BP |
581 | * overlays two of the Nicira extension 32-bit registers: xreg0 overlays |
582 | * reg0 and reg1, with reg0 supplying the most-significant bits of xreg0 | |
583 | * and reg1 the least-significant. xreg1 similarly overlays reg2 and reg3, | |
584 | * and so on. | |
585 | * | |
10cb9842 BP |
586 | * These registers were introduced in OpenFlow 1.5, but EXT-244 in the ONF |
587 | * JIRA also publishes them as a (draft) OpenFlow extension to OpenFlow | |
588 | * 1.3. | |
589 | * | |
a4ce8b25 BP |
590 | * Type: be64. |
591 | * Maskable: bitwise. | |
592 | * Formatting: hexadecimal. | |
593 | * Prerequisites: none. | |
594 | * Access: read/write. | |
595 | * NXM: none. | |
10cb9842 | 596 | * OXM: OXM_OF_PKT_REG<N>(<N>) since OF1.3 and v2.4. |
a4ce8b25 BP |
597 | */ |
598 | MFF_XREG0, | |
599 | MFF_XREG1, | |
600 | MFF_XREG2, | |
601 | MFF_XREG3, | |
79fe0f46 BP |
602 | #else |
603 | #error "Need to update MFF_REG* to match FLOW_N_XREGS" | |
6a885fd0 BP |
604 | #endif |
605 | ||
a4ce8b25 BP |
606 | /* ## -------- ## */ |
607 | /* ## Ethernet ## */ | |
608 | /* ## -------- ## */ | |
609 | ||
610 | /* "eth_src" (aka "dl_src"). | |
611 | * | |
612 | * Source address in Ethernet header. | |
613 | * | |
614 | * This field was not maskable before Open vSwitch 1.8. | |
615 | * | |
616 | * Type: MAC. | |
617 | * Maskable: bitwise. | |
618 | * Formatting: Ethernet. | |
619 | * Prerequisites: none. | |
620 | * Access: read/write. | |
621 | * NXM: NXM_OF_ETH_SRC(2) since v1.1. | |
622 | * OXM: OXM_OF_ETH_SRC(4) since OF1.2 and v1.7. | |
623 | * OF1.0: exact match. | |
624 | * OF1.1: bitwise mask. | |
625 | */ | |
626 | MFF_ETH_SRC, | |
627 | ||
628 | /* "eth_dst" (aka "dl_dst"). | |
629 | * | |
630 | * Destination address in Ethernet header. | |
631 | * | |
632 | * Before Open vSwitch 1.8, the allowed masks were restricted to | |
633 | * 00:00:00:00:00:00, fe:ff:ff:ff:ff:ff, 01:00:00:00:00:00, | |
634 | * ff:ff:ff:ff:ff:ff. | |
635 | * | |
636 | * Type: MAC. | |
637 | * Maskable: bitwise. | |
638 | * Formatting: Ethernet. | |
639 | * Prerequisites: none. | |
640 | * Access: read/write. | |
641 | * NXM: NXM_OF_ETH_DST(1) since v1.1. | |
642 | * OXM: OXM_OF_ETH_DST(3) since OF1.2 and v1.7. | |
643 | * OF1.0: exact match. | |
644 | * OF1.1: bitwise mask. | |
645 | */ | |
646 | MFF_ETH_DST, | |
647 | ||
648 | /* "eth_type" (aka "dl_type"). | |
649 | * | |
650 | * Packet's Ethernet type. | |
651 | * | |
652 | * For an Ethernet II packet this is taken from the Ethernet header. For | |
653 | * an 802.2 LLC+SNAP header with OUI 00-00-00 this is taken from the SNAP | |
654 | * header. A packet that has neither format has value 0x05ff | |
655 | * (OFP_DL_TYPE_NOT_ETH_TYPE). | |
656 | * | |
657 | * For a packet with an 802.1Q header, this is the type of the encapsulated | |
658 | * frame. | |
659 | * | |
660 | * Type: be16. | |
661 | * Maskable: no. | |
662 | * Formatting: hexadecimal. | |
663 | * Prerequisites: none. | |
664 | * Access: read-only. | |
665 | * NXM: NXM_OF_ETH_TYPE(3) since v1.1. | |
666 | * OXM: OXM_OF_ETH_TYPE(5) since OF1.2 and v1.7. | |
667 | * OF1.0: exact match. | |
668 | * OF1.1: exact match. | |
669 | */ | |
670 | MFF_ETH_TYPE, | |
671 | ||
672 | /* ## ---- ## */ | |
673 | /* ## VLAN ## */ | |
674 | /* ## ---- ## */ | |
675 | ||
676 | /* It looks odd for vlan_tci, vlan_vid, and vlan_pcp to say that they are | |
677 | * supported in OF1.0 and OF1.1, since the detailed semantics of these fields | |
678 | * only apply to NXM or OXM. They are marked as supported for exact matches in | |
679 | * OF1.0 and OF1.1 because exact matches on those fields can be successfully | |
680 | * translated into the OF1.0 and OF1.1 flow formats. */ | |
681 | ||
682 | /* "vlan_tci". | |
683 | * | |
684 | * 802.1Q TCI. | |
685 | * | |
686 | * For a packet with an 802.1Q header, this is the Tag Control Information | |
687 | * (TCI) field, with the CFI bit forced to 1. For a packet with no 802.1Q | |
688 | * header, this has value 0. | |
689 | * | |
690 | * This field can be used in various ways: | |
691 | * | |
692 | * - If it is not constrained at all, the nx_match matches packets | |
693 | * without an 802.1Q header or with an 802.1Q header that has any TCI | |
694 | * value. | |
695 | * | |
696 | * - Testing for an exact match with 0 matches only packets without an | |
697 | * 802.1Q header. | |
698 | * | |
699 | * - Testing for an exact match with a TCI value with CFI=1 matches | |
700 | * packets that have an 802.1Q header with a specified VID and PCP. | |
701 | * | |
702 | * - Testing for an exact match with a nonzero TCI value with CFI=0 does | |
703 | * not make sense. The switch may reject this combination. | |
704 | * | |
705 | * - Testing with a specific VID and CFI=1, with nxm_mask=0x1fff, matches | |
706 | * packets that have an 802.1Q header with that VID (and any PCP). | |
707 | * | |
708 | * - Testing with a specific PCP and CFI=1, with nxm_mask=0xf000, matches | |
709 | * packets that have an 802.1Q header with that PCP (and any VID). | |
710 | * | |
711 | * - Testing with nxm_value=0, nxm_mask=0x0fff matches packets with no | |
712 | * 802.1Q header or with an 802.1Q header with a VID of 0. | |
713 | * | |
714 | * - Testing with nxm_value=0, nxm_mask=0xe000 matches packets with no | |
715 | * 802.1Q header or with an 802.1Q header with a PCP of 0. | |
716 | * | |
717 | * - Testing with nxm_value=0, nxm_mask=0xefff matches packets with no | |
718 | * 802.1Q header or with an 802.1Q header with both VID and PCP of 0. | |
719 | * | |
720 | * Type: be16. | |
721 | * Maskable: bitwise. | |
722 | * Formatting: hexadecimal. | |
723 | * Prerequisites: none. | |
724 | * Access: read/write. | |
725 | * NXM: NXM_OF_VLAN_TCI(4) since v1.1. | |
726 | * OXM: none. | |
727 | * OF1.0: exact match. | |
728 | * OF1.1: exact match. | |
729 | */ | |
730 | MFF_VLAN_TCI, | |
731 | ||
732 | /* "dl_vlan" (OpenFlow 1.0). | |
733 | * | |
734 | * VLAN ID field. Zero if no 802.1Q header is present. | |
735 | * | |
736 | * Type: be16 (low 12 bits). | |
737 | * Maskable: no. | |
738 | * Formatting: decimal. | |
739 | * Prerequisites: none. | |
740 | * Access: read/write. | |
741 | * NXM: none. | |
742 | * OXM: none. | |
743 | * OF1.0: exact match. | |
744 | * OF1.1: exact match. | |
745 | */ | |
746 | MFF_DL_VLAN, | |
747 | ||
748 | /* "vlan_vid" (OpenFlow 1.2+). | |
749 | * | |
750 | * If an 802.1Q header is present, this field's value is 0x1000 | |
751 | * bitwise-or'd with the VLAN ID. If no 802.1Q is present, this field's | |
752 | * value is 0. | |
753 | * | |
754 | * Type: be16 (low 12 bits). | |
755 | * Maskable: bitwise. | |
756 | * Formatting: decimal. | |
757 | * Prerequisites: none. | |
758 | * Access: read/write. | |
759 | * NXM: none. | |
760 | * OXM: OXM_OF_VLAN_VID(6) since OF1.2 and v1.7. | |
761 | * OF1.0: exact match. | |
762 | * OF1.1: exact match. | |
763 | */ | |
764 | MFF_VLAN_VID, | |
765 | ||
766 | /* "dl_vlan_pcp" (OpenFlow 1.0). | |
767 | * | |
768 | * VLAN priority (PCP) field. Zero if no 802.1Q header is present. | |
769 | * | |
770 | * Type: u8 (low 3 bits). | |
771 | * Maskable: no. | |
772 | * Formatting: decimal. | |
773 | * Prerequisites: none. | |
774 | * Access: read/write. | |
775 | * NXM: none. | |
776 | * OXM: none. | |
777 | * OF1.0: exact match. | |
778 | * OF1.1: exact match. | |
779 | */ | |
780 | MFF_DL_VLAN_PCP, | |
781 | ||
782 | /* "vlan_pcp" (OpenFlow 1.2+). | |
783 | * | |
784 | * VLAN priority (PCP) field. Zero if no 802.1Q header is present. | |
785 | * | |
786 | * Type: u8 (low 3 bits). | |
787 | * Maskable: no. | |
788 | * Formatting: decimal. | |
789 | * Prerequisites: VLAN VID. | |
790 | * Access: read/write. | |
791 | * NXM: none. | |
792 | * OXM: OXM_OF_VLAN_PCP(7) since OF1.2 and v1.7. | |
793 | * OF1.0: exact match. | |
794 | * OF1.1: exact match. | |
795 | */ | |
796 | MFF_VLAN_PCP, | |
797 | ||
798 | /* ## ---- ## */ | |
799 | /* ## MPLS ## */ | |
800 | /* ## ---- ## */ | |
801 | ||
802 | /* "mpls_label". | |
803 | * | |
804 | * The outermost MPLS label, or 0 if no MPLS labels are present. | |
805 | * | |
806 | * Type: be32 (low 20 bits). | |
807 | * Maskable: no. | |
808 | * Formatting: decimal. | |
809 | * Prerequisites: MPLS. | |
810 | * Access: read/write. | |
811 | * NXM: none. | |
812 | * OXM: OXM_OF_MPLS_LABEL(34) since OF1.2 and v1.11. | |
813 | * OF1.1: exact match. | |
814 | */ | |
815 | MFF_MPLS_LABEL, | |
816 | ||
817 | /* "mpls_tc". | |
818 | * | |
819 | * The outermost MPLS label's traffic control (TC) field, or 0 if no MPLS | |
820 | * labels are present. | |
821 | * | |
822 | * Type: u8 (low 3 bits). | |
823 | * Maskable: no. | |
824 | * Formatting: decimal. | |
825 | * Prerequisites: MPLS. | |
826 | * Access: read/write. | |
827 | * NXM: none. | |
828 | * OXM: OXM_OF_MPLS_TC(35) since OF1.2 and v1.11. | |
829 | * OF1.1: exact match. | |
830 | */ | |
831 | MFF_MPLS_TC, | |
832 | ||
833 | /* "mpls_bos". | |
834 | * | |
835 | * The outermost MPLS label's bottom of stack (BoS) field, or 0 if no MPLS | |
836 | * labels are present. | |
837 | * | |
838 | * Type: u8 (low 1 bits). | |
839 | * Maskable: no. | |
840 | * Formatting: decimal. | |
841 | * Prerequisites: MPLS. | |
842 | * Access: read-only. | |
843 | * NXM: none. | |
844 | * OXM: OXM_OF_MPLS_BOS(36) since OF1.3 and v1.11. | |
845 | */ | |
846 | MFF_MPLS_BOS, | |
847 | ||
848 | /* ## ---- ## */ | |
849 | /* ## IPv4 ## */ | |
850 | /* ## ---- ## */ | |
851 | ||
852 | /* Update mf_is_l3_or_higher() if MFF_IPV4_SRC is no longer the first element | |
853 | * for a field of layer 3 or higher */ | |
854 | ||
855 | /* "ip_src" (aka "nw_src"). | |
856 | * | |
857 | * The source address in the IPv4 header. | |
858 | * | |
859 | * Before Open vSwitch 1.8, only CIDR masks were supported. | |
860 | * | |
861 | * Type: be32. | |
862 | * Maskable: bitwise. | |
863 | * Formatting: IPv4. | |
864 | * Prerequisites: IPv4. | |
865 | * Access: read/write. | |
866 | * NXM: NXM_OF_IP_SRC(7) since v1.1. | |
867 | * OXM: OXM_OF_IPV4_SRC(11) since OF1.2 and v1.7. | |
868 | * OF1.0: CIDR mask. | |
869 | * OF1.1: bitwise mask. | |
870 | * Prefix lookup member: nw_src. | |
871 | */ | |
872 | MFF_IPV4_SRC, | |
873 | ||
874 | /* "ip_dst" (aka "nw_dst"). | |
875 | * | |
876 | * The destination address in the IPv4 header. | |
877 | * | |
878 | * Before Open vSwitch 1.8, only CIDR masks were supported. | |
879 | * | |
880 | * Type: be32. | |
881 | * Maskable: bitwise. | |
882 | * Formatting: IPv4. | |
883 | * Prerequisites: IPv4. | |
884 | * Access: read/write. | |
885 | * NXM: NXM_OF_IP_DST(8) since v1.1. | |
886 | * OXM: OXM_OF_IPV4_DST(12) since OF1.2 and v1.7. | |
887 | * OF1.0: CIDR mask. | |
888 | * OF1.1: bitwise mask. | |
889 | * Prefix lookup member: nw_dst. | |
890 | */ | |
891 | MFF_IPV4_DST, | |
892 | ||
893 | /* ## ---- ## */ | |
894 | /* ## IPv6 ## */ | |
895 | /* ## ---- ## */ | |
896 | ||
897 | /* "ipv6_src". | |
898 | * | |
899 | * The source address in the IPv6 header. | |
900 | * | |
901 | * Type: IPv6. | |
902 | * Maskable: bitwise. | |
903 | * Formatting: IPv6. | |
904 | * Prerequisites: IPv6. | |
905 | * Access: read/write. | |
906 | * NXM: NXM_NX_IPV6_SRC(19) since v1.1. | |
907 | * OXM: OXM_OF_IPV6_SRC(26) since OF1.2 and v1.1. | |
908 | * Prefix lookup member: ipv6_src. | |
909 | */ | |
910 | MFF_IPV6_SRC, | |
911 | ||
912 | /* "ipv6_dst". | |
913 | * | |
914 | * The destination address in the IPv6 header. | |
915 | * | |
916 | * Type: IPv6. | |
917 | * Maskable: bitwise. | |
918 | * Formatting: IPv6. | |
919 | * Prerequisites: IPv6. | |
920 | * Access: read/write. | |
921 | * NXM: NXM_NX_IPV6_DST(20) since v1.1. | |
922 | * OXM: OXM_OF_IPV6_DST(27) since OF1.2 and v1.1. | |
923 | * Prefix lookup member: ipv6_dst. | |
924 | */ | |
925 | MFF_IPV6_DST, | |
926 | ||
927 | /* "ipv6_label". | |
928 | * | |
929 | * The flow label in the IPv6 header. | |
930 | * | |
931 | * Type: be32 (low 20 bits). | |
932 | * Maskable: bitwise. | |
933 | * Formatting: hexadecimal. | |
934 | * Prerequisites: IPv6. | |
88cc95c1 | 935 | * Access: read/write. |
a4ce8b25 BP |
936 | * NXM: NXM_NX_IPV6_LABEL(27) since v1.4. |
937 | * OXM: OXM_OF_IPV6_FLABEL(28) since OF1.2 and v1.7. | |
938 | */ | |
939 | MFF_IPV6_LABEL, | |
940 | ||
941 | /* ## ----------------------- ## */ | |
942 | /* ## IPv4/IPv6 common fields ## */ | |
943 | /* ## ----------------------- ## */ | |
944 | ||
945 | /* "nw_proto" (aka "ip_proto"). | |
946 | * | |
947 | * The "protocol" byte in the IPv4 or IPv6 header. | |
948 | * | |
949 | * Type: u8. | |
950 | * Maskable: no. | |
951 | * Formatting: decimal. | |
952 | * Prerequisites: IPv4/IPv6. | |
953 | * Access: read-only. | |
954 | * NXM: NXM_OF_IP_PROTO(6) since v1.1. | |
955 | * OXM: OXM_OF_IP_PROTO(10) since OF1.2 and v1.7. | |
956 | * OF1.0: exact match. | |
957 | * OF1.1: exact match. | |
958 | */ | |
959 | MFF_IP_PROTO, | |
960 | ||
961 | /* Both views of the DSCP below are marked as supported in all of the versions | |
962 | * of OpenFlow because a match on either view can be successfully translated | |
963 | * into every OpenFlow flow format. */ | |
964 | ||
965 | /* "nw_tos" (OpenFlow 1.0/1.1). | |
966 | * | |
967 | * The DSCP byte in the IPv4 header or the traffic class byte from the IPv6 | |
968 | * header, with the ECN bits forced to 0. (That is, bits 2-7 contain the | |
969 | * type of service and bits 0-1 are zero.) | |
970 | * | |
971 | * Type: u8. | |
972 | * Maskable: no. | |
973 | * Formatting: decimal. | |
974 | * Prerequisites: IPv4/IPv6. | |
975 | * Access: read/write. | |
976 | * NXM: NXM_OF_IP_TOS(5) since v1.1. | |
977 | * OXM: none. | |
978 | * OF1.0: exact match. | |
979 | * OF1.1: exact match. | |
980 | */ | |
981 | MFF_IP_DSCP, | |
982 | ||
983 | /* "ip_dscp" (OpenFlow 1.2+). | |
984 | * | |
985 | * The DSCP byte in the IPv4 header or the traffic class byte from the IPv6 | |
986 | * header, shifted right 2 bits. (That is, bits 0-5 contain the type of | |
987 | * service and bits 6-7 are zero.) | |
988 | * | |
989 | * Type: u8 (low 6 bits). | |
990 | * Maskable: no. | |
991 | * Formatting: decimal. | |
992 | * Prerequisites: IPv4/IPv6. | |
993 | * Access: read/write. | |
994 | * NXM: none. | |
995 | * OXM: OXM_OF_IP_DSCP(8) since OF1.2 and v1.7. | |
996 | * OF1.0: exact match. | |
997 | * OF1.1: exact match. | |
998 | */ | |
999 | MFF_IP_DSCP_SHIFTED, | |
1000 | ||
1001 | /* "nw_ecn" (aka "ip_ecn"). | |
1002 | * | |
1003 | * The ECN bits in the IPv4 or IPv6 header. | |
1004 | * | |
1005 | * Type: u8 (low 2 bits). | |
1006 | * Maskable: no. | |
1007 | * Formatting: decimal. | |
1008 | * Prerequisites: IPv4/IPv6. | |
1009 | * Access: read/write. | |
1010 | * NXM: NXM_NX_IP_ECN(28) since v1.4. | |
1011 | * OXM: OXM_OF_IP_ECN(9) since OF1.2 and v1.7. | |
1012 | */ | |
1013 | MFF_IP_ECN, | |
1014 | ||
1015 | /* "nw_ttl". | |
1016 | * | |
1017 | * The time-to-live (TTL) in the IPv4 header or hop limit in the IPv6 | |
1018 | * header. | |
1019 | * | |
1020 | * Type: u8. | |
1021 | * Maskable: no. | |
1022 | * Formatting: decimal. | |
1023 | * Prerequisites: IPv4/IPv6. | |
1024 | * Access: read/write. | |
1025 | * NXM: NXM_NX_IP_TTL(29) since v1.4. | |
1026 | * OXM: none. | |
1027 | */ | |
1028 | MFF_IP_TTL, | |
1029 | ||
1030 | /* "ip_frag". | |
1031 | * | |
1032 | * IP fragment information. | |
1033 | * | |
1034 | * This field has three possible values: | |
1035 | * | |
1036 | * - A packet that is not an IP fragment has value 0. | |
1037 | * | |
1038 | * - A packet that is an IP fragment with offset 0 (the first fragment) | |
1039 | * has bit 0 set and thus value 1. | |
1040 | * | |
1041 | * - A packet that is an IP fragment with nonzero offset has bits 0 and 1 | |
1042 | * set and thus value 3. | |
1043 | * | |
1044 | * NX_IP_FRAG_ANY and NX_IP_FRAG_LATER are declared to symbolically | |
1045 | * represent the meanings of bits 0 and 1. | |
1046 | * | |
1047 | * The switch may reject matches against values that can never appear. | |
1048 | * | |
1049 | * It is important to understand how this field interacts with the OpenFlow | |
1050 | * IP fragment handling mode: | |
1051 | * | |
1052 | * - In OFPC_FRAG_DROP mode, the OpenFlow switch drops all IP fragments | |
1053 | * before they reach the flow table, so every packet that is available | |
1054 | * for matching will have value 0 in this field. | |
1055 | * | |
1056 | * - Open vSwitch does not implement OFPC_FRAG_REASM mode, but if it did | |
1057 | * then IP fragments would be reassembled before they reached the flow | |
1058 | * table and again every packet available for matching would always | |
1059 | * have value 0. | |
1060 | * | |
1061 | * - In OFPC_FRAG_NORMAL mode, all three values are possible, but | |
1062 | * OpenFlow 1.0 says that fragments' transport ports are always 0, even | |
1063 | * for the first fragment, so this does not provide much extra | |
1064 | * information. | |
1065 | * | |
1066 | * - In OFPC_FRAG_NX_MATCH mode, all three values are possible. For | |
1067 | * fragments with offset 0, Open vSwitch makes L4 header information | |
1068 | * available. | |
1069 | * | |
1070 | * Type: u8 (low 2 bits). | |
1071 | * Maskable: bitwise. | |
1072 | * Formatting: frag. | |
1073 | * Prerequisites: IPv4/IPv6. | |
1074 | * Access: read-only. | |
1075 | * NXM: NXM_NX_IP_FRAG(26) since v1.3. | |
1076 | * OXM: none. | |
1077 | */ | |
1078 | MFF_IP_FRAG, | |
1079 | ||
1080 | /* ## --- ## */ | |
1081 | /* ## ARP ## */ | |
1082 | /* ## --- ## */ | |
1083 | ||
1084 | /* "arp_op". | |
1085 | * | |
1086 | * ARP opcode. | |
1087 | * | |
1088 | * For an Ethernet+IP ARP packet, the opcode in the ARP header. Always 0 | |
1089 | * otherwise. Only ARP opcodes between 1 and 255 should be specified for | |
1090 | * matching. | |
1091 | * | |
1092 | * Type: be16. | |
1093 | * Maskable: no. | |
1094 | * Formatting: decimal. | |
1095 | * Prerequisites: ARP. | |
1096 | * Access: read/write. | |
1097 | * NXM: NXM_OF_ARP_OP(15) since v1.1. | |
1098 | * OXM: OXM_OF_ARP_OP(21) since OF1.2 and v1.7. | |
1099 | * OF1.0: exact match. | |
1100 | * OF1.1: exact match. | |
1101 | */ | |
1102 | MFF_ARP_OP, | |
1103 | ||
1104 | /* "arp_spa". | |
1105 | * | |
1106 | * For an Ethernet+IP ARP packet, the source protocol (IPv4) address in the | |
1107 | * ARP header. Always 0 otherwise. | |
1108 | * | |
1109 | * Before Open vSwitch 1.8, only CIDR masks were supported. | |
1110 | * | |
1111 | * Type: be32. | |
1112 | * Maskable: bitwise. | |
1113 | * Formatting: IPv4. | |
1114 | * Prerequisites: ARP. | |
1115 | * Access: read/write. | |
1116 | * NXM: NXM_OF_ARP_SPA(16) since v1.1. | |
1117 | * OXM: OXM_OF_ARP_SPA(22) since OF1.2 and v1.7. | |
1118 | * OF1.0: CIDR mask. | |
1119 | * OF1.1: bitwise mask. | |
1120 | */ | |
1121 | MFF_ARP_SPA, | |
1122 | ||
1123 | /* "arp_tpa". | |
1124 | * | |
1125 | * For an Ethernet+IP ARP packet, the target protocol (IPv4) address in the | |
1126 | * ARP header. Always 0 otherwise. | |
1127 | * | |
1128 | * Before Open vSwitch 1.8, only CIDR masks were supported. | |
1129 | * | |
1130 | * Type: be32. | |
1131 | * Maskable: bitwise. | |
1132 | * Formatting: IPv4. | |
1133 | * Prerequisites: ARP. | |
1134 | * Access: read/write. | |
1135 | * NXM: NXM_OF_ARP_TPA(17) since v1.1. | |
1136 | * OXM: OXM_OF_ARP_TPA(23) since OF1.2 and v1.7. | |
1137 | * OF1.0: CIDR mask. | |
1138 | * OF1.1: bitwise mask. | |
1139 | */ | |
1140 | MFF_ARP_TPA, | |
1141 | ||
1142 | /* "arp_sha". | |
1143 | * | |
1144 | * For an Ethernet+IP ARP packet, the source hardware (Ethernet) address in | |
1145 | * the ARP header. Always 0 otherwise. | |
1146 | * | |
1147 | * Type: MAC. | |
1148 | * Maskable: bitwise. | |
1149 | * Formatting: Ethernet. | |
1150 | * Prerequisites: ARP. | |
1151 | * Access: read/write. | |
1152 | * NXM: NXM_NX_ARP_SHA(17) since v1.1. | |
1153 | * OXM: OXM_OF_ARP_SHA(24) since OF1.2 and v1.7. | |
1154 | */ | |
1155 | MFF_ARP_SHA, | |
1156 | ||
1157 | /* "arp_tha". | |
1158 | * | |
1159 | * For an Ethernet+IP ARP packet, the target hardware (Ethernet) address in | |
1160 | * the ARP header. Always 0 otherwise. | |
1161 | * | |
1162 | * Type: MAC. | |
1163 | * Maskable: bitwise. | |
1164 | * Formatting: Ethernet. | |
1165 | * Prerequisites: ARP. | |
1166 | * Access: read/write. | |
1167 | * NXM: NXM_NX_ARP_THA(18) since v1.1. | |
1168 | * OXM: OXM_OF_ARP_THA(25) since OF1.2 and v1.7. | |
1169 | */ | |
1170 | MFF_ARP_THA, | |
1171 | ||
1172 | /* ## --- ## */ | |
1173 | /* ## TCP ## */ | |
1174 | /* ## --- ## */ | |
1175 | ||
1176 | /* "tcp_src" (aka "tp_src"). | |
1177 | * | |
1178 | * TCP source port. | |
1179 | * | |
1180 | * Type: be16. | |
1181 | * Maskable: bitwise. | |
1182 | * Formatting: decimal. | |
1183 | * Prerequisites: TCP. | |
1184 | * Access: read/write. | |
1185 | * NXM: NXM_OF_TCP_SRC(9) since v1.1. | |
1186 | * OXM: OXM_OF_TCP_SRC(13) since OF1.2 and v1.7. | |
1187 | * OF1.0: exact match. | |
1188 | * OF1.1: exact match. | |
1189 | */ | |
1190 | MFF_TCP_SRC, | |
1191 | ||
1192 | /* "tcp_dst" (aka "tp_dst"). | |
1193 | * | |
1194 | * TCP destination port. | |
1195 | * | |
1196 | * Type: be16. | |
1197 | * Maskable: bitwise. | |
1198 | * Formatting: decimal. | |
1199 | * Prerequisites: TCP. | |
1200 | * Access: read/write. | |
1201 | * NXM: NXM_OF_TCP_DST(10) since v1.1. | |
1202 | * OXM: OXM_OF_TCP_DST(14) since OF1.2 and v1.7. | |
1203 | * OF1.0: exact match. | |
1204 | * OF1.1: exact match. | |
1205 | */ | |
1206 | MFF_TCP_DST, | |
1207 | ||
1208 | /* "tcp_flags". | |
1209 | * | |
1210 | * Flags in the TCP header. | |
1211 | * | |
1212 | * TCP currently defines 9 flag bits, and additional 3 bits are reserved | |
1213 | * (must be transmitted as zero). See RFCs 793, 3168, and 3540. | |
1214 | * | |
1215 | * Type: be16 (low 12 bits). | |
1216 | * Maskable: bitwise. | |
1217 | * Formatting: TCP flags. | |
1218 | * Prerequisites: TCP. | |
1219 | * Access: read-only. | |
1220 | * NXM: NXM_NX_TCP_FLAGS(34) since v2.1. | |
847ddeab BP |
1221 | * OXM: ONFOXM_ET_TCP_FLAGS(42) since OF1.3 and v2.4, |
1222 | * OXM_OF_TCP_FLAGS(42) since OF1.5 and v2.3. | |
a4ce8b25 BP |
1223 | */ |
1224 | MFF_TCP_FLAGS, | |
1225 | ||
1226 | /* ## --- ## */ | |
1227 | /* ## UDP ## */ | |
1228 | /* ## --- ## */ | |
1229 | ||
1230 | /* "udp_src". | |
1231 | * | |
1232 | * UDP source port. | |
1233 | * | |
1234 | * Type: be16. | |
1235 | * Maskable: bitwise. | |
1236 | * Formatting: decimal. | |
1237 | * Prerequisites: UDP. | |
1238 | * Access: read/write. | |
1239 | * NXM: NXM_OF_UDP_SRC(11) since v1.1. | |
1240 | * OXM: OXM_OF_UDP_SRC(15) since OF1.2 and v1.7. | |
1241 | * OF1.0: exact match. | |
1242 | * OF1.1: exact match. | |
1243 | */ | |
1244 | MFF_UDP_SRC, | |
1245 | ||
1246 | /* "udp_dst". | |
1247 | * | |
1248 | * UDP destination port | |
1249 | * | |
1250 | * Type: be16. | |
1251 | * Maskable: bitwise. | |
1252 | * Formatting: decimal. | |
1253 | * Prerequisites: UDP. | |
1254 | * Access: read/write. | |
1255 | * NXM: NXM_OF_UDP_DST(12) since v1.1. | |
1256 | * OXM: OXM_OF_UDP_DST(16) since OF1.2 and v1.7. | |
1257 | * OF1.0: exact match. | |
1258 | * OF1.1: exact match. | |
1259 | */ | |
1260 | MFF_UDP_DST, | |
1261 | ||
1262 | /* ## ---- ## */ | |
1263 | /* ## SCTP ## */ | |
1264 | /* ## ---- ## */ | |
1265 | ||
1266 | /* "sctp_src". | |
1267 | * | |
1268 | * SCTP source port. | |
1269 | * | |
1270 | * Type: be16. | |
1271 | * Maskable: bitwise. | |
1272 | * Formatting: decimal. | |
1273 | * Prerequisites: SCTP. | |
1274 | * Access: read/write. | |
1275 | * NXM: none. | |
1276 | * OXM: OXM_OF_SCTP_SRC(17) since OF1.2 and v2.0. | |
1277 | * OF1.1: exact match. | |
1278 | */ | |
1279 | MFF_SCTP_SRC, | |
1280 | ||
1281 | /* "sctp_dst". | |
1282 | * | |
1283 | * SCTP destination port. | |
1284 | * | |
1285 | * Type: be16. | |
1286 | * Maskable: bitwise. | |
1287 | * Formatting: decimal. | |
1288 | * Prerequisites: SCTP. | |
1289 | * Access: read/write. | |
1290 | * NXM: none. | |
1291 | * OXM: OXM_OF_SCTP_DST(18) since OF1.2 and v2.0. | |
1292 | * OF1.1: exact match. | |
1293 | */ | |
1294 | MFF_SCTP_DST, | |
1295 | ||
1296 | /* ## ---- ## */ | |
1297 | /* ## ICMP ## */ | |
1298 | /* ## ---- ## */ | |
1299 | ||
1300 | /* "icmp_type". | |
1301 | * | |
1302 | * ICMPv4 type. | |
1303 | * | |
1304 | * Type: u8. | |
1305 | * Maskable: no. | |
1306 | * Formatting: decimal. | |
1307 | * Prerequisites: ICMPv4. | |
1308 | * Access: read-only. | |
1309 | * NXM: NXM_OF_ICMP_TYPE(13) since v1.1. | |
1310 | * OXM: OXM_OF_ICMPV4_TYPE(19) since OF1.2 and v1.7. | |
1311 | * OF1.0: exact match. | |
1312 | * OF1.1: exact match. | |
1313 | */ | |
1314 | MFF_ICMPV4_TYPE, | |
1315 | ||
1316 | /* "icmp_code". | |
1317 | * | |
1318 | * ICMPv4 code. | |
1319 | * | |
1320 | * Type: u8. | |
1321 | * Maskable: no. | |
1322 | * Formatting: decimal. | |
1323 | * Prerequisites: ICMPv4. | |
1324 | * Access: read-only. | |
1325 | * NXM: NXM_OF_ICMP_CODE(14) since v1.1. | |
1326 | * OXM: OXM_OF_ICMPV4_CODE(20) since OF1.2 and v1.7. | |
1327 | * OF1.0: exact match. | |
1328 | * OF1.1: exact match. | |
1329 | */ | |
1330 | MFF_ICMPV4_CODE, | |
1331 | ||
1332 | /* "icmpv6_type". | |
1333 | * | |
1334 | * ICMPv6 type. | |
1335 | * | |
1336 | * Type: u8. | |
1337 | * Maskable: no. | |
1338 | * Formatting: decimal. | |
1339 | * Prerequisites: ICMPv6. | |
1340 | * Access: read-only. | |
1341 | * NXM: NXM_NX_ICMPV6_TYPE(21) since v1.1. | |
1342 | * OXM: OXM_OF_ICMPV6_TYPE(29) since OF1.2 and v1.7. | |
1343 | */ | |
1344 | MFF_ICMPV6_TYPE, | |
1345 | ||
1346 | /* "icmpv6_code". | |
1347 | * | |
1348 | * ICMPv6 code. | |
1349 | * | |
1350 | * Type: u8. | |
1351 | * Maskable: no. | |
1352 | * Formatting: decimal. | |
1353 | * Prerequisites: ICMPv6. | |
1354 | * Access: read-only. | |
1355 | * NXM: NXM_NX_ICMPV6_CODE(22) since v1.1. | |
1356 | * OXM: OXM_OF_ICMPV6_CODE(30) since OF1.2 and v1.7. | |
1357 | */ | |
1358 | MFF_ICMPV6_CODE, | |
1359 | ||
1360 | /* ## ------------------------- ## */ | |
1361 | /* ## ICMPv6 Neighbor Discovery ## */ | |
1362 | /* ## ------------------------- ## */ | |
1363 | ||
1364 | /* "nd_target". | |
1365 | * | |
1366 | * The target address in an IPv6 Neighbor Discovery message. | |
1367 | * | |
1368 | * Before Open vSwitch 1.8, only CIDR masks were supported. | |
1369 | * | |
1370 | * Type: IPv6. | |
1371 | * Maskable: bitwise. | |
1372 | * Formatting: IPv6. | |
1373 | * Prerequisites: ND. | |
e60e935b | 1374 | * Access: read/write. |
a4ce8b25 BP |
1375 | * NXM: NXM_NX_ND_TARGET(23) since v1.1. |
1376 | * OXM: OXM_OF_IPV6_ND_TARGET(31) since OF1.2 and v1.7. | |
1377 | */ | |
1378 | MFF_ND_TARGET, | |
1379 | ||
1380 | /* "nd_sll". | |
1381 | * | |
1382 | * The source link layer address in an IPv6 Neighbor Discovery message. | |
1383 | * | |
1384 | * Type: MAC. | |
1385 | * Maskable: bitwise. | |
1386 | * Formatting: Ethernet. | |
1387 | * Prerequisites: ND solicit. | |
e60e935b | 1388 | * Access: read/write. |
a4ce8b25 BP |
1389 | * NXM: NXM_NX_ND_SLL(24) since v1.1. |
1390 | * OXM: OXM_OF_IPV6_ND_SLL(32) since OF1.2 and v1.7. | |
1391 | */ | |
1392 | MFF_ND_SLL, | |
1393 | ||
1394 | /* "nd_tll". | |
1395 | * | |
1396 | * The target link layer address in an IPv6 Neighbor Discovery message. | |
1397 | * | |
1398 | * Type: MAC. | |
1399 | * Maskable: bitwise. | |
1400 | * Formatting: Ethernet. | |
1401 | * Prerequisites: ND advert. | |
e60e935b | 1402 | * Access: read/write. |
a4ce8b25 BP |
1403 | * NXM: NXM_NX_ND_TLL(25) since v1.1. |
1404 | * OXM: OXM_OF_IPV6_ND_TLL(33) since OF1.2 and v1.7. | |
1405 | */ | |
1406 | MFF_ND_TLL, | |
6a885fd0 BP |
1407 | |
1408 | MFF_N_IDS | |
1409 | }; | |
1410 | ||
abadfcb0 BP |
1411 | /* A set of mf_field_ids. */ |
1412 | struct mf_bitmap { | |
1413 | unsigned long bm[BITMAP_N_LONGS(MFF_N_IDS)]; | |
1414 | }; | |
1415 | #define MF_BITMAP_INITIALIZER { { [0] = 0 } } | |
1416 | ||
0d7e2fe4 | 1417 | /* Use this macro as CASE_MFF_REGS: in a switch statement to choose all of the |
79fe0f46 | 1418 | * MFF_REGn cases. */ |
771c99c1 BP |
1419 | #if FLOW_N_REGS == 8 |
1420 | #define CASE_MFF_REGS \ | |
0d7e2fe4 IY |
1421 | case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \ |
1422 | case MFF_REG4: case MFF_REG5: case MFF_REG6: case MFF_REG7 | |
1423 | #else | |
771c99c1 | 1424 | #error "Need to update CASE_MFF_REGS to match FLOW_N_REGS" |
0d7e2fe4 IY |
1425 | #endif |
1426 | ||
79fe0f46 BP |
1427 | /* Use this macro as CASE_MFF_XREGS: in a switch statement to choose all of the |
1428 | * MFF_REGn cases. */ | |
1429 | #if FLOW_N_XREGS == 4 | |
1430 | #define CASE_MFF_XREGS \ | |
1431 | case MFF_XREG0: case MFF_XREG1: case MFF_XREG2: case MFF_XREG3 | |
1432 | #else | |
1433 | #error "Need to update CASE_MFF_XREGS to match FLOW_N_XREGS" | |
1434 | #endif | |
1435 | ||
6a885fd0 BP |
1436 | /* Prerequisites for matching a field. |
1437 | * | |
1438 | * A field may only be matched if the correct lower-level protocols are also | |
1439 | * matched. For example, the TCP port may be matched only if the Ethernet type | |
1440 | * matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */ | |
7f98c44d | 1441 | enum OVS_PACKED_ENUM mf_prereqs { |
6a885fd0 BP |
1442 | MFP_NONE, |
1443 | ||
1444 | /* L2 requirements. */ | |
1445 | MFP_ARP, | |
8069b0da | 1446 | MFP_VLAN_VID, |
6a885fd0 BP |
1447 | MFP_IPV4, |
1448 | MFP_IPV6, | |
1449 | MFP_IP_ANY, | |
1450 | ||
b02475c5 SH |
1451 | /* L2.5 requirements. */ |
1452 | MFP_MPLS, | |
1453 | ||
6a885fd0 BP |
1454 | /* L2+L3 requirements. */ |
1455 | MFP_TCP, /* On IPv4 or IPv6. */ | |
1456 | MFP_UDP, /* On IPv4 or IPv6. */ | |
0d56eaf2 | 1457 | MFP_SCTP, /* On IPv4 or IPv6. */ |
268a95e0 | 1458 | MFP_ICMPV4, |
6a885fd0 | 1459 | MFP_ICMPV6, |
6a885fd0 BP |
1460 | |
1461 | /* L2+L3+L4 requirements. */ | |
1462 | MFP_ND, | |
1463 | MFP_ND_SOLICIT, | |
1464 | MFP_ND_ADVERT | |
1465 | }; | |
1466 | ||
1467 | /* Forms of partial-field masking allowed for a field. | |
1468 | * | |
1469 | * Every field may be masked as a whole. */ | |
7f98c44d | 1470 | enum OVS_PACKED_ENUM mf_maskable { |
6a885fd0 BP |
1471 | MFM_NONE, /* No sub-field masking. */ |
1472 | MFM_FULLY, /* Every bit is individually maskable. */ | |
6a885fd0 BP |
1473 | }; |
1474 | ||
1475 | /* How to format or parse a field's value. */ | |
7f98c44d | 1476 | enum OVS_PACKED_ENUM mf_string { |
6a885fd0 BP |
1477 | /* Integer formats. |
1478 | * | |
1479 | * The particular MFS_* constant sets the output format. On input, either | |
1480 | * decimal or hexadecimal (prefixed with 0x) is accepted. */ | |
1481 | MFS_DECIMAL, | |
1482 | MFS_HEXADECIMAL, | |
1483 | ||
1484 | /* Other formats. */ | |
1485 | MFS_ETHERNET, | |
1486 | MFS_IPV4, | |
1487 | MFS_IPV6, | |
a4ce8b25 BP |
1488 | MFS_OFP_PORT, /* 16-bit OpenFlow 1.0 port number or name. */ |
1489 | MFS_OFP_PORT_OXM, /* 32-bit OpenFlow 1.1+ port number or name. */ | |
4fe3445a PS |
1490 | MFS_FRAG, /* no, yes, first, later, not_later */ |
1491 | MFS_TNL_FLAGS, /* FLOW_TNL_F_* flags */ | |
61bf6666 | 1492 | MFS_TCP_FLAGS, /* TCP_* flags */ |
6a885fd0 BP |
1493 | }; |
1494 | ||
1495 | struct mf_field { | |
1496 | /* Identification. */ | |
1497 | enum mf_field_id id; /* MFF_*. */ | |
1498 | const char *name; /* Name of this field, e.g. "eth_type". */ | |
1499 | const char *extra_name; /* Alternate name, e.g. "dl_type", or NULL. */ | |
1500 | ||
1501 | /* Size. | |
1502 | * | |
9df6a679 JP |
1503 | * Most fields have n_bytes * 8 == n_bits. There are a few exceptions: |
1504 | * | |
1505 | * - "dl_vlan" is 2 bytes but only 12 bits. | |
1506 | * - "dl_vlan_pcp" is 1 byte but only 3 bits. | |
1507 | * - "is_frag" is 1 byte but only 2 bits. | |
fa8223b7 | 1508 | * - "ipv6_label" is 4 bytes but only 20 bits. |
b02475c5 SH |
1509 | * - "mpls_label" is 4 bytes but only 20 bits. |
1510 | * - "mpls_tc" is 1 byte but only 3 bits. | |
1511 | * - "mpls_bos" is 1 byte but only 1 bit. | |
9df6a679 | 1512 | */ |
6a885fd0 BP |
1513 | unsigned int n_bytes; /* Width of the field in bytes. */ |
1514 | unsigned int n_bits; /* Number of significant bits in field. */ | |
1515 | ||
1516 | /* Properties. */ | |
1517 | enum mf_maskable maskable; | |
6a885fd0 BP |
1518 | enum mf_string string; |
1519 | enum mf_prereqs prereqs; | |
28da1f8f BP |
1520 | bool writable; /* May be written by actions? */ |
1521 | ||
db0b6c29 | 1522 | /* Usable protocols. |
abadfcb0 | 1523 | * |
db0b6c29 JR |
1524 | * NXM and OXM are extensible, allowing later extensions to be sent in |
1525 | * earlier protocol versions, so this does not necessarily correspond to | |
1526 | * the OpenFlow protocol version the field was introduced in. | |
1527 | * Also, some field types are tranparently mapped to each other via the | |
1528 | * struct flow (like vlan and dscp/tos fields), so each variant supports | |
abadfcb0 BP |
1529 | * all protocols. |
1530 | * | |
1531 | * These are combinations of OFPUTIL_P_*. (They are not declared as type | |
1532 | * enum ofputil_protocol because that would give meta-flow.h and ofp-util.h | |
1533 | * a circular dependency.) */ | |
a4ce8b25 BP |
1534 | uint32_t usable_protocols_exact; /* Matching or setting whole field. */ |
1535 | uint32_t usable_protocols_cidr; /* Matching a CIDR mask in field. */ | |
1536 | uint32_t usable_protocols_bitwise; /* Matching arbitrary bits in field. */ | |
13751fd8 JR |
1537 | |
1538 | int flow_be32ofs; /* Field's be32 offset in "struct flow", if prefix tree | |
1539 | * lookup is supported for the field, or -1. */ | |
6a885fd0 BP |
1540 | }; |
1541 | ||
1542 | /* The representation of a field's value. */ | |
1543 | union mf_value { | |
6a885fd0 | 1544 | struct in6_addr ipv6; |
b283836c JR |
1545 | uint8_t mac[ETH_ADDR_LEN]; |
1546 | ovs_be64 be64; | |
1547 | ovs_be32 be32; | |
1548 | ovs_be16 be16; | |
1549 | uint8_t u8; | |
6a885fd0 | 1550 | }; |
1b35df45 | 1551 | BUILD_ASSERT_DECL(sizeof(union mf_value) == 16); |
6a885fd0 | 1552 | |
f98e6e5b | 1553 | /* An all-1-bits mf_value. Needs to be updated if struct mf_value grows.*/ |
b283836c | 1554 | #define MF_EXACT_MASK_INITIALIZER { IN6ADDR_EXACT_INIT } |
f98e6e5b | 1555 | BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof(struct in6_addr)); |
b283836c | 1556 | |
816fd533 BP |
1557 | /* Part of a field. */ |
1558 | struct mf_subfield { | |
1559 | const struct mf_field *field; | |
1560 | unsigned int ofs; /* Bit offset. */ | |
1561 | unsigned int n_bits; /* Number of bits. */ | |
1562 | }; | |
1563 | ||
1b35df45 BP |
1564 | /* Data for some part of an mf_field. |
1565 | * | |
1566 | * The data is stored "right-justified". For example, if "union mf_subvalue | |
1567 | * value" contains NXM_OF_VLAN_TCI[0..11], then one could access the | |
1568 | * corresponding data in value.be16[7] as the bits in the mask htons(0xfff). */ | |
1569 | union mf_subvalue { | |
1570 | uint8_t u8[16]; | |
1571 | ovs_be16 be16[8]; | |
1572 | ovs_be32 be32[4]; | |
1573 | ovs_be64 be64[2]; | |
1574 | }; | |
1575 | BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue)); | |
1576 | ||
bc65c25a SH |
1577 | /* An array of fields with values */ |
1578 | struct field_array { | |
1579 | struct mf_bitmap used; | |
1580 | union mf_value value[MFF_N_IDS]; | |
1581 | }; | |
1582 | ||
6a885fd0 | 1583 | /* Finding mf_fields. */ |
6a885fd0 BP |
1584 | const struct mf_field *mf_from_name(const char *name); |
1585 | ||
7f98c44d JR |
1586 | static inline const struct mf_field * |
1587 | mf_from_id(enum mf_field_id id) | |
1588 | { | |
1589 | extern const struct mf_field mf_fields[MFF_N_IDS]; | |
1590 | ovs_assert((unsigned int) id < MFF_N_IDS); | |
1591 | return &mf_fields[id]; | |
1592 | } | |
1593 | ||
6a885fd0 BP |
1594 | /* Inspecting wildcarded bits. */ |
1595 | bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *); | |
1596 | ||
1597 | bool mf_is_mask_valid(const struct mf_field *, const union mf_value *mask); | |
1598 | void mf_get_mask(const struct mf_field *, const struct flow_wildcards *, | |
1599 | union mf_value *mask); | |
1600 | ||
1601 | /* Prerequisites. */ | |
1602 | bool mf_are_prereqs_ok(const struct mf_field *, const struct flow *); | |
b283836c | 1603 | void mf_mask_field_and_prereqs(const struct mf_field *, struct flow *mask); |
0c4b9393 SH |
1604 | void mf_bitmap_set_field_and_prereqs(const struct mf_field *mf, struct |
1605 | mf_bitmap *bm); | |
6a885fd0 | 1606 | |
d4e78198 SH |
1607 | static inline bool |
1608 | mf_is_l3_or_higher(const struct mf_field *mf) | |
1609 | { | |
1610 | return mf->id >= MFF_IPV4_SRC; | |
1611 | } | |
1612 | ||
6a885fd0 BP |
1613 | /* Field values. */ |
1614 | bool mf_is_value_valid(const struct mf_field *, const union mf_value *value); | |
1615 | ||
1616 | void mf_get_value(const struct mf_field *, const struct flow *, | |
1617 | union mf_value *value); | |
1618 | void mf_set_value(const struct mf_field *, const union mf_value *value, | |
81a76618 | 1619 | struct match *); |
28da1f8f BP |
1620 | void mf_set_flow_value(const struct mf_field *, const union mf_value *value, |
1621 | struct flow *); | |
7eb4b1f1 BP |
1622 | void mf_set_flow_value_masked(const struct mf_field *, |
1623 | const union mf_value *value, | |
1624 | const union mf_value *mask, | |
1625 | struct flow *); | |
ccbe50f8 | 1626 | bool mf_is_zero(const struct mf_field *, const struct flow *); |
5a0a5702 | 1627 | void mf_mask_field(const struct mf_field *, struct flow *); |
6a885fd0 | 1628 | |
81a76618 | 1629 | void mf_get(const struct mf_field *, const struct match *, |
6a885fd0 | 1630 | union mf_value *value, union mf_value *mask); |
db0b6c29 JR |
1631 | |
1632 | /* Returns the set of usable protocols. */ | |
1633 | enum ofputil_protocol mf_set(const struct mf_field *, | |
1634 | const union mf_value *value, | |
1635 | const union mf_value *mask, | |
1636 | struct match *); | |
6a885fd0 | 1637 | |
81a76618 | 1638 | void mf_set_wild(const struct mf_field *, struct match *); |
6a885fd0 | 1639 | |
816fd533 | 1640 | /* Subfields. */ |
9bab681f IY |
1641 | void mf_write_subfield_flow(const struct mf_subfield *, |
1642 | const union mf_subvalue *, struct flow *); | |
1b35df45 | 1643 | void mf_write_subfield(const struct mf_subfield *, const union mf_subvalue *, |
81a76618 | 1644 | struct match *); |
1b35df45 BP |
1645 | |
1646 | void mf_read_subfield(const struct mf_subfield *, const struct flow *, | |
1647 | union mf_subvalue *); | |
816fd533 BP |
1648 | uint64_t mf_get_subfield(const struct mf_subfield *, const struct flow *); |
1649 | ||
1b35df45 | 1650 | |
816fd533 BP |
1651 | enum ofperr mf_check_src(const struct mf_subfield *, const struct flow *); |
1652 | enum ofperr mf_check_dst(const struct mf_subfield *, const struct flow *); | |
1653 | ||
6a885fd0 BP |
1654 | /* Parsing and formatting. */ |
1655 | char *mf_parse(const struct mf_field *, const char *, | |
1656 | union mf_value *value, union mf_value *mask); | |
1657 | char *mf_parse_value(const struct mf_field *, const char *, union mf_value *); | |
1658 | void mf_format(const struct mf_field *, | |
1659 | const union mf_value *value, const union mf_value *mask, | |
1660 | struct ds *); | |
9bab681f | 1661 | void mf_format_subvalue(const union mf_subvalue *subvalue, struct ds *s); |
6a885fd0 | 1662 | |
bc65c25a SH |
1663 | /* Field Arrays. */ |
1664 | void field_array_set(enum mf_field_id id, const union mf_value *, | |
1665 | struct field_array *); | |
1666 | ||
6a885fd0 | 1667 | #endif /* meta-flow.h */ |