]> git.proxmox.com Git - ovs.git/blame - lib/ofp-actions.c
OF support and translation of generic encap and decap
[ovs.git] / lib / ofp-actions.c
CommitLineData
f25d0cf3 1/*
72fe7578 2 * Copyright (c) 2008-2017 Nicira, Inc.
f25d0cf3
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#include <config.h>
d787ad39
JS
18#include <netinet/in.h>
19
f25d0cf3
BP
20#include "bundle.h"
21#include "byte-order.h"
b1c5bf1f 22#include "colors.h"
f25d0cf3 23#include "compiler.h"
d4abaff5 24#include "dummy.h"
ee89ea7b 25#include "openvswitch/hmap.h"
f25d0cf3 26#include "learn.h"
f25d0cf3
BP
27#include "multipath.h"
28#include "nx-match.h"
9ac0aada 29#include "odp-netlink.h"
b598f214
BW
30#include "openvswitch/dynamic-string.h"
31#include "openvswitch/meta-flow.h"
32#include "openvswitch/ofp-actions.h"
f4248336 33#include "openvswitch/ofp-util.h"
b598f214 34#include "openvswitch/ofp-parse.h"
66bd43fa 35#include "openvswitch/ofp-prop.h"
64c96779 36#include "openvswitch/ofpbuf.h"
b598f214 37#include "openvswitch/vlog.h"
c2d936a4 38#include "unaligned.h"
cb22974d 39#include "util.h"
aafee638 40#include "vl-mff-map.h"
f25d0cf3
BP
41
42VLOG_DEFINE_THIS_MODULE(ofp_actions);
43
44static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
f25d0cf3 45
c2d936a4
BP
46struct ofp_action_header;
47
aad28f47
BP
48/* Header for Open vSwitch and ONF vendor extension actions.
49 *
50 * This is the entire header for a few Open vSwitch vendor extension actions,
51 * the ones that either have no arguments or for which variable-length
52 * arguments follow the header.
53 *
54 * This cannot be used as an entirely generic vendor extension action header,
55 * because OpenFlow does not specify the location or size of the action
56 * subtype; it just happens that ONF extensions and Nicira extensions share
57 * this format. */
58struct ext_action_header {
59 ovs_be16 type; /* OFPAT_VENDOR. */
60 ovs_be16 len; /* At least 16. */
61 ovs_be32 vendor; /* NX_VENDOR_ID or ONF_VENDOR_ID. */
62 ovs_be16 subtype; /* See enum ofp_raw_action_type. */
63 uint8_t pad[6];
64};
65OFP_ASSERT(sizeof(struct ext_action_header) == 16);
66
c2d936a4
BP
67/* Raw identifiers for OpenFlow actions.
68 *
69 * Decoding and encoding OpenFlow actions across multiple versions is difficult
70 * to do in a clean, consistent way. This enumeration lays out all of the
71 * forms of actions that Open vSwitch supports.
72 *
73 * The comments here must follow a stylized form because the
74 * "extract-ofp-actions" program parses them at build time to generate data
75 * tables.
76 *
77 * - The first part of each comment specifies the vendor, OpenFlow versions,
78 * and type for each protocol that supports the action:
79 *
80 * # The vendor is OF for standard OpenFlow actions, NX for Nicira
81 * extension actions. (Support for other vendors can be added, but
82 * it can't be done just based on a vendor ID definition alone
83 * because OpenFlow doesn't define a standard way to specify a
84 * subtype for vendor actions, so other vendors might do it different
85 * from Nicira.)
86 *
87 * # The version can specify a specific OpenFlow version, a version
88 * range delimited by "-", or an open-ended range with "+".
89 *
90 * # The type, in parentheses, is the action type number (for standard
91 * OpenFlow actions) or subtype (for vendor extension actions).
92 *
93 * # Optionally one may add "is deprecated" followed by a
94 * human-readable reason in parentheses (which will be used in log
95 * messages), if a particular action should no longer be used.
96 *
97 * Multiple such specifications may be separated by commas.
98 *
99 * - The second part describes the action's wire format. It may be:
100 *
101 * # "struct <name>": The struct fully specifies the wire format. The
102 * action is exactly the size of the struct. (Thus, the struct must
103 * be an exact multiple of 8 bytes in size.)
104 *
105 * # "struct <name>, ...": The struct specifies the beginning of the
106 * wire format. An instance of the action is either the struct's
107 * exact size, or a multiple of 8 bytes longer.
108 *
109 * # "uint<N>_t" or "ovs_be<N>": The action consists of a (standard or
110 * vendor extension) header, followed by 0 or more pad bytes to align
111 * to a multiple of <N> bits, followed by an argument of the given
112 * type, followed by 0 or more pad bytes to bring the total action up
113 * to a multiple of 8 bytes.
114 *
115 * # "void": The action is just a (standard or vendor extension)
116 * header.
117 *
04f48a68
YHW
118 * # Optionally, one may add "VLMFF" in the end of the second part if
119 * the Openflow action may use a variable length meta-flow field
120 * (i.e. tun_metadata). Adding "VLMFF" will pass the per-switch based
121 * variable length meta-flow field mapping map (struct vl_mff_map) to
122 * the corresponding action decoding function.
123 *
c2d936a4
BP
124 * - Optional additional text enclosed in square brackets is commentary for
125 * the human reader.
126 */
127enum ofp_raw_action_type {
128/* ## ----------------- ## */
129/* ## Standard actions. ## */
130/* ## ----------------- ## */
131
132 /* OF1.0(0): struct ofp10_action_output. */
133 OFPAT_RAW10_OUTPUT,
134 /* OF1.1+(0): struct ofp11_action_output. */
135 OFPAT_RAW11_OUTPUT,
136
137 /* OF1.0(1): uint16_t. */
138 OFPAT_RAW10_SET_VLAN_VID,
139 /* OF1.0(2): uint8_t. */
140 OFPAT_RAW10_SET_VLAN_PCP,
141
142 /* OF1.1(1), OF1.2+(1) is deprecated (use Set-Field): uint16_t.
143 *
144 * [Semantics differ slightly between the 1.0 and 1.1 versions of the VLAN
145 * modification actions: the 1.0 versions push a VLAN header if none is
146 * present, but the 1.1 versions do not. That is the only reason that we
147 * distinguish their raw action types.] */
148 OFPAT_RAW11_SET_VLAN_VID,
149 /* OF1.1(2), OF1.2+(2) is deprecated (use Set-Field): uint8_t. */
150 OFPAT_RAW11_SET_VLAN_PCP,
151
152 /* OF1.1+(17): ovs_be16.
153 *
154 * [The argument is the Ethertype, e.g. ETH_TYPE_VLAN_8021Q, not the VID or
155 * TCI.] */
156 OFPAT_RAW11_PUSH_VLAN,
157
158 /* OF1.0(3): void. */
159 OFPAT_RAW10_STRIP_VLAN,
160 /* OF1.1+(18): void. */
161 OFPAT_RAW11_POP_VLAN,
162
163 /* OF1.0(4), OF1.1(3), OF1.2+(3) is deprecated (use Set-Field): struct
164 * ofp_action_dl_addr. */
165 OFPAT_RAW_SET_DL_SRC,
166
167 /* OF1.0(5), OF1.1(4), OF1.2+(4) is deprecated (use Set-Field): struct
168 * ofp_action_dl_addr. */
169 OFPAT_RAW_SET_DL_DST,
170
171 /* OF1.0(6), OF1.1(5), OF1.2+(5) is deprecated (use Set-Field):
172 * ovs_be32. */
173 OFPAT_RAW_SET_NW_SRC,
174
175 /* OF1.0(7), OF1.1(6), OF1.2+(6) is deprecated (use Set-Field):
176 * ovs_be32. */
177 OFPAT_RAW_SET_NW_DST,
178
179 /* OF1.0(8), OF1.1(7), OF1.2+(7) is deprecated (use Set-Field): uint8_t. */
180 OFPAT_RAW_SET_NW_TOS,
181
182 /* OF1.1(8), OF1.2+(8) is deprecated (use Set-Field): uint8_t. */
183 OFPAT_RAW11_SET_NW_ECN,
184
185 /* OF1.0(9), OF1.1(9), OF1.2+(9) is deprecated (use Set-Field):
186 * ovs_be16. */
187 OFPAT_RAW_SET_TP_SRC,
188
189 /* OF1.0(10), OF1.1(10), OF1.2+(10) is deprecated (use Set-Field):
190 * ovs_be16. */
191 OFPAT_RAW_SET_TP_DST,
192
193 /* OF1.0(11): struct ofp10_action_enqueue. */
194 OFPAT_RAW10_ENQUEUE,
195
196 /* NX1.0(30), OF1.1(13), OF1.2+(13) is deprecated (use Set-Field):
197 * ovs_be32. */
198 OFPAT_RAW_SET_MPLS_LABEL,
199
200 /* NX1.0(31), OF1.1(14), OF1.2+(14) is deprecated (use Set-Field):
201 * uint8_t. */
202 OFPAT_RAW_SET_MPLS_TC,
203
204 /* NX1.0(25), OF1.1(15), OF1.2+(15) is deprecated (use Set-Field):
205 * uint8_t. */
206 OFPAT_RAW_SET_MPLS_TTL,
207
208 /* NX1.0(26), OF1.1+(16): void. */
209 OFPAT_RAW_DEC_MPLS_TTL,
210
211 /* NX1.0(23), OF1.1+(19): ovs_be16.
212 *
213 * [The argument is the Ethertype, e.g. ETH_TYPE_MPLS, not the label.] */
214 OFPAT_RAW_PUSH_MPLS,
215
216 /* NX1.0(24), OF1.1+(20): ovs_be16.
217 *
218 * [The argument is the Ethertype, e.g. ETH_TYPE_IPV4 if at BoS or
219 * ETH_TYPE_MPLS otherwise, not the label.] */
220 OFPAT_RAW_POP_MPLS,
221
222 /* NX1.0(4), OF1.1+(21): uint32_t. */
223 OFPAT_RAW_SET_QUEUE,
224
88c8ca26
BP
225 /* NX1.0(40), OF1.1+(22): uint32_t. */
226 OFPAT_RAW_GROUP,
c2d936a4
BP
227
228 /* OF1.1+(23): uint8_t. */
229 OFPAT_RAW11_SET_NW_TTL,
230
231 /* NX1.0(18), OF1.1+(24): void. */
232 OFPAT_RAW_DEC_NW_TTL,
233 /* NX1.0+(21): struct nx_action_cnt_ids, ... */
234 NXAST_RAW_DEC_TTL_CNT_IDS,
235
04f48a68 236 /* OF1.2-1.4(25): struct ofp12_action_set_field, ... VLMFF */
c2d936a4 237 OFPAT_RAW12_SET_FIELD,
04f48a68 238 /* OF1.5+(25): struct ofp12_action_set_field, ... VLMFF */
7eb4b1f1 239 OFPAT_RAW15_SET_FIELD,
04f48a68 240 /* NX1.0-1.4(7): struct nx_action_reg_load. VLMFF
7eb4b1f1
BP
241 *
242 * [In OpenFlow 1.5, set_field is a superset of reg_load functionality, so
243 * we drop reg_load.] */
c2d936a4 244 NXAST_RAW_REG_LOAD,
04f48a68 245 /* NX1.0-1.4(33): struct ext_action_header, ... VLMFF
bad8a439
BP
246 *
247 * [In OpenFlow 1.5, set_field is a superset of reg_load2 functionality, so
248 * we drop reg_load2.] */
249 NXAST_RAW_REG_LOAD2,
c2d936a4 250
04f48a68 251 /* OF1.5+(28): struct ofp15_action_copy_field, ... VLMFF */
73178f20 252 OFPAT_RAW15_COPY_FIELD,
04f48a68 253 /* ONF1.3-1.4(3200): struct onf_action_copy_field, ... VLMFF */
914624f8 254 ONFACT_RAW13_COPY_FIELD,
04f48a68 255 /* NX1.0-1.4(6): struct nx_action_reg_move, ... VLMFF */
73178f20
BP
256 NXAST_RAW_REG_MOVE,
257
c2d936a4
BP
258/* ## ------------------------- ## */
259/* ## Nicira extension actions. ## */
260/* ## ------------------------- ## */
261
262/* Actions similar to standard actions are listed with the standard actions. */
263
264 /* NX1.0+(1): uint16_t. */
265 NXAST_RAW_RESUBMIT,
266 /* NX1.0+(14): struct nx_action_resubmit. */
267 NXAST_RAW_RESUBMIT_TABLE,
2cd20955
JR
268 /* NX1.0+(44): struct nx_action_resubmit. */
269 NXAST_RAW_RESUBMIT_TABLE_CT,
c2d936a4
BP
270
271 /* NX1.0+(2): uint32_t. */
272 NXAST_RAW_SET_TUNNEL,
273 /* NX1.0+(9): uint64_t. */
274 NXAST_RAW_SET_TUNNEL64,
275
276 /* NX1.0+(5): void. */
277 NXAST_RAW_POP_QUEUE,
278
c2d936a4
BP
279 /* NX1.0+(8): struct nx_action_note, ... */
280 NXAST_RAW_NOTE,
281
04f48a68 282 /* NX1.0+(10): struct nx_action_multipath. VLMFF */
c2d936a4
BP
283 NXAST_RAW_MULTIPATH,
284
285 /* NX1.0+(12): struct nx_action_bundle, ... */
286 NXAST_RAW_BUNDLE,
04f48a68 287 /* NX1.0+(13): struct nx_action_bundle, ... VLMFF */
c2d936a4
BP
288 NXAST_RAW_BUNDLE_LOAD,
289
04f48a68 290 /* NX1.0+(15): struct nx_action_output_reg. VLMFF */
c2d936a4 291 NXAST_RAW_OUTPUT_REG,
04f48a68 292 /* NX1.0+(32): struct nx_action_output_reg2. VLMFF */
bad8a439 293 NXAST_RAW_OUTPUT_REG2,
c2d936a4 294
04f48a68 295 /* NX1.0+(16): struct nx_action_learn, ... VLMFF */
c2d936a4 296 NXAST_RAW_LEARN,
4c71600d
DDP
297 /* NX1.0+(45): struct nx_action_learn2, ... VLMFF */
298 NXAST_RAW_LEARN2,
c2d936a4
BP
299
300 /* NX1.0+(17): void. */
301 NXAST_RAW_EXIT,
302
303 /* NX1.0+(19): struct nx_action_fin_timeout. */
304 NXAST_RAW_FIN_TIMEOUT,
305
306 /* NX1.0+(20): struct nx_action_controller. */
307 NXAST_RAW_CONTROLLER,
aad28f47 308 /* NX1.0+(37): struct ext_action_header, ... */
bdcad671 309 NXAST_RAW_CONTROLLER2,
c2d936a4
BP
310
311 /* NX1.0+(22): struct nx_action_write_metadata. */
312 NXAST_RAW_WRITE_METADATA,
313
04f48a68 314 /* NX1.0+(27): struct nx_action_stack. VLMFF */
c2d936a4
BP
315 NXAST_RAW_STACK_PUSH,
316
04f48a68 317 /* NX1.0+(28): struct nx_action_stack. VLMFF */
c2d936a4
BP
318 NXAST_RAW_STACK_POP,
319
320 /* NX1.0+(29): struct nx_action_sample. */
321 NXAST_RAW_SAMPLE,
f69f713b
BY
322 /* NX1.0+(38): struct nx_action_sample2. */
323 NXAST_RAW_SAMPLE2,
4930ea56
BP
324 /* NX1.0+(41): struct nx_action_sample2. */
325 NXAST_RAW_SAMPLE3,
18080541
BP
326
327 /* NX1.0+(34): struct nx_action_conjunction. */
328 NXAST_RAW_CONJUNCTION,
d4abaff5 329
04f48a68 330 /* NX1.0+(35): struct nx_action_conntrack, ... VLMFF */
07659514
JS
331 NXAST_RAW_CT,
332
9ac0aada
JR
333 /* NX1.0+(36): struct nx_action_nat, ... */
334 NXAST_RAW_NAT,
335
aaca4fe0
WT
336 /* NX1.0+(39): struct nx_action_output_trunc. */
337 NXAST_RAW_OUTPUT_TRUNC,
338
04f48a68 339 /* NX1.0+(42): struct ext_action_header, ... VLMFF */
7ae62a67
WT
340 NXAST_RAW_CLONE,
341
72fe7578
BP
342 /* NX1.0+(43): void. */
343 NXAST_RAW_CT_CLEAR,
344
f839892a
JS
345 /* NX1.3+(46): struct nx_action_encap, ... */
346 NXAST_RAW_ENCAP,
347
348 /* NX1.3+(47): struct nx_action_decap, ... */
349 NXAST_RAW_DECAP,
350
d4abaff5
BP
351/* ## ------------------ ## */
352/* ## Debugging actions. ## */
353/* ## ------------------ ## */
354
355/* These are intentionally undocumented, subject to change, and ovs-vswitchd */
356/* accepts them only if started with --enable-dummy. */
357
358 /* NX1.0+(255): void. */
359 NXAST_RAW_DEBUG_RECIRC,
c2d936a4
BP
360};
361
362/* OpenFlow actions are always a multiple of 8 bytes in length. */
363#define OFP_ACTION_ALIGN 8
364
365/* Define a few functions for working with instructions. */
366#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) \
367 static inline const struct STRUCT * OVS_UNUSED \
368 instruction_get_##ENUM(const struct ofp11_instruction *inst)\
369 { \
370 ovs_assert(inst->type == htons(ENUM)); \
371 return ALIGNED_CAST(struct STRUCT *, inst); \
372 } \
373 \
374 static inline void OVS_UNUSED \
375 instruction_init_##ENUM(struct STRUCT *s) \
376 { \
377 memset(s, 0, sizeof *s); \
378 s->type = htons(ENUM); \
379 s->len = htons(sizeof *s); \
380 } \
381 \
382 static inline struct STRUCT * OVS_UNUSED \
383 instruction_put_##ENUM(struct ofpbuf *buf) \
384 { \
385 struct STRUCT *s = ofpbuf_put_uninit(buf, sizeof *s); \
386 instruction_init_##ENUM(s); \
387 return s; \
388 }
389OVS_INSTRUCTIONS
390#undef DEFINE_INST
391
392static void ofpacts_update_instruction_actions(struct ofpbuf *openflow,
393 size_t ofs);
178742f9 394static void pad_ofpat(struct ofpbuf *openflow, size_t start_ofs);
c2d936a4
BP
395
396static enum ofperr ofpacts_verify(const struct ofpact[], size_t ofpacts_len,
d824b5b7
JS
397 uint32_t allowed_ovsinsts,
398 enum ofpact_type outer_action);
c2d936a4 399
128684a6
JR
400static void put_set_field(struct ofpbuf *openflow, enum ofp_version,
401 enum mf_field_id, uint64_t value);
c2d936a4 402
4b684612
BP
403static void put_reg_load(struct ofpbuf *openflow,
404 const struct mf_subfield *, uint64_t value);
405
c2d936a4
BP
406static enum ofperr ofpact_pull_raw(struct ofpbuf *, enum ofp_version,
407 enum ofp_raw_action_type *, uint64_t *arg);
408static void *ofpact_put_raw(struct ofpbuf *, enum ofp_version,
409 enum ofp_raw_action_type, uint64_t arg);
410
cab50449 411static char *OVS_WARN_UNUSED_RESULT ofpacts_parse(
50f96b10
BP
412 char *str, const struct ofputil_port_map *,
413 struct ofpbuf *ofpacts, enum ofputil_protocol *usable_protocols,
d824b5b7 414 bool allow_instructions, enum ofpact_type outer_action);
07659514
JS
415static enum ofperr ofpacts_pull_openflow_actions__(
416 struct ofpbuf *openflow, unsigned int actions_len,
417 enum ofp_version version, uint32_t allowed_ovsinsts,
04f48a68 418 struct ofpbuf *ofpacts, enum ofpact_type outer_action,
5c7c16d8 419 const struct vl_mff_map *vl_mff_map, uint64_t *ofpacts_tlv_bitmap);
8e53fe8c 420static char * OVS_WARN_UNUSED_RESULT ofpacts_parse_copy(
50f96b10 421 const char *s_, const struct ofputil_port_map *, struct ofpbuf *ofpacts,
8e53fe8c
JS
422 enum ofputil_protocol *usable_protocols,
423 bool allow_instructions, enum ofpact_type outer_action);
d824b5b7 424
4f20179d
BP
425/* Returns the ofpact following 'ofpact', except that if 'ofpact' contains
426 * nested ofpacts it returns the first one. */
427struct ofpact *
428ofpact_next_flattened(const struct ofpact *ofpact)
429{
430 switch (ofpact->type) {
431 case OFPACT_OUTPUT:
432 case OFPACT_GROUP:
433 case OFPACT_CONTROLLER:
434 case OFPACT_ENQUEUE:
435 case OFPACT_OUTPUT_REG:
aaca4fe0 436 case OFPACT_OUTPUT_TRUNC:
4f20179d
BP
437 case OFPACT_BUNDLE:
438 case OFPACT_SET_FIELD:
439 case OFPACT_SET_VLAN_VID:
440 case OFPACT_SET_VLAN_PCP:
441 case OFPACT_STRIP_VLAN:
442 case OFPACT_PUSH_VLAN:
443 case OFPACT_SET_ETH_SRC:
444 case OFPACT_SET_ETH_DST:
445 case OFPACT_SET_IPV4_SRC:
446 case OFPACT_SET_IPV4_DST:
447 case OFPACT_SET_IP_DSCP:
448 case OFPACT_SET_IP_ECN:
449 case OFPACT_SET_IP_TTL:
450 case OFPACT_SET_L4_SRC_PORT:
451 case OFPACT_SET_L4_DST_PORT:
452 case OFPACT_REG_MOVE:
453 case OFPACT_STACK_PUSH:
454 case OFPACT_STACK_POP:
455 case OFPACT_DEC_TTL:
456 case OFPACT_SET_MPLS_LABEL:
457 case OFPACT_SET_MPLS_TC:
458 case OFPACT_SET_MPLS_TTL:
459 case OFPACT_DEC_MPLS_TTL:
460 case OFPACT_PUSH_MPLS:
461 case OFPACT_POP_MPLS:
462 case OFPACT_SET_TUNNEL:
463 case OFPACT_SET_QUEUE:
464 case OFPACT_POP_QUEUE:
465 case OFPACT_FIN_TIMEOUT:
466 case OFPACT_RESUBMIT:
467 case OFPACT_LEARN:
468 case OFPACT_CONJUNCTION:
469 case OFPACT_MULTIPATH:
470 case OFPACT_NOTE:
471 case OFPACT_EXIT:
472 case OFPACT_SAMPLE:
473 case OFPACT_UNROLL_XLATE:
72fe7578 474 case OFPACT_CT_CLEAR:
4f20179d
BP
475 case OFPACT_DEBUG_RECIRC:
476 case OFPACT_METER:
477 case OFPACT_CLEAR_ACTIONS:
478 case OFPACT_WRITE_METADATA:
479 case OFPACT_GOTO_TABLE:
480 case OFPACT_NAT:
f839892a
JS
481 case OFPACT_ENCAP:
482 case OFPACT_DECAP:
4f20179d
BP
483 return ofpact_next(ofpact);
484
7ae62a67
WT
485 case OFPACT_CLONE:
486 return ofpact_get_CLONE(ofpact)->actions;
487
4f20179d
BP
488 case OFPACT_CT:
489 return ofpact_get_CT(ofpact)->actions;
490
491 case OFPACT_WRITE_ACTIONS:
492 return ofpact_get_WRITE_ACTIONS(ofpact)->actions;
493 }
494
495 OVS_NOT_REACHED();
496}
497
d824b5b7
JS
498/* Pull off existing actions or instructions. Used by nesting actions to keep
499 * ofpacts_parse() oblivious of actions nesting.
500 *
501 * Push the actions back on after nested parsing, e.g.:
502 *
503 * size_t ofs = ofpacts_pull(ofpacts);
504 * ...nested parsing...
505 * ofpbuf_push_uninit(ofpacts, ofs);
506 */
507static size_t
508ofpacts_pull(struct ofpbuf *ofpacts)
509{
510 size_t ofs;
511
d824b5b7
JS
512 ofs = ofpacts->size;
513 ofpbuf_pull(ofpacts, ofs);
514
515 return ofs;
516}
c2d936a4
BP
517
518#include "ofp-actions.inc1"
519\f
520/* Output actions. */
521
522/* Action structure for OFPAT10_OUTPUT, which sends packets out 'port'.
523 * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
524 * number of bytes to send. A 'max_len' of zero means no bytes of the
525 * packet should be sent. */
526struct ofp10_action_output {
527 ovs_be16 type; /* OFPAT10_OUTPUT. */
528 ovs_be16 len; /* Length is 8. */
529 ovs_be16 port; /* Output port. */
530 ovs_be16 max_len; /* Max length to send to controller. */
e45e72f1 531};
c2d936a4
BP
532OFP_ASSERT(sizeof(struct ofp10_action_output) == 8);
533
534/* Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
535 * When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
536 * number of bytes to send. A 'max_len' of zero means no bytes of the
537 * packet should be sent.*/
538struct ofp11_action_output {
539 ovs_be16 type; /* OFPAT11_OUTPUT. */
540 ovs_be16 len; /* Length is 16. */
541 ovs_be32 port; /* Output port. */
542 ovs_be16 max_len; /* Max length to send to controller. */
543 uint8_t pad[6]; /* Pad to 64 bits. */
544};
545OFP_ASSERT(sizeof(struct ofp11_action_output) == 16);
e45e72f1 546
f25d0cf3 547static enum ofperr
c2d936a4 548decode_OFPAT_RAW10_OUTPUT(const struct ofp10_action_output *oao,
f3cd3ac7 549 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4 550 struct ofpbuf *out)
f25d0cf3
BP
551{
552 struct ofpact_output *output;
553
554 output = ofpact_put_OUTPUT(out);
4e022ec0 555 output->port = u16_to_ofp(ntohs(oao->port));
f25d0cf3
BP
556 output->max_len = ntohs(oao->max_len);
557
57ad4e9e 558 return ofpact_check_output_port(output->port, OFPP_MAX);
f25d0cf3
BP
559}
560
561static enum ofperr
c2d936a4 562decode_OFPAT_RAW11_OUTPUT(const struct ofp11_action_output *oao,
f3cd3ac7
JS
563 enum ofp_version ofp_version OVS_UNUSED,
564 struct ofpbuf *out)
f25d0cf3 565{
c2d936a4
BP
566 struct ofpact_output *output;
567 enum ofperr error;
f25d0cf3 568
c2d936a4
BP
569 output = ofpact_put_OUTPUT(out);
570 output->max_len = ntohs(oao->max_len);
571
572 error = ofputil_port_from_ofp11(oao->port, &output->port);
573 if (error) {
574 return error;
f25d0cf3 575 }
c2d936a4
BP
576
577 return ofpact_check_output_port(output->port, OFPP_MAX);
f25d0cf3
BP
578}
579
580static void
c2d936a4
BP
581encode_OUTPUT(const struct ofpact_output *output,
582 enum ofp_version ofp_version, struct ofpbuf *out)
f25d0cf3 583{
c2d936a4
BP
584 if (ofp_version == OFP10_VERSION) {
585 struct ofp10_action_output *oao;
f25d0cf3 586
c2d936a4
BP
587 oao = put_OFPAT10_OUTPUT(out);
588 oao->port = htons(ofp_to_u16(output->port));
589 oao->max_len = htons(output->max_len);
590 } else {
591 struct ofp11_action_output *oao;
592
593 oao = put_OFPAT11_OUTPUT(out);
594 oao->port = ofputil_port_to_ofp11(output->port);
595 oao->max_len = htons(output->max_len);
596 }
f25d0cf3
BP
597}
598
aaca4fe0
WT
599static char * OVS_WARN_UNUSED_RESULT
600parse_truncate_subfield(struct ofpact_output_trunc *output_trunc,
50f96b10
BP
601 const char *arg_,
602 const struct ofputil_port_map *port_map)
aaca4fe0
WT
603{
604 char *key, *value;
605 char *arg = CONST_CAST(char *, arg_);
606
607 while (ofputil_parse_key_value(&arg, &key, &value)) {
608 if (!strcmp(key, "port")) {
50f96b10
BP
609 if (!ofputil_port_from_string(value, port_map,
610 &output_trunc->port)) {
aaca4fe0
WT
611 return xasprintf("output to unknown truncate port: %s",
612 value);
613 }
614 if (ofp_to_u16(output_trunc->port) > ofp_to_u16(OFPP_MAX)) {
615 if (output_trunc->port != OFPP_LOCAL &&
616 output_trunc->port != OFPP_IN_PORT)
617 return xasprintf("output to unsupported truncate port: %s",
618 value);
619 }
620 } else if (!strcmp(key, "max_len")) {
621 char *err;
622
623 err = str_to_u32(value, &output_trunc->max_len);
624 if (err) {
625 return err;
626 }
627 } else {
628 return xasprintf("invalid key '%s' in output_trunc argument",
629 key);
630 }
631 }
632 return NULL;
633}
634
cab50449 635static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
636parse_OUTPUT(const char *arg,
637 const struct ofputil_port_map *port_map,
638 struct ofpbuf *ofpacts,
c2d936a4 639 enum ofputil_protocol *usable_protocols OVS_UNUSED)
f25d0cf3 640{
21b2fa61 641 if (strstr(arg, "port") && strstr(arg, "max_len")) {
aaca4fe0
WT
642 struct ofpact_output_trunc *output_trunc;
643
644 output_trunc = ofpact_put_OUTPUT_TRUNC(ofpacts);
50f96b10 645 return parse_truncate_subfield(output_trunc, arg, port_map);
7df14f8b 646 }
c2d936a4 647
7df14f8b
BP
648 ofp_port_t port;
649 if (ofputil_port_from_string(arg, port_map, &port)) {
650 struct ofpact_output *output = ofpact_put_OUTPUT(ofpacts);
651 output->port = port;
652 output->max_len = output->port == OFPP_CONTROLLER ? UINT16_MAX : 0;
c2d936a4 653 return NULL;
f25d0cf3 654 }
7df14f8b
BP
655
656 struct mf_subfield src;
657 char *error = mf_parse_subfield(&src, arg);
658 if (!error) {
659 struct ofpact_output_reg *output_reg;
660
661 output_reg = ofpact_put_OUTPUT_REG(ofpacts);
662 output_reg->max_len = UINT16_MAX;
663 output_reg->src = src;
664 return NULL;
665 }
666 free(error);
667
668 return xasprintf("%s: output to unknown port", arg);
c2d936a4 669}
f25d0cf3 670
c2d936a4 671static void
50f96b10
BP
672format_OUTPUT(const struct ofpact_output *a,
673 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4
BP
674{
675 if (ofp_to_u16(a->port) < ofp_to_u16(OFPP_MAX)) {
50f96b10
BP
676 ds_put_format(s, "%soutput:%s", colors.special, colors.end);
677 }
678 ofputil_format_port(a->port, port_map, s);
679 if (a->port == OFPP_CONTROLLER) {
680 ds_put_format(s, ":%"PRIu16, a->max_len);
c2d936a4 681 }
f25d0cf3 682}
c2d936a4
BP
683\f
684/* Group actions. */
f25d0cf3
BP
685
686static enum ofperr
88c8ca26 687decode_OFPAT_RAW_GROUP(uint32_t group_id,
f3cd3ac7
JS
688 enum ofp_version ofp_version OVS_UNUSED,
689 struct ofpbuf *out)
f25d0cf3 690{
c2d936a4
BP
691 ofpact_put_GROUP(out)->group_id = group_id;
692 return 0;
693}
f25d0cf3 694
c2d936a4
BP
695static void
696encode_GROUP(const struct ofpact_group *group,
697 enum ofp_version ofp_version, struct ofpbuf *out)
698{
88c8ca26 699 put_OFPAT_GROUP(out, ofp_version, group->group_id);
c2d936a4 700}
f25d0cf3 701
cab50449 702static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
703parse_GROUP(char *arg,
704 const struct ofputil_port_map *port_map OVS_UNUSED,
705 struct ofpbuf *ofpacts,
706 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4
BP
707{
708 return str_to_u32(arg, &ofpact_put_GROUP(ofpacts)->group_id);
f25d0cf3
BP
709}
710
711static void
50f96b10
BP
712format_GROUP(const struct ofpact_group *a,
713 const struct ofputil_port_map *port_map OVS_UNUSED,
714 struct ds *s)
f25d0cf3 715{
b1c5bf1f
QM
716 ds_put_format(s, "%sgroup:%s%"PRIu32,
717 colors.special, colors.end, a->group_id);
f25d0cf3 718}
c2d936a4
BP
719\f
720/* Action structure for NXAST_CONTROLLER.
721 *
722 * This generalizes using OFPAT_OUTPUT to send a packet to OFPP_CONTROLLER. In
723 * addition to the 'max_len' that OFPAT_OUTPUT supports, it also allows
724 * specifying:
725 *
726 * - 'reason': The reason code to use in the ofp_packet_in or nx_packet_in.
727 *
728 * - 'controller_id': The ID of the controller connection to which the
729 * ofp_packet_in should be sent. The ofp_packet_in or nx_packet_in is
730 * sent only to controllers that have the specified controller connection
731 * ID. See "struct nx_controller_id" for more information. */
732struct nx_action_controller {
733 ovs_be16 type; /* OFPAT_VENDOR. */
734 ovs_be16 len; /* Length is 16. */
735 ovs_be32 vendor; /* NX_VENDOR_ID. */
736 ovs_be16 subtype; /* NXAST_CONTROLLER. */
737 ovs_be16 max_len; /* Maximum length to send to controller. */
738 ovs_be16 controller_id; /* Controller ID to send packet-in. */
739 uint8_t reason; /* enum ofp_packet_in_reason (OFPR_*). */
740 uint8_t zero; /* Must be zero. */
741};
742OFP_ASSERT(sizeof(struct nx_action_controller) == 16);
f25d0cf3 743
77ab5fd2
BP
744/* Properties for NXAST_CONTROLLER2.
745 *
746 * For more information on the effect of NXAC2PT_PAUSE, see the large comment
747 * on NXT_PACKET_IN2 in nicira-ext.h */
bdcad671
BP
748enum nx_action_controller2_prop_type {
749 NXAC2PT_MAX_LEN, /* ovs_be16 max bytes to send (default all). */
750 NXAC2PT_CONTROLLER_ID, /* ovs_be16 dest controller ID (default 0). */
751 NXAC2PT_REASON, /* uint8_t reason (OFPR_*), default 0. */
752 NXAC2PT_USERDATA, /* Data to copy into NXPINT_USERDATA. */
77ab5fd2 753 NXAC2PT_PAUSE, /* Flag to pause pipeline to resume later. */
bdcad671
BP
754};
755
aad28f47
BP
756/* The action structure for NXAST_CONTROLLER2 is "struct ext_action_header",
757 * followed by NXAC2PT_* properties. */
bdcad671 758
c2d936a4
BP
759static enum ofperr
760decode_NXAST_RAW_CONTROLLER(const struct nx_action_controller *nac,
f3cd3ac7 761 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4 762 struct ofpbuf *out)
f25d0cf3
BP
763{
764 struct ofpact_controller *oc;
765
766 oc = ofpact_put_CONTROLLER(out);
bdcad671 767 oc->ofpact.raw = NXAST_RAW_CONTROLLER;
f25d0cf3
BP
768 oc->max_len = ntohs(nac->max_len);
769 oc->controller_id = ntohs(nac->controller_id);
770 oc->reason = nac->reason;
ce058104 771 ofpact_finish_CONTROLLER(out, &oc);
bdcad671
BP
772
773 return 0;
774}
775
776static enum ofperr
aad28f47 777decode_NXAST_RAW_CONTROLLER2(const struct ext_action_header *eah,
bdcad671
BP
778 enum ofp_version ofp_version OVS_UNUSED,
779 struct ofpbuf *out)
780{
aad28f47 781 if (!is_all_zeros(eah->pad, sizeof eah->pad)) {
bdcad671
BP
782 return OFPERR_NXBRC_MUST_BE_ZERO;
783 }
784
785 size_t start_ofs = out->size;
786 struct ofpact_controller *oc = ofpact_put_CONTROLLER(out);
787 oc->ofpact.raw = NXAST_RAW_CONTROLLER2;
788 oc->max_len = UINT16_MAX;
789 oc->reason = OFPR_ACTION;
790
791 struct ofpbuf properties;
aad28f47
BP
792 ofpbuf_use_const(&properties, eah, ntohs(eah->len));
793 ofpbuf_pull(&properties, sizeof *eah);
bdcad671
BP
794
795 while (properties.size > 0) {
796 struct ofpbuf payload;
797 uint64_t type;
798
799 enum ofperr error = ofpprop_pull(&properties, &payload, &type);
800 if (error) {
801 return error;
802 }
803
804 switch (type) {
805 case NXAC2PT_MAX_LEN:
806 error = ofpprop_parse_u16(&payload, &oc->max_len);
807 break;
808
809 case NXAC2PT_CONTROLLER_ID:
810 error = ofpprop_parse_u16(&payload, &oc->controller_id);
811 break;
812
813 case NXAC2PT_REASON: {
814 uint8_t u8;
815 error = ofpprop_parse_u8(&payload, &u8);
816 oc->reason = u8;
817 break;
818 }
819
820 case NXAC2PT_USERDATA:
821 out->size = start_ofs + OFPACT_CONTROLLER_SIZE;
822 ofpbuf_put(out, payload.msg, ofpbuf_msgsize(&payload));
823 oc = ofpbuf_at_assert(out, start_ofs, sizeof *oc);
824 oc->userdata_len = ofpbuf_msgsize(&payload);
825 break;
826
77ab5fd2
BP
827 case NXAC2PT_PAUSE:
828 oc->pause = true;
829 break;
830
bdcad671
BP
831 default:
832 error = OFPPROP_UNKNOWN(false, "NXAST_RAW_CONTROLLER2", type);
833 break;
834 }
835 if (error) {
836 return error;
837 }
838 }
839
ce058104 840 ofpact_finish_CONTROLLER(out, &oc);
bdcad671 841
c2d936a4 842 return 0;
f25d0cf3
BP
843}
844
c2d936a4
BP
845static void
846encode_CONTROLLER(const struct ofpact_controller *controller,
847 enum ofp_version ofp_version OVS_UNUSED,
848 struct ofpbuf *out)
4cceacb9 849{
bdcad671 850 if (controller->userdata_len
77ab5fd2 851 || controller->pause
bdcad671
BP
852 || controller->ofpact.raw == NXAST_RAW_CONTROLLER2) {
853 size_t start_ofs = out->size;
854 put_NXAST_CONTROLLER2(out);
855 if (controller->max_len != UINT16_MAX) {
856 ofpprop_put_u16(out, NXAC2PT_MAX_LEN, controller->max_len);
857 }
858 if (controller->controller_id != 0) {
859 ofpprop_put_u16(out, NXAC2PT_CONTROLLER_ID,
860 controller->controller_id);
861 }
862 if (controller->reason != OFPR_ACTION) {
863 ofpprop_put_u8(out, NXAC2PT_REASON, controller->reason);
864 }
865 if (controller->userdata_len != 0) {
866 ofpprop_put(out, NXAC2PT_USERDATA, controller->userdata,
867 controller->userdata_len);
868 }
77ab5fd2
BP
869 if (controller->pause) {
870 ofpprop_put_flag(out, NXAC2PT_PAUSE);
871 }
bdcad671
BP
872 pad_ofpat(out, start_ofs);
873 } else {
874 struct nx_action_controller *nac;
4cceacb9 875
bdcad671
BP
876 nac = put_NXAST_CONTROLLER(out);
877 nac->max_len = htons(controller->max_len);
878 nac->controller_id = htons(controller->controller_id);
879 nac->reason = controller->reason;
880 }
c2d936a4
BP
881}
882
cab50449 883static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
884parse_CONTROLLER(char *arg,
885 const struct ofputil_port_map *port_map OVS_UNUSED,
886 struct ofpbuf *ofpacts,
887 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4
BP
888{
889 enum ofp_packet_in_reason reason = OFPR_ACTION;
890 uint16_t controller_id = 0;
891 uint16_t max_len = UINT16_MAX;
bdcad671 892 const char *userdata = NULL;
77ab5fd2 893 bool pause = false;
c2d936a4
BP
894
895 if (!arg[0]) {
896 /* Use defaults. */
897 } else if (strspn(arg, "0123456789") == strlen(arg)) {
898 char *error = str_to_u16(arg, "max_len", &max_len);
899 if (error) {
900 return error;
901 }
902 } else {
903 char *name, *value;
904
905 while (ofputil_parse_key_value(&arg, &name, &value)) {
906 if (!strcmp(name, "reason")) {
907 if (!ofputil_packet_in_reason_from_string(value, &reason)) {
908 return xasprintf("unknown reason \"%s\"", value);
909 }
910 } else if (!strcmp(name, "max_len")) {
911 char *error = str_to_u16(value, "max_len", &max_len);
912 if (error) {
913 return error;
914 }
915 } else if (!strcmp(name, "id")) {
916 char *error = str_to_u16(value, "id", &controller_id);
917 if (error) {
918 return error;
919 }
bdcad671
BP
920 } else if (!strcmp(name, "userdata")) {
921 userdata = value;
77ab5fd2
BP
922 } else if (!strcmp(name, "pause")) {
923 pause = true;
c2d936a4
BP
924 } else {
925 return xasprintf("unknown key \"%s\" parsing controller "
926 "action", name);
927 }
928 }
4cceacb9
JS
929 }
930
77ab5fd2 931 if (reason == OFPR_ACTION && controller_id == 0 && !userdata && !pause) {
c2d936a4 932 struct ofpact_output *output;
4cceacb9 933
c2d936a4
BP
934 output = ofpact_put_OUTPUT(ofpacts);
935 output->port = OFPP_CONTROLLER;
936 output->max_len = max_len;
937 } else {
938 struct ofpact_controller *controller;
939
940 controller = ofpact_put_CONTROLLER(ofpacts);
941 controller->max_len = max_len;
942 controller->reason = reason;
943 controller->controller_id = controller_id;
77ab5fd2 944 controller->pause = pause;
bdcad671
BP
945
946 if (userdata) {
947 size_t start_ofs = ofpacts->size;
948 const char *end = ofpbuf_put_hex(ofpacts, userdata, NULL);
949 if (*end) {
950 return xstrdup("bad hex digit in `controller' "
951 "action `userdata'");
952 }
953 size_t userdata_len = ofpacts->size - start_ofs;
954 controller = ofpacts->header;
955 controller->userdata_len = userdata_len;
956 }
ce058104 957 ofpact_finish_CONTROLLER(ofpacts, &controller);
c2d936a4
BP
958 }
959
960 return NULL;
4cceacb9
JS
961}
962
bdcad671
BP
963static void
964format_hex_arg(struct ds *s, const uint8_t *data, size_t len)
965{
966 for (size_t i = 0; i < len; i++) {
967 if (i) {
968 ds_put_char(s, '.');
969 }
970 ds_put_format(s, "%02"PRIx8, data[i]);
971 }
972}
973
f25d0cf3 974static void
50f96b10
BP
975format_CONTROLLER(const struct ofpact_controller *a,
976 const struct ofputil_port_map *port_map OVS_UNUSED,
977 struct ds *s)
f25d0cf3 978{
77ab5fd2
BP
979 if (a->reason == OFPR_ACTION && !a->controller_id && !a->userdata_len
980 && !a->pause) {
b1c5bf1f
QM
981 ds_put_format(s, "%sCONTROLLER:%s%"PRIu16,
982 colors.special, colors.end, a->max_len);
c2d936a4
BP
983 } else {
984 enum ofp_packet_in_reason reason = a->reason;
f25d0cf3 985
b1c5bf1f 986 ds_put_format(s, "%scontroller(%s", colors.paren, colors.end);
c2d936a4
BP
987 if (reason != OFPR_ACTION) {
988 char reasonbuf[OFPUTIL_PACKET_IN_REASON_BUFSIZE];
989
b1c5bf1f 990 ds_put_format(s, "%sreason=%s%s,", colors.param, colors.end,
c2d936a4
BP
991 ofputil_packet_in_reason_to_string(
992 reason, reasonbuf, sizeof reasonbuf));
993 }
994 if (a->max_len != UINT16_MAX) {
b1c5bf1f
QM
995 ds_put_format(s, "%smax_len=%s%"PRIu16",",
996 colors.param, colors.end, a->max_len);
c2d936a4
BP
997 }
998 if (a->controller_id != 0) {
b1c5bf1f
QM
999 ds_put_format(s, "%sid=%s%"PRIu16",",
1000 colors.param, colors.end, a->controller_id);
c2d936a4 1001 }
bdcad671 1002 if (a->userdata_len) {
b1c5bf1f 1003 ds_put_format(s, "%suserdata=%s", colors.param, colors.end);
bdcad671
BP
1004 format_hex_arg(s, a->userdata, a->userdata_len);
1005 ds_put_char(s, ',');
1006 }
77ab5fd2 1007 if (a->pause) {
b1c5bf1f 1008 ds_put_format(s, "%spause%s,", colors.value, colors.end);
77ab5fd2 1009 }
c2d936a4 1010 ds_chomp(s, ',');
b1c5bf1f 1011 ds_put_format(s, "%s)%s", colors.paren, colors.end);
c2d936a4 1012 }
f25d0cf3 1013}
c2d936a4
BP
1014\f
1015/* Enqueue action. */
1016struct ofp10_action_enqueue {
1017 ovs_be16 type; /* OFPAT10_ENQUEUE. */
1018 ovs_be16 len; /* Len is 16. */
1019 ovs_be16 port; /* Port that queue belongs. Should
1020 refer to a valid physical port
1021 (i.e. < OFPP_MAX) or OFPP_IN_PORT. */
1022 uint8_t pad[6]; /* Pad for 64-bit alignment. */
1023 ovs_be32 queue_id; /* Where to enqueue the packets. */
1024};
1025OFP_ASSERT(sizeof(struct ofp10_action_enqueue) == 16);
f25d0cf3 1026
c2d967a5 1027static enum ofperr
c2d936a4 1028decode_OFPAT_RAW10_ENQUEUE(const struct ofp10_action_enqueue *oae,
f3cd3ac7 1029 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4 1030 struct ofpbuf *out)
c2d967a5 1031{
c2d936a4 1032 struct ofpact_enqueue *enqueue;
c2d967a5 1033
c2d936a4
BP
1034 enqueue = ofpact_put_ENQUEUE(out);
1035 enqueue->port = u16_to_ofp(ntohs(oae->port));
1036 enqueue->queue = ntohl(oae->queue_id);
1037 if (ofp_to_u16(enqueue->port) >= ofp_to_u16(OFPP_MAX)
1038 && enqueue->port != OFPP_IN_PORT
1039 && enqueue->port != OFPP_LOCAL) {
1040 return OFPERR_OFPBAC_BAD_OUT_PORT;
1041 }
1042 return 0;
c2d967a5
MM
1043}
1044
c2d936a4
BP
1045static void
1046encode_ENQUEUE(const struct ofpact_enqueue *enqueue,
1047 enum ofp_version ofp_version, struct ofpbuf *out)
c2d967a5 1048{
c2d936a4
BP
1049 if (ofp_version == OFP10_VERSION) {
1050 struct ofp10_action_enqueue *oae;
c2d967a5 1051
c2d936a4
BP
1052 oae = put_OFPAT10_ENQUEUE(out);
1053 oae->port = htons(ofp_to_u16(enqueue->port));
1054 oae->queue_id = htonl(enqueue->queue);
1055 } else {
0f2aaee9
BP
1056 put_OFPAT_SET_QUEUE(out, ofp_version, enqueue->queue);
1057
1058 struct ofp11_action_output *oao = put_OFPAT11_OUTPUT(out);
1059 oao->port = ofputil_port_to_ofp11(enqueue->port);
1060 oao->max_len = OVS_BE16_MAX;
1061
1062 put_NXAST_POP_QUEUE(out);
c2d967a5 1063 }
c2d936a4 1064}
c2d967a5 1065
cab50449 1066static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1067parse_ENQUEUE(char *arg,
1068 const struct ofputil_port_map *port_map,
1069 struct ofpbuf *ofpacts,
c2d936a4
BP
1070 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1071{
1072 char *sp = NULL;
1073 char *port = strtok_r(arg, ":q,", &sp);
1074 char *queue = strtok_r(NULL, "", &sp);
1075 struct ofpact_enqueue *enqueue;
c2d967a5 1076
c2d936a4
BP
1077 if (port == NULL || queue == NULL) {
1078 return xstrdup("\"enqueue\" syntax is \"enqueue:PORT:QUEUE\" or "
1079 "\"enqueue(PORT,QUEUE)\"");
c2d967a5
MM
1080 }
1081
c2d936a4 1082 enqueue = ofpact_put_ENQUEUE(ofpacts);
50f96b10 1083 if (!ofputil_port_from_string(port, port_map, &enqueue->port)) {
c2d936a4
BP
1084 return xasprintf("%s: enqueue to unknown port", port);
1085 }
1086 return str_to_u32(queue, &enqueue->queue);
c2d967a5
MM
1087}
1088
c2d936a4 1089static void
50f96b10
BP
1090format_ENQUEUE(const struct ofpact_enqueue *a,
1091 const struct ofputil_port_map *port_map, struct ds *s)
29089a54 1092{
b1c5bf1f 1093 ds_put_format(s, "%senqueue:%s", colors.param, colors.end);
50f96b10 1094 ofputil_format_port(a->port, port_map, s);
c2d936a4
BP
1095 ds_put_format(s, ":%"PRIu32, a->queue);
1096}
1097\f
1098/* Action structure for NXAST_OUTPUT_REG.
1099 *
1100 * Outputs to the OpenFlow port number written to src[ofs:ofs+nbits].
1101 *
1102 * The format and semantics of 'src' and 'ofs_nbits' are similar to those for
1103 * the NXAST_REG_LOAD action.
1104 *
1105 * The acceptable nxm_header values for 'src' are the same as the acceptable
1106 * nxm_header values for the 'src' field of NXAST_REG_MOVE.
1107 *
1108 * The 'max_len' field indicates the number of bytes to send when the chosen
1109 * port is OFPP_CONTROLLER. Its semantics are equivalent to the 'max_len'
1110 * field of OFPAT_OUTPUT.
1111 *
1112 * The 'zero' field is required to be zeroed for forward compatibility. */
1113struct nx_action_output_reg {
1114 ovs_be16 type; /* OFPAT_VENDOR. */
1115 ovs_be16 len; /* 24. */
1116 ovs_be32 vendor; /* NX_VENDOR_ID. */
1117 ovs_be16 subtype; /* NXAST_OUTPUT_REG. */
29089a54 1118
c2d936a4
BP
1119 ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */
1120 ovs_be32 src; /* Source. */
29089a54 1121
c2d936a4 1122 ovs_be16 max_len; /* Max length to send to controller. */
29089a54 1123
c2d936a4
BP
1124 uint8_t zero[6]; /* Reserved, must be zero. */
1125};
1126OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24);
29089a54 1127
bad8a439
BP
1128/* Action structure for NXAST_OUTPUT_REG2.
1129 *
1130 * Like the NXAST_OUTPUT_REG but organized so that there is room for a 64-bit
1131 * experimenter OXM as 'src'.
1132 */
1133struct nx_action_output_reg2 {
1134 ovs_be16 type; /* OFPAT_VENDOR. */
1135 ovs_be16 len; /* 24. */
1136 ovs_be32 vendor; /* NX_VENDOR_ID. */
1137 ovs_be16 subtype; /* NXAST_OUTPUT_REG2. */
1138
1139 ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */
1140 ovs_be16 max_len; /* Max length to send to controller. */
1141
1142 /* Followed by:
1143 * - 'src', as an OXM/NXM header (either 4 or 8 bytes).
1144 * - Enough 0-bytes to pad the action out to 24 bytes. */
1145 uint8_t pad[10];
1146};
1147OFP_ASSERT(sizeof(struct nx_action_output_reg2) == 24);
1148
a7a2d006 1149static enum ofperr
c2d936a4 1150decode_NXAST_RAW_OUTPUT_REG(const struct nx_action_output_reg *naor,
f3cd3ac7 1151 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 1152 const struct vl_mff_map *vl_mff_map,
5c7c16d8 1153 uint64_t *tlv_bitmap, struct ofpbuf *out)
a7a2d006 1154{
c2d936a4 1155 struct ofpact_output_reg *output_reg;
5c7c16d8 1156 enum ofperr error;
a7a2d006 1157
c2d936a4 1158 if (!is_all_zeros(naor->zero, sizeof naor->zero)) {
a7a2d006
JS
1159 return OFPERR_OFPBAC_BAD_ARGUMENT;
1160 }
a7a2d006 1161
c2d936a4 1162 output_reg = ofpact_put_OUTPUT_REG(out);
bad8a439 1163 output_reg->ofpact.raw = NXAST_RAW_OUTPUT_REG;
c2d936a4
BP
1164 output_reg->src.ofs = nxm_decode_ofs(naor->ofs_nbits);
1165 output_reg->src.n_bits = nxm_decode_n_bits(naor->ofs_nbits);
1166 output_reg->max_len = ntohs(naor->max_len);
5c7c16d8
YHW
1167 error = mf_vl_mff_mf_from_nxm_header(ntohl(naor->src), vl_mff_map,
1168 &output_reg->src.field, tlv_bitmap);
1169 if (error) {
1170 return error;
04f48a68
YHW
1171 }
1172
c2d936a4 1173 return mf_check_src(&output_reg->src, NULL);
a7a2d006
JS
1174}
1175
bad8a439
BP
1176static enum ofperr
1177decode_NXAST_RAW_OUTPUT_REG2(const struct nx_action_output_reg2 *naor,
f3cd3ac7 1178 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 1179 const struct vl_mff_map *vl_mff_map,
5c7c16d8 1180 uint64_t *tlv_bitmap, struct ofpbuf *out)
bad8a439
BP
1181{
1182 struct ofpact_output_reg *output_reg;
5c7c16d8
YHW
1183 enum ofperr error;
1184
bad8a439
BP
1185 output_reg = ofpact_put_OUTPUT_REG(out);
1186 output_reg->ofpact.raw = NXAST_RAW_OUTPUT_REG2;
1187 output_reg->src.ofs = nxm_decode_ofs(naor->ofs_nbits);
1188 output_reg->src.n_bits = nxm_decode_n_bits(naor->ofs_nbits);
1189 output_reg->max_len = ntohs(naor->max_len);
1190
0a2869d5 1191 struct ofpbuf b = ofpbuf_const_initializer(naor, ntohs(naor->len));
bad8a439 1192 ofpbuf_pull(&b, OBJECT_OFFSETOF(naor, pad));
0a2869d5 1193
5c7c16d8
YHW
1194 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map, &output_reg->src.field,
1195 NULL, tlv_bitmap);
bad8a439
BP
1196 if (error) {
1197 return error;
1198 }
5c7c16d8 1199
6fd6ed71 1200 if (!is_all_zeros(b.data, b.size)) {
bad8a439
BP
1201 return OFPERR_NXBRC_MUST_BE_ZERO;
1202 }
1203
1204 return mf_check_src(&output_reg->src, NULL);
1205}
1206
c2d936a4
BP
1207static void
1208encode_OUTPUT_REG(const struct ofpact_output_reg *output_reg,
1209 enum ofp_version ofp_version OVS_UNUSED,
1210 struct ofpbuf *out)
f25d0cf3 1211{
bad8a439
BP
1212 /* If 'output_reg' came in as an NXAST_RAW_OUTPUT_REG2 action, or if it
1213 * cannot be encoded in the older form, encode it as
1214 * NXAST_RAW_OUTPUT_REG2. */
1215 if (output_reg->ofpact.raw == NXAST_RAW_OUTPUT_REG2
1216 || !mf_nxm_header(output_reg->src.field->id)) {
1217 struct nx_action_output_reg2 *naor = put_NXAST_OUTPUT_REG2(out);
6fd6ed71 1218 size_t size = out->size;
bad8a439
BP
1219
1220 naor->ofs_nbits = nxm_encode_ofs_nbits(output_reg->src.ofs,
1221 output_reg->src.n_bits);
1222 naor->max_len = htons(output_reg->max_len);
1223
6fd6ed71 1224 out->size = size - sizeof naor->pad;
04f48a68 1225 nx_put_mff_header(out, output_reg->src.field, 0, false);
6fd6ed71 1226 out->size = size;
bad8a439
BP
1227 } else {
1228 struct nx_action_output_reg *naor = put_NXAST_OUTPUT_REG(out);
f25d0cf3 1229
bad8a439
BP
1230 naor->ofs_nbits = nxm_encode_ofs_nbits(output_reg->src.ofs,
1231 output_reg->src.n_bits);
04f48a68 1232 naor->src = htonl(nxm_header_from_mff(output_reg->src.field));
bad8a439
BP
1233 naor->max_len = htons(output_reg->max_len);
1234 }
f25d0cf3
BP
1235}
1236
cab50449 1237static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1238parse_OUTPUT_REG(const char *arg,
1239 const struct ofputil_port_map *port_map,
1240 struct ofpbuf *ofpacts,
c2d936a4 1241 enum ofputil_protocol *usable_protocols OVS_UNUSED)
f25d0cf3 1242{
50f96b10 1243 return parse_OUTPUT(arg, port_map, ofpacts, usable_protocols);
f25d0cf3
BP
1244}
1245
c2d936a4 1246static void
50f96b10
BP
1247format_OUTPUT_REG(const struct ofpact_output_reg *a,
1248 const struct ofputil_port_map *port_map OVS_UNUSED,
1249 struct ds *s)
f25d0cf3 1250{
b1c5bf1f 1251 ds_put_format(s, "%soutput:%s", colors.special, colors.end);
c2d936a4
BP
1252 mf_format_subfield(&a->src, s);
1253}
1254\f
1255/* Action structure for NXAST_BUNDLE and NXAST_BUNDLE_LOAD.
1256 *
1257 * The bundle actions choose a slave from a supplied list of options.
1258 * NXAST_BUNDLE outputs to its selection. NXAST_BUNDLE_LOAD writes its
1259 * selection to a register.
1260 *
1261 * The list of possible slaves follows the nx_action_bundle structure. The size
1262 * of each slave is governed by its type as indicated by the 'slave_type'
1263 * parameter. The list of slaves should be padded at its end with zeros to make
1264 * the total length of the action a multiple of 8.
1265 *
1266 * Switches infer from the 'slave_type' parameter the size of each slave. All
1267 * implementations must support the NXM_OF_IN_PORT 'slave_type' which indicates
1268 * that the slaves are OpenFlow port numbers with NXM_LENGTH(NXM_OF_IN_PORT) ==
1269 * 2 byte width. Switches should reject actions which indicate unknown or
1270 * unsupported slave types.
1271 *
1272 * Switches use a strategy dictated by the 'algorithm' parameter to choose a
1273 * slave. If the switch does not support the specified 'algorithm' parameter,
1274 * it should reject the action.
1275 *
1276 * Several algorithms take into account liveness when selecting slaves. The
1277 * liveness of a slave is implementation defined (with one exception), but will
1278 * generally take into account things like its carrier status and the results
1279 * of any link monitoring protocols which happen to be running on it. In order
1280 * to give controllers a place-holder value, the OFPP_NONE port is always
63460a30
TLSC
1281 * considered live, that is, NXAST_BUNDLE_LOAD stores OFPP_NONE in the output
1282 * register if no slave is live.
c2d936a4
BP
1283 *
1284 * Some slave selection strategies require the use of a hash function, in which
1285 * case the 'fields' and 'basis' parameters should be populated. The 'fields'
1286 * parameter (one of NX_HASH_FIELDS_*) designates which parts of the flow to
1287 * hash. Refer to the definition of "enum nx_hash_fields" for details. The
1288 * 'basis' parameter is used as a universal hash parameter. Different values
1289 * of 'basis' yield different hash results.
1290 *
1291 * The 'zero' parameter at the end of the action structure is reserved for
1292 * future use. Switches are required to reject actions which have nonzero
1293 * bytes in the 'zero' field.
1294 *
1295 * NXAST_BUNDLE actions should have 'ofs_nbits' and 'dst' zeroed. Switches
1296 * should reject actions which have nonzero bytes in either of these fields.
1297 *
1298 * NXAST_BUNDLE_LOAD stores the OpenFlow port number of the selected slave in
1299 * dst[ofs:ofs+n_bits]. The format and semantics of 'dst' and 'ofs_nbits' are
1300 * similar to those for the NXAST_REG_LOAD action. */
1301struct nx_action_bundle {
1302 ovs_be16 type; /* OFPAT_VENDOR. */
1303 ovs_be16 len; /* Length including slaves. */
1304 ovs_be32 vendor; /* NX_VENDOR_ID. */
1305 ovs_be16 subtype; /* NXAST_BUNDLE or NXAST_BUNDLE_LOAD. */
f25d0cf3 1306
c2d936a4
BP
1307 /* Slave choice algorithm to apply to hash value. */
1308 ovs_be16 algorithm; /* One of NX_BD_ALG_*. */
4cceacb9 1309
c2d936a4
BP
1310 /* What fields to hash and how. */
1311 ovs_be16 fields; /* One of NX_HASH_FIELDS_*. */
1312 ovs_be16 basis; /* Universal hash parameter. */
f25d0cf3 1313
c2d936a4
BP
1314 ovs_be32 slave_type; /* NXM_OF_IN_PORT. */
1315 ovs_be16 n_slaves; /* Number of slaves. */
f25d0cf3 1316
c2d936a4
BP
1317 ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */
1318 ovs_be32 dst; /* Destination. */
f25d0cf3 1319
c2d936a4
BP
1320 uint8_t zero[4]; /* Reserved. Must be zero. */
1321};
1322OFP_ASSERT(sizeof(struct nx_action_bundle) == 32);
f25d0cf3 1323
c2d936a4
BP
1324static enum ofperr
1325decode_bundle(bool load, const struct nx_action_bundle *nab,
5c7c16d8
YHW
1326 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap,
1327 struct ofpbuf *ofpacts)
c2d936a4
BP
1328{
1329 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
1330 struct ofpact_bundle *bundle;
1331 uint32_t slave_type;
1332 size_t slaves_size, i;
1333 enum ofperr error;
bd85dac1 1334
c2d936a4
BP
1335 bundle = ofpact_put_BUNDLE(ofpacts);
1336
1337 bundle->n_slaves = ntohs(nab->n_slaves);
1338 bundle->basis = ntohs(nab->basis);
1339 bundle->fields = ntohs(nab->fields);
1340 bundle->algorithm = ntohs(nab->algorithm);
1341 slave_type = ntohl(nab->slave_type);
1342 slaves_size = ntohs(nab->len) - sizeof *nab;
1343
1344 error = OFPERR_OFPBAC_BAD_ARGUMENT;
1345 if (!flow_hash_fields_valid(bundle->fields)) {
1346 VLOG_WARN_RL(&rl, "unsupported fields %d", (int) bundle->fields);
1347 } else if (bundle->n_slaves > BUNDLE_MAX_SLAVES) {
1348 VLOG_WARN_RL(&rl, "too many slaves");
1349 } else if (bundle->algorithm != NX_BD_ALG_HRW
1350 && bundle->algorithm != NX_BD_ALG_ACTIVE_BACKUP) {
1351 VLOG_WARN_RL(&rl, "unsupported algorithm %d", (int) bundle->algorithm);
508a9338 1352 } else if (slave_type != mf_nxm_header(MFF_IN_PORT)) {
fd13c6b5 1353 VLOG_WARN_RL(&rl, "unsupported slave type %"PRIu32, slave_type);
c2d936a4
BP
1354 } else {
1355 error = 0;
1356 }
bd85dac1 1357
c2d936a4
BP
1358 if (!is_all_zeros(nab->zero, sizeof nab->zero)) {
1359 VLOG_WARN_RL(&rl, "reserved field is nonzero");
1360 error = OFPERR_OFPBAC_BAD_ARGUMENT;
1361 }
f25d0cf3 1362
c2d936a4 1363 if (load) {
c2d936a4
BP
1364 bundle->dst.ofs = nxm_decode_ofs(nab->ofs_nbits);
1365 bundle->dst.n_bits = nxm_decode_n_bits(nab->ofs_nbits);
5c7c16d8
YHW
1366 error = mf_vl_mff_mf_from_nxm_header(ntohl(nab->dst), vl_mff_map,
1367 &bundle->dst.field, tlv_bitmap);
1368 if (error) {
1369 return error;
04f48a68 1370 }
f25d0cf3 1371
c2d936a4
BP
1372 if (bundle->dst.n_bits < 16) {
1373 VLOG_WARN_RL(&rl, "bundle_load action requires at least 16 bit "
1374 "destination.");
1375 error = OFPERR_OFPBAC_BAD_ARGUMENT;
1376 }
1377 } else {
1378 if (nab->ofs_nbits || nab->dst) {
1379 VLOG_WARN_RL(&rl, "bundle action has nonzero reserved fields");
1380 error = OFPERR_OFPBAC_BAD_ARGUMENT;
1381 }
1382 }
f25d0cf3 1383
c2d936a4
BP
1384 if (slaves_size < bundle->n_slaves * sizeof(ovs_be16)) {
1385 VLOG_WARN_RL(&rl, "Nicira action %s only has %"PRIuSIZE" bytes "
1386 "allocated for slaves. %"PRIuSIZE" bytes are required "
fd13c6b5 1387 "for %u slaves.",
c2d936a4
BP
1388 load ? "bundle_load" : "bundle", slaves_size,
1389 bundle->n_slaves * sizeof(ovs_be16), bundle->n_slaves);
1390 error = OFPERR_OFPBAC_BAD_LEN;
1391 }
f25d0cf3 1392
c2d936a4 1393 for (i = 0; i < bundle->n_slaves; i++) {
117d7249 1394 ofp_port_t ofp_port = u16_to_ofp(ntohs(((ovs_be16 *)(nab + 1))[i]));
c2d936a4 1395 ofpbuf_put(ofpacts, &ofp_port, sizeof ofp_port);
19b58f3c 1396 bundle = ofpacts->header;
c2d936a4 1397 }
f25d0cf3 1398
ce058104 1399 ofpact_finish_BUNDLE(ofpacts, &bundle);
c2d936a4
BP
1400 if (!error) {
1401 error = bundle_check(bundle, OFPP_MAX, NULL);
1402 }
1403 return error;
1404}
f25d0cf3 1405
c2d936a4 1406static enum ofperr
f3cd3ac7
JS
1407decode_NXAST_RAW_BUNDLE(const struct nx_action_bundle *nab,
1408 enum ofp_version ofp_version OVS_UNUSED,
1409 struct ofpbuf *out)
c2d936a4 1410{
5c7c16d8 1411 return decode_bundle(false, nab, NULL, NULL, out);
c2d936a4 1412}
f25d0cf3 1413
c2d936a4
BP
1414static enum ofperr
1415decode_NXAST_RAW_BUNDLE_LOAD(const struct nx_action_bundle *nab,
f3cd3ac7 1416 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 1417 const struct vl_mff_map *vl_mff_map,
5c7c16d8 1418 uint64_t *tlv_bitmap, struct ofpbuf *out)
c2d936a4 1419{
5c7c16d8 1420 return decode_bundle(true, nab, vl_mff_map, tlv_bitmap, out);
c2d936a4 1421}
c2d967a5 1422
c2d936a4
BP
1423static void
1424encode_BUNDLE(const struct ofpact_bundle *bundle,
1425 enum ofp_version ofp_version OVS_UNUSED,
1426 struct ofpbuf *out)
1427{
1428 int slaves_len = ROUND_UP(2 * bundle->n_slaves, OFP_ACTION_ALIGN);
1429 struct nx_action_bundle *nab;
1430 ovs_be16 *slaves;
1431 size_t i;
f25d0cf3 1432
c2d936a4
BP
1433 nab = (bundle->dst.field
1434 ? put_NXAST_BUNDLE_LOAD(out)
1435 : put_NXAST_BUNDLE(out));
1436 nab->len = htons(ntohs(nab->len) + slaves_len);
1437 nab->algorithm = htons(bundle->algorithm);
1438 nab->fields = htons(bundle->fields);
1439 nab->basis = htons(bundle->basis);
508a9338 1440 nab->slave_type = htonl(mf_nxm_header(MFF_IN_PORT));
c2d936a4
BP
1441 nab->n_slaves = htons(bundle->n_slaves);
1442 if (bundle->dst.field) {
1443 nab->ofs_nbits = nxm_encode_ofs_nbits(bundle->dst.ofs,
1444 bundle->dst.n_bits);
04f48a68 1445 nab->dst = htonl(nxm_header_from_mff(bundle->dst.field));
c2d936a4 1446 }
f25d0cf3 1447
c2d936a4
BP
1448 slaves = ofpbuf_put_zeros(out, slaves_len);
1449 for (i = 0; i < bundle->n_slaves; i++) {
1450 slaves[i] = htons(ofp_to_u16(bundle->slaves[i]));
1451 }
1452}
b02475c5 1453
cab50449 1454static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1455parse_BUNDLE(const char *arg, const struct ofputil_port_map *port_map,
1456 struct ofpbuf *ofpacts,
c2d936a4
BP
1457 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1458{
50f96b10 1459 return bundle_parse(arg, port_map, ofpacts);
c2d936a4 1460}
b02475c5 1461
cab50449 1462static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1463parse_bundle_load(const char *arg, const struct ofputil_port_map *port_map,
1464 struct ofpbuf *ofpacts)
c2d936a4 1465{
50f96b10 1466 return bundle_parse_load(arg, port_map, ofpacts);
c2d936a4 1467}
097d4939 1468
c2d936a4 1469static void
50f96b10
BP
1470format_BUNDLE(const struct ofpact_bundle *a,
1471 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4 1472{
50f96b10 1473 bundle_format(a, port_map, s);
c2d936a4
BP
1474}
1475\f
1476/* Set VLAN actions. */
097d4939 1477
c2d936a4
BP
1478static enum ofperr
1479decode_set_vlan_vid(uint16_t vid, bool push_vlan_if_needed, struct ofpbuf *out)
1480{
1481 if (vid & ~0xfff) {
1482 return OFPERR_OFPBAC_BAD_ARGUMENT;
1483 } else {
1484 struct ofpact_vlan_vid *vlan_vid = ofpact_put_SET_VLAN_VID(out);
1485 vlan_vid->vlan_vid = vid;
1486 vlan_vid->push_vlan_if_needed = push_vlan_if_needed;
1487 return 0;
1488 }
1489}
0f3f3c3d 1490
c2d936a4 1491static enum ofperr
f3cd3ac7
JS
1492decode_OFPAT_RAW10_SET_VLAN_VID(uint16_t vid,
1493 enum ofp_version ofp_version OVS_UNUSED,
1494 struct ofpbuf *out)
c2d936a4
BP
1495{
1496 return decode_set_vlan_vid(vid, true, out);
1497}
b676167a 1498
c2d936a4 1499static enum ofperr
f3cd3ac7
JS
1500decode_OFPAT_RAW11_SET_VLAN_VID(uint16_t vid,
1501 enum ofp_version ofp_version OVS_UNUSED,
1502 struct ofpbuf *out)
c2d936a4
BP
1503{
1504 return decode_set_vlan_vid(vid, false, out);
1505}
29089a54 1506
c2d936a4
BP
1507static void
1508encode_SET_VLAN_VID(const struct ofpact_vlan_vid *vlan_vid,
1509 enum ofp_version ofp_version, struct ofpbuf *out)
1510{
1511 uint16_t vid = vlan_vid->vlan_vid;
1512
1513 /* Push a VLAN tag, if none is present and this form of the action calls
1514 * for such a feature. */
1515 if (ofp_version > OFP10_VERSION
1516 && vlan_vid->push_vlan_if_needed
1517 && !vlan_vid->flow_has_vlan) {
1518 put_OFPAT11_PUSH_VLAN(out, htons(ETH_TYPE_VLAN_8021Q));
f25d0cf3
BP
1519 }
1520
c2d936a4
BP
1521 if (ofp_version == OFP10_VERSION) {
1522 put_OFPAT10_SET_VLAN_VID(out, vid);
1523 } else if (ofp_version == OFP11_VERSION) {
1524 put_OFPAT11_SET_VLAN_VID(out, vid);
1525 } else {
128684a6 1526 put_set_field(out, ofp_version, MFF_VLAN_VID, vid | OFPVID12_PRESENT);
c2d936a4 1527 }
f25d0cf3
BP
1528}
1529
cab50449 1530static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1531parse_set_vlan_vid(char *arg,
1532 struct ofpbuf *ofpacts, bool push_vlan_if_needed)
d01c980f 1533{
ca287d20 1534 struct ofpact_vlan_vid *vlan_vid;
c2d936a4
BP
1535 uint16_t vid;
1536 char *error;
d01c980f 1537
c2d936a4 1538 error = str_to_u16(arg, "VLAN VID", &vid);
d01c980f
BP
1539 if (error) {
1540 return error;
1541 }
1542
c2d936a4
BP
1543 if (vid & ~VLAN_VID_MASK) {
1544 return xasprintf("%s: not a valid VLAN VID", arg);
d01c980f 1545 }
c2d936a4
BP
1546 vlan_vid = ofpact_put_SET_VLAN_VID(ofpacts);
1547 vlan_vid->vlan_vid = vid;
1548 vlan_vid->push_vlan_if_needed = push_vlan_if_needed;
1549 return NULL;
1550}
d01c980f 1551
cab50449 1552static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1553parse_SET_VLAN_VID(char *arg,
1554 const struct ofputil_port_map *port_map OVS_UNUSED,
1555 struct ofpbuf *ofpacts,
c2d936a4
BP
1556 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1557{
1558 return parse_set_vlan_vid(arg, ofpacts, false);
d01c980f
BP
1559}
1560
c2d936a4 1561static void
50f96b10
BP
1562format_SET_VLAN_VID(const struct ofpact_vlan_vid *a,
1563 const struct ofputil_port_map *port_map OVS_UNUSED,
1564 struct ds *s)
c2d936a4 1565{
b1c5bf1f 1566 ds_put_format(s, "%s%s:%s%"PRIu16, colors.param,
c2d936a4 1567 a->push_vlan_if_needed ? "mod_vlan_vid" : "set_vlan_vid",
b1c5bf1f 1568 colors.end, a->vlan_vid);
c2d936a4
BP
1569}
1570\f
1571/* Set PCP actions. */
e3f8f887 1572
c2d936a4
BP
1573static enum ofperr
1574decode_set_vlan_pcp(uint8_t pcp, bool push_vlan_if_needed, struct ofpbuf *out)
f25d0cf3 1575{
c2d936a4
BP
1576 if (pcp & ~7) {
1577 return OFPERR_OFPBAC_BAD_ARGUMENT;
1578 } else {
1579 struct ofpact_vlan_pcp *vlan_pcp = ofpact_put_SET_VLAN_PCP(out);
1580 vlan_pcp->vlan_pcp = pcp;
1581 vlan_pcp->push_vlan_if_needed = push_vlan_if_needed;
1582 return 0;
1583 }
f25d0cf3
BP
1584}
1585
c2d936a4 1586static enum ofperr
f3cd3ac7
JS
1587decode_OFPAT_RAW10_SET_VLAN_PCP(uint8_t pcp,
1588 enum ofp_version ofp_version OVS_UNUSED,
1589 struct ofpbuf *out)
f25d0cf3 1590{
c2d936a4 1591 return decode_set_vlan_pcp(pcp, true, out);
f25d0cf3
BP
1592}
1593
c2d936a4 1594static enum ofperr
f3cd3ac7
JS
1595decode_OFPAT_RAW11_SET_VLAN_PCP(uint8_t pcp,
1596 enum ofp_version ofp_version OVS_UNUSED,
1597 struct ofpbuf *out)
c2d936a4
BP
1598{
1599 return decode_set_vlan_pcp(pcp, false, out);
1600}
f25d0cf3 1601
699dddf1 1602static void
c2d936a4
BP
1603encode_SET_VLAN_PCP(const struct ofpact_vlan_pcp *vlan_pcp,
1604 enum ofp_version ofp_version, struct ofpbuf *out)
699dddf1 1605{
c2d936a4
BP
1606 uint8_t pcp = vlan_pcp->vlan_pcp;
1607
1608 /* Push a VLAN tag, if none is present and this form of the action calls
1609 * for such a feature. */
1610 if (ofp_version > OFP10_VERSION
1611 && vlan_pcp->push_vlan_if_needed
1612 && !vlan_pcp->flow_has_vlan) {
1613 put_OFPAT11_PUSH_VLAN(out, htons(ETH_TYPE_VLAN_8021Q));
1614 }
699dddf1 1615
c2d936a4
BP
1616 if (ofp_version == OFP10_VERSION) {
1617 put_OFPAT10_SET_VLAN_PCP(out, pcp);
1618 } else if (ofp_version == OFP11_VERSION) {
1619 put_OFPAT11_SET_VLAN_PCP(out, pcp);
1620 } else {
128684a6 1621 put_set_field(out, ofp_version, MFF_VLAN_PCP, pcp);
699dddf1
BP
1622 }
1623}
1624
cab50449 1625static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1626parse_set_vlan_pcp(char *arg,
1627 struct ofpbuf *ofpacts, bool push_vlan_if_needed)
f25d0cf3 1628{
c2d936a4
BP
1629 struct ofpact_vlan_pcp *vlan_pcp;
1630 uint8_t pcp;
1631 char *error;
e3f8f887 1632
c2d936a4
BP
1633 error = str_to_u8(arg, "VLAN PCP", &pcp);
1634 if (error) {
699dddf1 1635 return error;
f25d0cf3
BP
1636 }
1637
c2d936a4
BP
1638 if (pcp & ~7) {
1639 return xasprintf("%s: not a valid VLAN PCP", arg);
1640 }
1641 vlan_pcp = ofpact_put_SET_VLAN_PCP(ofpacts);
1642 vlan_pcp->vlan_pcp = pcp;
1643 vlan_pcp->push_vlan_if_needed = push_vlan_if_needed;
1644 return NULL;
1645}
1646
cab50449 1647static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1648parse_SET_VLAN_PCP(char *arg,
1649 const struct ofputil_port_map *port_map OVS_UNUSED,
1650 struct ofpbuf *ofpacts,
c2d936a4
BP
1651 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1652{
1653 return parse_set_vlan_pcp(arg, ofpacts, false);
1654}
1655
1656static void
50f96b10
BP
1657format_SET_VLAN_PCP(const struct ofpact_vlan_pcp *a,
1658 const struct ofputil_port_map *port_map OVS_UNUSED,
1659 struct ds *s)
c2d936a4 1660{
b1c5bf1f 1661 ds_put_format(s, "%s%s:%s%"PRIu8, colors.param,
c2d936a4 1662 a->push_vlan_if_needed ? "mod_vlan_pcp" : "set_vlan_pcp",
b1c5bf1f 1663 colors.end, a->vlan_pcp);
c2d936a4
BP
1664}
1665\f
1666/* Strip VLAN actions. */
1667
1668static enum ofperr
1669decode_OFPAT_RAW10_STRIP_VLAN(struct ofpbuf *out)
1670{
1671 ofpact_put_STRIP_VLAN(out)->ofpact.raw = OFPAT_RAW10_STRIP_VLAN;
f25d0cf3
BP
1672 return 0;
1673}
1674
8f2cded4 1675static enum ofperr
c2d936a4 1676decode_OFPAT_RAW11_POP_VLAN(struct ofpbuf *out)
8f2cded4 1677{
c2d936a4
BP
1678 ofpact_put_STRIP_VLAN(out)->ofpact.raw = OFPAT_RAW11_POP_VLAN;
1679 return 0;
1680}
f25d0cf3 1681
c2d936a4
BP
1682static void
1683encode_STRIP_VLAN(const struct ofpact_null *null OVS_UNUSED,
1684 enum ofp_version ofp_version, struct ofpbuf *out)
1685{
1686 if (ofp_version == OFP10_VERSION) {
1687 put_OFPAT10_STRIP_VLAN(out);
1688 } else {
1689 put_OFPAT11_POP_VLAN(out);
1690 }
1691}
f25d0cf3 1692
cab50449 1693static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1694parse_STRIP_VLAN(char *arg OVS_UNUSED,
1695 const struct ofputil_port_map *port_map OVS_UNUSED,
1696 struct ofpbuf *ofpacts,
c2d936a4
BP
1697 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1698{
1699 ofpact_put_STRIP_VLAN(ofpacts)->ofpact.raw = OFPAT_RAW10_STRIP_VLAN;
1700 return NULL;
1701}
1702
cab50449 1703static char * OVS_WARN_UNUSED_RESULT
c2d936a4
BP
1704parse_pop_vlan(struct ofpbuf *ofpacts)
1705{
1706 ofpact_put_STRIP_VLAN(ofpacts)->ofpact.raw = OFPAT_RAW11_POP_VLAN;
1707 return NULL;
1708}
1709
1710static void
50f96b10
BP
1711format_STRIP_VLAN(const struct ofpact_null *a,
1712 const struct ofputil_port_map *port_map OVS_UNUSED,
1713 struct ds *s)
c2d936a4 1714{
b1c5bf1f
QM
1715 ds_put_format(s, (a->ofpact.raw == OFPAT_RAW11_POP_VLAN
1716 ? "%spop_vlan%s"
1717 : "%sstrip_vlan%s"),
1718 colors.value, colors.end);
c2d936a4
BP
1719}
1720\f
1721/* Push VLAN action. */
1722
1723static enum ofperr
f3cd3ac7
JS
1724decode_OFPAT_RAW11_PUSH_VLAN(ovs_be16 eth_type,
1725 enum ofp_version ofp_version OVS_UNUSED,
1726 struct ofpbuf *out)
c2d936a4 1727{
f0fb825a
EG
1728 struct ofpact_push_vlan *push_vlan;
1729 if (!eth_type_vlan(eth_type)) {
c2d936a4 1730 return OFPERR_OFPBAC_BAD_ARGUMENT;
f25d0cf3 1731 }
f0fb825a
EG
1732 push_vlan = ofpact_put_PUSH_VLAN(out);
1733 push_vlan->ethertype = eth_type;
c2d936a4
BP
1734 return 0;
1735}
f25d0cf3 1736
c2d936a4 1737static void
f0fb825a 1738encode_PUSH_VLAN(const struct ofpact_push_vlan *push_vlan,
c2d936a4
BP
1739 enum ofp_version ofp_version, struct ofpbuf *out)
1740{
1741 if (ofp_version == OFP10_VERSION) {
1742 /* PUSH is a side effect of a SET_VLAN_VID/PCP, which should
1743 * follow this action. */
1744 } else {
f0fb825a 1745 put_OFPAT11_PUSH_VLAN(out, push_vlan->ethertype);
f25d0cf3 1746 }
c2d936a4 1747}
f25d0cf3 1748
cab50449 1749static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1750parse_PUSH_VLAN(char *arg,
1751 const struct ofputil_port_map *port_map OVS_UNUSED,
1752 struct ofpbuf *ofpacts,
c2d936a4
BP
1753 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1754{
f0fb825a 1755 struct ofpact_push_vlan *push_vlan;
c2d936a4
BP
1756 uint16_t ethertype;
1757 char *error;
1758
1759 *usable_protocols &= OFPUTIL_P_OF11_UP;
1760 error = str_to_u16(arg, "ethertype", &ethertype);
4cceacb9 1761 if (error) {
4cceacb9
JS
1762 return error;
1763 }
1764
f0fb825a 1765 if (!eth_type_vlan(htons(ethertype))) {
c2d936a4 1766 return xasprintf("%s: not a valid VLAN ethertype", arg);
f25d0cf3 1767 }
f0fb825a
EG
1768 push_vlan = ofpact_put_PUSH_VLAN(ofpacts);
1769 push_vlan->ethertype = htons(ethertype);
c2d936a4 1770 return NULL;
d01c980f
BP
1771}
1772
c2d936a4 1773static void
50f96b10
BP
1774format_PUSH_VLAN(const struct ofpact_push_vlan *push_vlan,
1775 const struct ofputil_port_map *port_map OVS_UNUSED,
1776 struct ds *s)
8f2cded4 1777{
b1c5bf1f 1778 ds_put_format(s, "%spush_vlan:%s%#"PRIx16,
f0fb825a 1779 colors.param, colors.end, ntohs(push_vlan->ethertype));
8f2cded4 1780}
d01c980f 1781\f
c2d936a4
BP
1782/* Action structure for OFPAT10_SET_DL_SRC/DST and OFPAT11_SET_DL_SRC/DST. */
1783struct ofp_action_dl_addr {
1784 ovs_be16 type; /* Type. */
1785 ovs_be16 len; /* Length is 16. */
74ff3298 1786 struct eth_addr dl_addr; /* Ethernet address. */
c2d936a4
BP
1787 uint8_t pad[6];
1788};
1789OFP_ASSERT(sizeof(struct ofp_action_dl_addr) == 16);
d01c980f 1790
d01c980f 1791static enum ofperr
c2d936a4 1792decode_OFPAT_RAW_SET_DL_SRC(const struct ofp_action_dl_addr *a,
f3cd3ac7 1793 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4 1794 struct ofpbuf *out)
d01c980f 1795{
74ff3298 1796 ofpact_put_SET_ETH_SRC(out)->mac = a->dl_addr;
c2d936a4
BP
1797 return 0;
1798}
3ddcaf2d 1799
c2d936a4
BP
1800static enum ofperr
1801decode_OFPAT_RAW_SET_DL_DST(const struct ofp_action_dl_addr *a,
f3cd3ac7 1802 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4
BP
1803 struct ofpbuf *out)
1804{
74ff3298 1805 ofpact_put_SET_ETH_DST(out)->mac = a->dl_addr;
c2d936a4
BP
1806 return 0;
1807}
d01c980f 1808
c2d936a4
BP
1809static void
1810encode_SET_ETH_addr(const struct ofpact_mac *mac, enum ofp_version ofp_version,
1811 enum ofp_raw_action_type raw, enum mf_field_id field,
1812 struct ofpbuf *out)
1813{
c2d936a4
BP
1814 if (ofp_version < OFP12_VERSION) {
1815 struct ofp_action_dl_addr *oada;
1816
1817 oada = ofpact_put_raw(out, ofp_version, raw, 0);
74ff3298 1818 oada->dl_addr = mac->mac;
c2d936a4 1819 } else {
128684a6 1820 put_set_field(out, ofp_version, field, eth_addr_to_uint64(mac->mac));
d01c980f
BP
1821 }
1822}
1823
c2d936a4
BP
1824static void
1825encode_SET_ETH_SRC(const struct ofpact_mac *mac, enum ofp_version ofp_version,
1826 struct ofpbuf *out)
b2dd70be 1827{
c2d936a4
BP
1828 encode_SET_ETH_addr(mac, ofp_version, OFPAT_RAW_SET_DL_SRC, MFF_ETH_SRC,
1829 out);
b2dd70be 1830
c2d936a4 1831}
b2dd70be 1832
c2d936a4
BP
1833static void
1834encode_SET_ETH_DST(const struct ofpact_mac *mac,
1835 enum ofp_version ofp_version,
1836 struct ofpbuf *out)
1837{
1838 encode_SET_ETH_addr(mac, ofp_version, OFPAT_RAW_SET_DL_DST, MFF_ETH_DST,
1839 out);
b2dd70be 1840
c2d936a4 1841}
b2dd70be 1842
cab50449 1843static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1844parse_SET_ETH_SRC(char *arg,
1845 const struct ofputil_port_map *port_map OVS_UNUSED,
1846 struct ofpbuf *ofpacts,
1847 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4 1848{
74ff3298 1849 return str_to_mac(arg, &ofpact_put_SET_ETH_SRC(ofpacts)->mac);
c2d936a4
BP
1850}
1851
cab50449 1852static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1853parse_SET_ETH_DST(char *arg,
1854 const struct ofputil_port_map *port_map OVS_UNUSED,
1855 struct ofpbuf *ofpacts,
1856 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4 1857{
74ff3298 1858 return str_to_mac(arg, &ofpact_put_SET_ETH_DST(ofpacts)->mac);
b2dd70be
JR
1859}
1860
1861static void
50f96b10
BP
1862format_SET_ETH_SRC(const struct ofpact_mac *a,
1863 const struct ofputil_port_map *port_map OVS_UNUSED,
1864 struct ds *s)
b2dd70be 1865{
b1c5bf1f
QM
1866 ds_put_format(s, "%smod_dl_src:%s"ETH_ADDR_FMT,
1867 colors.param, colors.end, ETH_ADDR_ARGS(a->mac));
c2d936a4 1868}
b2dd70be 1869
c2d936a4 1870static void
50f96b10
BP
1871format_SET_ETH_DST(const struct ofpact_mac *a,
1872 const struct ofputil_port_map *port_map OVS_UNUSED,
1873 struct ds *s)
c2d936a4 1874{
b1c5bf1f
QM
1875 ds_put_format(s, "%smod_dl_dst:%s"ETH_ADDR_FMT,
1876 colors.param, colors.end, ETH_ADDR_ARGS(a->mac));
c2d936a4
BP
1877}
1878\f
1879/* Set IPv4 address actions. */
b2dd70be 1880
c2d936a4 1881static enum ofperr
f3cd3ac7
JS
1882decode_OFPAT_RAW_SET_NW_SRC(ovs_be32 ipv4,
1883 enum ofp_version ofp_version OVS_UNUSED,
1884 struct ofpbuf *out)
c2d936a4
BP
1885{
1886 ofpact_put_SET_IPV4_SRC(out)->ipv4 = ipv4;
1887 return 0;
b2dd70be
JR
1888}
1889
c2d936a4 1890static enum ofperr
f3cd3ac7
JS
1891decode_OFPAT_RAW_SET_NW_DST(ovs_be32 ipv4,
1892 enum ofp_version ofp_version OVS_UNUSED,
1893 struct ofpbuf *out)
b2dd70be 1894{
c2d936a4
BP
1895 ofpact_put_SET_IPV4_DST(out)->ipv4 = ipv4;
1896 return 0;
1897}
b2dd70be 1898
c2d936a4
BP
1899static void
1900encode_SET_IPV4_addr(const struct ofpact_ipv4 *ipv4,
1901 enum ofp_version ofp_version,
1902 enum ofp_raw_action_type raw, enum mf_field_id field,
1903 struct ofpbuf *out)
1904{
1905 ovs_be32 addr = ipv4->ipv4;
1906 if (ofp_version < OFP12_VERSION) {
1907 ofpact_put_raw(out, ofp_version, raw, ntohl(addr));
b2dd70be 1908 } else {
128684a6 1909 put_set_field(out, ofp_version, field, ntohl(addr));
b2dd70be
JR
1910 }
1911}
1912
a6fd70bb 1913static void
c2d936a4
BP
1914encode_SET_IPV4_SRC(const struct ofpact_ipv4 *ipv4,
1915 enum ofp_version ofp_version, struct ofpbuf *out)
a6fd70bb 1916{
c2d936a4
BP
1917 encode_SET_IPV4_addr(ipv4, ofp_version, OFPAT_RAW_SET_NW_SRC, MFF_IPV4_SRC,
1918 out);
1919}
a6fd70bb 1920
c2d936a4
BP
1921static void
1922encode_SET_IPV4_DST(const struct ofpact_ipv4 *ipv4,
1923 enum ofp_version ofp_version, struct ofpbuf *out)
1924{
1925 encode_SET_IPV4_addr(ipv4, ofp_version, OFPAT_RAW_SET_NW_DST, MFF_IPV4_DST,
1926 out);
1927}
a6fd70bb 1928
cab50449 1929static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1930parse_SET_IPV4_SRC(char *arg,
1931 const struct ofputil_port_map *port_map OVS_UNUSED,
1932 struct ofpbuf *ofpacts,
c2d936a4
BP
1933 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1934{
1935 return str_to_ip(arg, &ofpact_put_SET_IPV4_SRC(ofpacts)->ipv4);
1936}
a6fd70bb 1937
cab50449 1938static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1939parse_SET_IPV4_DST(char *arg,
1940 const struct ofputil_port_map *port_map OVS_UNUSED,
1941 struct ofpbuf *ofpacts,
c2d936a4
BP
1942 enum ofputil_protocol *usable_protocols OVS_UNUSED)
1943{
1944 return str_to_ip(arg, &ofpact_put_SET_IPV4_DST(ofpacts)->ipv4);
1945}
a6fd70bb 1946
c2d936a4 1947static void
50f96b10
BP
1948format_SET_IPV4_SRC(const struct ofpact_ipv4 *a,
1949 const struct ofputil_port_map *port_map OVS_UNUSED,
1950 struct ds *s)
c2d936a4 1951{
b1c5bf1f
QM
1952 ds_put_format(s, "%smod_nw_src:%s"IP_FMT,
1953 colors.param, colors.end, IP_ARGS(a->ipv4));
c2d936a4 1954}
097d4939 1955
c2d936a4 1956static void
50f96b10
BP
1957format_SET_IPV4_DST(const struct ofpact_ipv4 *a,
1958 const struct ofputil_port_map *port_map OVS_UNUSED,
1959 struct ds *s)
c2d936a4 1960{
b1c5bf1f
QM
1961 ds_put_format(s, "%smod_nw_dst:%s"IP_FMT,
1962 colors.param, colors.end, IP_ARGS(a->ipv4));
c2d936a4
BP
1963}
1964\f
1965/* Set IPv4/v6 TOS actions. */
097d4939 1966
c2d936a4 1967static enum ofperr
f3cd3ac7
JS
1968decode_OFPAT_RAW_SET_NW_TOS(uint8_t dscp,
1969 enum ofp_version ofp_version OVS_UNUSED,
1970 struct ofpbuf *out)
c2d936a4
BP
1971{
1972 if (dscp & ~IP_DSCP_MASK) {
1973 return OFPERR_OFPBAC_BAD_ARGUMENT;
1974 } else {
1975 ofpact_put_SET_IP_DSCP(out)->dscp = dscp;
1976 return 0;
a6fd70bb
JR
1977 }
1978}
1979
a6fd70bb 1980static void
c2d936a4
BP
1981encode_SET_IP_DSCP(const struct ofpact_dscp *dscp,
1982 enum ofp_version ofp_version, struct ofpbuf *out)
a6fd70bb 1983{
c2d936a4
BP
1984 if (ofp_version < OFP12_VERSION) {
1985 put_OFPAT_SET_NW_TOS(out, ofp_version, dscp->dscp);
1986 } else {
128684a6 1987 put_set_field(out, ofp_version, MFF_IP_DSCP_SHIFTED, dscp->dscp >> 2);
c2d936a4
BP
1988 }
1989}
a6fd70bb 1990
cab50449 1991static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
1992parse_SET_IP_DSCP(char *arg,
1993 const struct ofputil_port_map *port_map OVS_UNUSED,
1994 struct ofpbuf *ofpacts,
1995 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4
BP
1996{
1997 uint8_t tos;
1998 char *error;
a6fd70bb 1999
c2d936a4
BP
2000 error = str_to_u8(arg, "TOS", &tos);
2001 if (error) {
2002 return error;
2003 }
a6fd70bb 2004
c2d936a4
BP
2005 if (tos & ~IP_DSCP_MASK) {
2006 return xasprintf("%s: not a valid TOS", arg);
a6fd70bb 2007 }
c2d936a4
BP
2008 ofpact_put_SET_IP_DSCP(ofpacts)->dscp = tos;
2009 return NULL;
a6fd70bb
JR
2010}
2011
b2dd70be 2012static void
50f96b10
BP
2013format_SET_IP_DSCP(const struct ofpact_dscp *a,
2014 const struct ofputil_port_map *port_map OVS_UNUSED,
2015 struct ds *s)
b2dd70be 2016{
b1c5bf1f 2017 ds_put_format(s, "%smod_nw_tos:%s%d", colors.param, colors.end, a->dscp);
c2d936a4
BP
2018}
2019\f
2020/* Set IPv4/v6 ECN actions. */
b2dd70be 2021
c2d936a4 2022static enum ofperr
f3cd3ac7
JS
2023decode_OFPAT_RAW11_SET_NW_ECN(uint8_t ecn,
2024 enum ofp_version ofp_version OVS_UNUSED,
2025 struct ofpbuf *out)
c2d936a4
BP
2026{
2027 if (ecn & ~IP_ECN_MASK) {
2028 return OFPERR_OFPBAC_BAD_ARGUMENT;
b2dd70be 2029 } else {
c2d936a4
BP
2030 ofpact_put_SET_IP_ECN(out)->ecn = ecn;
2031 return 0;
b2dd70be
JR
2032 }
2033}
2034
c2d936a4
BP
2035static void
2036encode_SET_IP_ECN(const struct ofpact_ecn *ip_ecn,
2037 enum ofp_version ofp_version, struct ofpbuf *out)
d01c980f 2038{
c2d936a4
BP
2039 uint8_t ecn = ip_ecn->ecn;
2040 if (ofp_version == OFP10_VERSION) {
4b684612
BP
2041 struct mf_subfield dst = { .field = mf_from_id(MFF_IP_ECN),
2042 .ofs = 0, .n_bits = 2 };
2043 put_reg_load(out, &dst, ecn);
c2d936a4
BP
2044 } else if (ofp_version == OFP11_VERSION) {
2045 put_OFPAT11_SET_NW_ECN(out, ecn);
2046 } else {
128684a6 2047 put_set_field(out, ofp_version, MFF_IP_ECN, ecn);
c2d936a4
BP
2048 }
2049}
d01c980f 2050
cab50449 2051static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
2052parse_SET_IP_ECN(char *arg,
2053 const struct ofputil_port_map *port_map OVS_UNUSED,
2054 struct ofpbuf *ofpacts,
c2d936a4
BP
2055 enum ofputil_protocol *usable_protocols OVS_UNUSED)
2056{
2057 uint8_t ecn;
2058 char *error;
d01c980f 2059
c2d936a4 2060 error = str_to_u8(arg, "ECN", &ecn);
d01c980f
BP
2061 if (error) {
2062 return error;
2063 }
2064
c2d936a4
BP
2065 if (ecn & ~IP_ECN_MASK) {
2066 return xasprintf("%s: not a valid ECN", arg);
2067 }
2068 ofpact_put_SET_IP_ECN(ofpacts)->ecn = ecn;
2069 return NULL;
d01c980f
BP
2070}
2071
c2d936a4 2072static void
50f96b10
BP
2073format_SET_IP_ECN(const struct ofpact_ecn *a,
2074 const struct ofputil_port_map *port_map OVS_UNUSED,
2075 struct ds *s)
c2d936a4 2076{
b1c5bf1f
QM
2077 ds_put_format(s, "%smod_nw_ecn:%s%d",
2078 colors.param, colors.end, a->ecn);
c2d936a4
BP
2079}
2080\f
2081/* Set IPv4/v6 TTL actions. */
2082
d01c980f 2083static enum ofperr
f3cd3ac7
JS
2084decode_OFPAT_RAW11_SET_NW_TTL(uint8_t ttl,
2085 enum ofp_version ofp_version OVS_UNUSED,
2086 struct ofpbuf *out)
d01c980f 2087{
c2d936a4
BP
2088 ofpact_put_SET_IP_TTL(out)->ttl = ttl;
2089 return 0;
2090}
2091
2092static void
2093encode_SET_IP_TTL(const struct ofpact_ip_ttl *ttl,
2094 enum ofp_version ofp_version, struct ofpbuf *out)
2095{
2096 if (ofp_version >= OFP11_VERSION) {
2097 put_OFPAT11_SET_NW_TTL(out, ttl->ttl);
2098 } else {
56a91749
BP
2099 struct mf_subfield dst = { .field = mf_from_id(MFF_IP_TTL),
2100 .ofs = 0, .n_bits = 8 };
2101 put_reg_load(out, &dst, ttl->ttl);
c2d936a4
BP
2102 }
2103}
2104
cab50449 2105static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
2106parse_SET_IP_TTL(char *arg,
2107 const struct ofputil_port_map *port_map OVS_UNUSED,
2108 struct ofpbuf *ofpacts,
2109 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4
BP
2110{
2111 uint8_t ttl;
2112 char *error;
d01c980f 2113
c2d936a4 2114 error = str_to_u8(arg, "TTL", &ttl);
d01c980f
BP
2115 if (error) {
2116 return error;
2117 }
2118
c2d936a4
BP
2119 ofpact_put_SET_IP_TTL(ofpacts)->ttl = ttl;
2120 return NULL;
2121}
d01c980f 2122
c2d936a4 2123static void
50f96b10
BP
2124format_SET_IP_TTL(const struct ofpact_ip_ttl *a,
2125 const struct ofputil_port_map *port_map OVS_UNUSED,
2126 struct ds *s)
c2d936a4 2127{
b1c5bf1f 2128 ds_put_format(s, "%smod_nw_ttl:%s%d", colors.param, colors.end, a->ttl);
c2d936a4
BP
2129}
2130\f
2131/* Set TCP/UDP/SCTP port actions. */
d01c980f 2132
c2d936a4 2133static enum ofperr
f3cd3ac7
JS
2134decode_OFPAT_RAW_SET_TP_SRC(ovs_be16 port,
2135 enum ofp_version ofp_version OVS_UNUSED,
2136 struct ofpbuf *out)
c2d936a4
BP
2137{
2138 ofpact_put_SET_L4_SRC_PORT(out)->port = ntohs(port);
2139 return 0;
2140}
d01c980f 2141
c2d936a4 2142static enum ofperr
f3cd3ac7
JS
2143decode_OFPAT_RAW_SET_TP_DST(ovs_be16 port,
2144 enum ofp_version ofp_version OVS_UNUSED,
2145 struct ofpbuf *out)
c2d936a4
BP
2146{
2147 ofpact_put_SET_L4_DST_PORT(out)->port = ntohs(port);
2148 return 0;
2149}
d01c980f 2150
c2d936a4
BP
2151static void
2152encode_SET_L4_port(const struct ofpact_l4_port *l4_port,
2153 enum ofp_version ofp_version, enum ofp_raw_action_type raw,
2154 enum mf_field_id field, struct ofpbuf *out)
2155{
2156 uint16_t port = l4_port->port;
3e34fbdd 2157
c2d936a4 2158 if (ofp_version >= OFP12_VERSION && field != MFF_N_IDS) {
128684a6 2159 put_set_field(out, ofp_version, field, port);
c2d936a4
BP
2160 } else {
2161 ofpact_put_raw(out, ofp_version, raw, port);
2162 }
2163}
8e61c110 2164
c2d936a4
BP
2165static void
2166encode_SET_L4_SRC_PORT(const struct ofpact_l4_port *l4_port,
2167 enum ofp_version ofp_version, struct ofpbuf *out)
2168{
2169 uint8_t proto = l4_port->flow_ip_proto;
2170 enum mf_field_id field = (proto == IPPROTO_TCP ? MFF_TCP_SRC
2171 : proto == IPPROTO_UDP ? MFF_UDP_SRC
2172 : proto == IPPROTO_SCTP ? MFF_SCTP_SRC
2173 : MFF_N_IDS);
276c4e7a 2174
c2d936a4
BP
2175 encode_SET_L4_port(l4_port, ofp_version, OFPAT_RAW_SET_TP_SRC, field, out);
2176}
d01c980f 2177
c2d936a4
BP
2178static void
2179encode_SET_L4_DST_PORT(const struct ofpact_l4_port *l4_port,
2180 enum ofp_version ofp_version,
2181 struct ofpbuf *out)
2182{
2183 uint8_t proto = l4_port->flow_ip_proto;
2184 enum mf_field_id field = (proto == IPPROTO_TCP ? MFF_TCP_DST
2185 : proto == IPPROTO_UDP ? MFF_UDP_DST
2186 : proto == IPPROTO_SCTP ? MFF_SCTP_DST
2187 : MFF_N_IDS);
d01c980f 2188
c2d936a4
BP
2189 encode_SET_L4_port(l4_port, ofp_version, OFPAT_RAW_SET_TP_DST, field, out);
2190}
7bcb1506 2191
cab50449 2192static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
2193parse_SET_L4_SRC_PORT(char *arg,
2194 const struct ofputil_port_map *port_map OVS_UNUSED,
2195 struct ofpbuf *ofpacts,
c2d936a4
BP
2196 enum ofputil_protocol *usable_protocols OVS_UNUSED)
2197{
2198 return str_to_u16(arg, "source port",
2199 &ofpact_put_SET_L4_SRC_PORT(ofpacts)->port);
2200}
d01c980f 2201
cab50449 2202static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
2203parse_SET_L4_DST_PORT(char *arg,
2204 const struct ofputil_port_map *port_map OVS_UNUSED,
2205 struct ofpbuf *ofpacts,
c2d936a4
BP
2206 enum ofputil_protocol *usable_protocols OVS_UNUSED)
2207{
2208 return str_to_u16(arg, "destination port",
2209 &ofpact_put_SET_L4_DST_PORT(ofpacts)->port);
2210}
d01c980f 2211
c2d936a4 2212static void
50f96b10
BP
2213format_SET_L4_SRC_PORT(const struct ofpact_l4_port *a,
2214 const struct ofputil_port_map *port_map OVS_UNUSED,
2215 struct ds *s)
c2d936a4 2216{
b1c5bf1f 2217 ds_put_format(s, "%smod_tp_src:%s%d", colors.param, colors.end, a->port);
c2d936a4 2218}
d01c980f 2219
c2d936a4 2220static void
50f96b10
BP
2221format_SET_L4_DST_PORT(const struct ofpact_l4_port *a,
2222 const struct ofputil_port_map *port_map OVS_UNUSED,
2223 struct ds *s)
c2d936a4 2224{
b1c5bf1f 2225 ds_put_format(s, "%smod_tp_dst:%s%d", colors.param, colors.end, a->port);
c2d936a4
BP
2226}
2227\f
73178f20
BP
2228/* Action structure for OFPAT_COPY_FIELD. */
2229struct ofp15_action_copy_field {
2230 ovs_be16 type; /* OFPAT_COPY_FIELD. */
2231 ovs_be16 len; /* Length is padded to 64 bits. */
2232 ovs_be16 n_bits; /* Number of bits to copy. */
2233 ovs_be16 src_offset; /* Starting bit offset in source. */
2234 ovs_be16 dst_offset; /* Starting bit offset in destination. */
650763d8 2235 uint8_t pad[2];
f13cdd73
BP
2236 /* Followed by:
2237 * - OXM header for source field.
2238 * - OXM header for destination field.
2239 * - Padding with 0-bytes to a multiple of 8 bytes.
650763d8
BP
2240 * The "pad2" member is the beginning of the above. */
2241 uint8_t pad2[4];
73178f20 2242};
f13cdd73 2243OFP_ASSERT(sizeof(struct ofp15_action_copy_field) == 16);
73178f20 2244
914624f8
BP
2245/* Action structure for OpenFlow 1.3 extension copy-field action.. */
2246struct onf_action_copy_field {
2247 ovs_be16 type; /* OFPAT_EXPERIMENTER. */
2248 ovs_be16 len; /* Length is padded to 64 bits. */
2249 ovs_be32 experimenter; /* ONF_VENDOR_ID. */
2250 ovs_be16 exp_type; /* 3200. */
2251 uint8_t pad[2]; /* Not used. */
2252 ovs_be16 n_bits; /* Number of bits to copy. */
2253 ovs_be16 src_offset; /* Starting bit offset in source. */
2254 ovs_be16 dst_offset; /* Starting bit offset in destination. */
2255 uint8_t pad2[2]; /* Not used. */
2256 /* Followed by:
2257 * - OXM header for source field.
2258 * - OXM header for destination field.
2259 * - Padding with 0-bytes (either 0 or 4 of them) to a multiple of 8 bytes.
2260 * The "pad3" member is the beginning of the above. */
2261 uint8_t pad3[4]; /* Not used. */
2262};
2263OFP_ASSERT(sizeof(struct onf_action_copy_field) == 24);
2264
c2d936a4
BP
2265/* Action structure for NXAST_REG_MOVE.
2266 *
2267 * Copies src[src_ofs:src_ofs+n_bits] to dst[dst_ofs:dst_ofs+n_bits], where
2268 * a[b:c] denotes the bits within 'a' numbered 'b' through 'c' (not including
2269 * bit 'c'). Bit numbering starts at 0 for the least-significant bit, 1 for
2270 * the next most significant bit, and so on.
2271 *
2272 * 'src' and 'dst' are nxm_header values with nxm_hasmask=0. (It doesn't make
2273 * sense to use nxm_hasmask=1 because the action does not do any kind of
2274 * matching; it uses the actual value of a field.)
2275 *
2276 * The following nxm_header values are potentially acceptable as 'src':
2277 *
2278 * - NXM_OF_IN_PORT
2279 * - NXM_OF_ETH_DST
2280 * - NXM_OF_ETH_SRC
2281 * - NXM_OF_ETH_TYPE
2282 * - NXM_OF_VLAN_TCI
2283 * - NXM_OF_IP_TOS
2284 * - NXM_OF_IP_PROTO
2285 * - NXM_OF_IP_SRC
2286 * - NXM_OF_IP_DST
2287 * - NXM_OF_TCP_SRC
2288 * - NXM_OF_TCP_DST
2289 * - NXM_OF_UDP_SRC
2290 * - NXM_OF_UDP_DST
2291 * - NXM_OF_ICMP_TYPE
2292 * - NXM_OF_ICMP_CODE
2293 * - NXM_OF_ARP_OP
2294 * - NXM_OF_ARP_SPA
2295 * - NXM_OF_ARP_TPA
2296 * - NXM_NX_TUN_ID
2297 * - NXM_NX_ARP_SHA
2298 * - NXM_NX_ARP_THA
2299 * - NXM_NX_ICMPV6_TYPE
2300 * - NXM_NX_ICMPV6_CODE
2301 * - NXM_NX_ND_SLL
2302 * - NXM_NX_ND_TLL
2303 * - NXM_NX_REG(idx) for idx in the switch's accepted range.
2304 * - NXM_NX_PKT_MARK
2305 * - NXM_NX_TUN_IPV4_SRC
2306 * - NXM_NX_TUN_IPV4_DST
2307 *
2308 * The following nxm_header values are potentially acceptable as 'dst':
2309 *
2310 * - NXM_OF_ETH_DST
2311 * - NXM_OF_ETH_SRC
2312 * - NXM_OF_IP_TOS
2313 * - NXM_OF_IP_SRC
2314 * - NXM_OF_IP_DST
2315 * - NXM_OF_TCP_SRC
2316 * - NXM_OF_TCP_DST
2317 * - NXM_OF_UDP_SRC
2318 * - NXM_OF_UDP_DST
f6ecf944
JP
2319 * - NXM_OF_ICMP_TYPE
2320 * - NXM_OF_ICMP_CODE
2321 * - NXM_NX_ICMPV6_TYPE
2322 * - NXM_NX_ICMPV6_CODE
c2d936a4
BP
2323 * - NXM_NX_ARP_SHA
2324 * - NXM_NX_ARP_THA
2325 * - NXM_OF_ARP_OP
2326 * - NXM_OF_ARP_SPA
2327 * - NXM_OF_ARP_TPA
2328 * Modifying any of the above fields changes the corresponding packet
2329 * header.
2330 *
2331 * - NXM_OF_IN_PORT
2332 *
2333 * - NXM_NX_REG(idx) for idx in the switch's accepted range.
2334 *
2335 * - NXM_NX_PKT_MARK
2336 *
2337 * - NXM_OF_VLAN_TCI. Modifying this field's value has side effects on the
2338 * packet's 802.1Q header. Setting a value with CFI=0 removes the 802.1Q
2339 * header (if any), ignoring the other bits. Setting a value with CFI=1
2340 * adds or modifies the 802.1Q header appropriately, setting the TCI field
2341 * to the field's new value (with the CFI bit masked out).
2342 *
2343 * - NXM_NX_TUN_ID, NXM_NX_TUN_IPV4_SRC, NXM_NX_TUN_IPV4_DST. Modifying
2344 * any of these values modifies the corresponding tunnel header field used
2345 * for the packet's next tunnel encapsulation, if allowed by the
2346 * configuration of the output tunnel port.
2347 *
2348 * A given nxm_header value may be used as 'src' or 'dst' only on a flow whose
2349 * nx_match satisfies its prerequisites. For example, NXM_OF_IP_TOS may be
2350 * used only if the flow's nx_match includes an nxm_entry that specifies
2351 * nxm_type=NXM_OF_ETH_TYPE, nxm_hasmask=0, and nxm_value=0x0800.
2352 *
2353 * The switch will reject actions for which src_ofs+n_bits is greater than the
2354 * width of 'src' or dst_ofs+n_bits is greater than the width of 'dst' with
2355 * error type OFPET_BAD_ACTION, code OFPBAC_BAD_ARGUMENT.
2356 *
2357 * This action behaves properly when 'src' overlaps with 'dst', that is, it
2358 * behaves as if 'src' were copied out to a temporary buffer, then the
2359 * temporary buffer copied to 'dst'.
2360 */
2361struct nx_action_reg_move {
2362 ovs_be16 type; /* OFPAT_VENDOR. */
2363 ovs_be16 len; /* Length is 24. */
2364 ovs_be32 vendor; /* NX_VENDOR_ID. */
2365 ovs_be16 subtype; /* NXAST_REG_MOVE. */
2366 ovs_be16 n_bits; /* Number of bits. */
2367 ovs_be16 src_ofs; /* Starting bit offset in source. */
2368 ovs_be16 dst_ofs; /* Starting bit offset in destination. */
bad8a439
BP
2369 /* Followed by:
2370 * - OXM/NXM header for source field (4 or 8 bytes).
2371 * - OXM/NXM header for destination field (4 or 8 bytes).
2372 * - Padding with 0-bytes to a multiple of 8 bytes, if necessary. */
c2d936a4 2373};
bad8a439 2374OFP_ASSERT(sizeof(struct nx_action_reg_move) == 16);
ff14eb7a 2375
73178f20 2376static enum ofperr
914624f8
BP
2377decode_copy_field__(ovs_be16 src_offset, ovs_be16 dst_offset, ovs_be16 n_bits,
2378 const void *action, ovs_be16 action_len, size_t oxm_offset,
04f48a68 2379 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2380 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
73178f20 2381{
0a2869d5 2382 struct ofpact_reg_move *move = ofpact_put_REG_MOVE(ofpacts);
5c7c16d8
YHW
2383 enum ofperr error;
2384
914624f8
BP
2385 move->ofpact.raw = ONFACT_RAW13_COPY_FIELD;
2386 move->src.ofs = ntohs(src_offset);
2387 move->src.n_bits = ntohs(n_bits);
2388 move->dst.ofs = ntohs(dst_offset);
2389 move->dst.n_bits = ntohs(n_bits);
2390
0a2869d5 2391 struct ofpbuf b = ofpbuf_const_initializer(action, ntohs(action_len));
914624f8 2392 ofpbuf_pull(&b, oxm_offset);
0a2869d5 2393
5c7c16d8
YHW
2394 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map, &move->src.field, NULL,
2395 tlv_bitmap);
f13cdd73
BP
2396 if (error) {
2397 return error;
2398 }
5c7c16d8
YHW
2399 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map, &move->dst.field, NULL,
2400 tlv_bitmap);
f13cdd73
BP
2401 if (error) {
2402 return error;
2403 }
f13cdd73 2404
6fd6ed71 2405 if (!is_all_zeros(b.data, b.size)) {
f13cdd73
BP
2406 return OFPERR_NXBRC_MUST_BE_ZERO;
2407 }
2408
73178f20
BP
2409 return nxm_reg_move_check(move, NULL);
2410}
2411
914624f8
BP
2412static enum ofperr
2413decode_OFPAT_RAW15_COPY_FIELD(const struct ofp15_action_copy_field *oacf,
f3cd3ac7 2414 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2415 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2416 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
914624f8
BP
2417{
2418 return decode_copy_field__(oacf->src_offset, oacf->dst_offset,
2419 oacf->n_bits, oacf, oacf->len,
04f48a68 2420 OBJECT_OFFSETOF(oacf, pad2), vl_mff_map,
5c7c16d8 2421 tlv_bitmap, ofpacts);
914624f8
BP
2422}
2423
2424static enum ofperr
2425decode_ONFACT_RAW13_COPY_FIELD(const struct onf_action_copy_field *oacf,
f3cd3ac7 2426 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2427 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2428 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
914624f8
BP
2429{
2430 return decode_copy_field__(oacf->src_offset, oacf->dst_offset,
2431 oacf->n_bits, oacf, oacf->len,
04f48a68 2432 OBJECT_OFFSETOF(oacf, pad3), vl_mff_map,
5c7c16d8 2433 tlv_bitmap, ofpacts);
914624f8
BP
2434}
2435
c2d936a4
BP
2436static enum ofperr
2437decode_NXAST_RAW_REG_MOVE(const struct nx_action_reg_move *narm,
f3cd3ac7 2438 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2439 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2440 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
c2d936a4 2441{
0a2869d5 2442 struct ofpact_reg_move *move = ofpact_put_REG_MOVE(ofpacts);
5c7c16d8
YHW
2443 enum ofperr error;
2444
914624f8 2445 move->ofpact.raw = NXAST_RAW_REG_MOVE;
c2d936a4
BP
2446 move->src.ofs = ntohs(narm->src_ofs);
2447 move->src.n_bits = ntohs(narm->n_bits);
c2d936a4
BP
2448 move->dst.ofs = ntohs(narm->dst_ofs);
2449 move->dst.n_bits = ntohs(narm->n_bits);
d01c980f 2450
0a2869d5 2451 struct ofpbuf b = ofpbuf_const_initializer(narm, ntohs(narm->len));
bad8a439 2452 ofpbuf_pull(&b, sizeof *narm);
0a2869d5 2453
5c7c16d8
YHW
2454 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map, &move->src.field, NULL,
2455 tlv_bitmap);
bad8a439
BP
2456 if (error) {
2457 return error;
2458 }
5c7c16d8
YHW
2459
2460 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map, &move->dst.field, NULL,
2461 tlv_bitmap);
bad8a439
BP
2462 if (error) {
2463 return error;
2464 }
04f48a68 2465
6fd6ed71 2466 if (!is_all_zeros(b.data, b.size)) {
bad8a439
BP
2467 return OFPERR_NXBRC_MUST_BE_ZERO;
2468 }
2469
c2d936a4
BP
2470 return nxm_reg_move_check(move, NULL);
2471}
d01c980f 2472
c2d936a4
BP
2473static void
2474encode_REG_MOVE(const struct ofpact_reg_move *move,
73178f20
BP
2475 enum ofp_version ofp_version, struct ofpbuf *out)
2476{
914624f8
BP
2477 /* For OpenFlow 1.3, the choice of ONFACT_RAW13_COPY_FIELD versus
2478 * NXAST_RAW_REG_MOVE is somewhat difficult. Neither one is guaranteed to
2479 * be supported by every OpenFlow 1.3 implementation. It would be ideal to
2480 * probe for support. Until we have that ability, we currently prefer
2481 * NXAST_RAW_REG_MOVE for backward compatibility with older Open vSwitch
2482 * versions. */
6fd6ed71 2483 size_t start_ofs = out->size;
73178f20 2484 if (ofp_version >= OFP15_VERSION) {
bad8a439 2485 struct ofp15_action_copy_field *copy = put_OFPAT15_COPY_FIELD(out);
73178f20
BP
2486 copy->n_bits = htons(move->dst.n_bits);
2487 copy->src_offset = htons(move->src.ofs);
2488 copy->dst_offset = htons(move->dst.ofs);
6fd6ed71 2489 out->size = out->size - sizeof copy->pad2;
04f48a68
YHW
2490 nx_put_mff_header(out, move->src.field, ofp_version, false);
2491 nx_put_mff_header(out, move->dst.field, ofp_version, false);
914624f8
BP
2492 } else if (ofp_version == OFP13_VERSION
2493 && move->ofpact.raw == ONFACT_RAW13_COPY_FIELD) {
2494 struct onf_action_copy_field *copy = put_ONFACT13_COPY_FIELD(out);
2495 copy->n_bits = htons(move->dst.n_bits);
2496 copy->src_offset = htons(move->src.ofs);
2497 copy->dst_offset = htons(move->dst.ofs);
6fd6ed71 2498 out->size = out->size - sizeof copy->pad3;
04f48a68
YHW
2499 nx_put_mff_header(out, move->src.field, ofp_version, false);
2500 nx_put_mff_header(out, move->dst.field, ofp_version, false);
73178f20 2501 } else {
bad8a439 2502 struct nx_action_reg_move *narm = put_NXAST_REG_MOVE(out);
73178f20
BP
2503 narm->n_bits = htons(move->dst.n_bits);
2504 narm->src_ofs = htons(move->src.ofs);
2505 narm->dst_ofs = htons(move->dst.ofs);
04f48a68
YHW
2506 nx_put_mff_header(out, move->src.field, 0, false);
2507 nx_put_mff_header(out, move->dst.field, 0, false);
73178f20 2508 }
bad8a439 2509 pad_ofpat(out, start_ofs);
c2d936a4 2510}
e9536ecb 2511
cab50449 2512static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
2513parse_REG_MOVE(const char *arg,
2514 const struct ofputil_port_map *port_map OVS_UNUSED,
2515 struct ofpbuf *ofpacts,
c2d936a4
BP
2516 enum ofputil_protocol *usable_protocols OVS_UNUSED)
2517{
2518 struct ofpact_reg_move *move = ofpact_put_REG_MOVE(ofpacts);
21b2fa61 2519 return nxm_parse_reg_move(move, arg);
c2d936a4 2520}
0f3f3c3d 2521
c2d936a4 2522static void
50f96b10
BP
2523format_REG_MOVE(const struct ofpact_reg_move *a,
2524 const struct ofputil_port_map *port_map OVS_UNUSED,
2525 struct ds *s)
c2d936a4
BP
2526{
2527 nxm_format_reg_move(a, s);
2528}
2529\f
7eb4b1f1
BP
2530/* Action structure for OFPAT12_SET_FIELD. */
2531struct ofp12_action_set_field {
2532 ovs_be16 type; /* OFPAT12_SET_FIELD. */
2533 ovs_be16 len; /* Length is padded to 64 bits. */
2534
2535 /* Followed by:
2536 * - An OXM header, value, and (in OpenFlow 1.5+) optionally a mask.
2537 * - Enough 0-bytes to pad out to a multiple of 64 bits.
2538 *
2539 * The "pad" member is the beginning of the above. */
2540 uint8_t pad[4];
2541};
2542OFP_ASSERT(sizeof(struct ofp12_action_set_field) == 8);
2543
c2d936a4
BP
2544/* Action structure for NXAST_REG_LOAD.
2545 *
2546 * Copies value[0:n_bits] to dst[ofs:ofs+n_bits], where a[b:c] denotes the bits
2547 * within 'a' numbered 'b' through 'c' (not including bit 'c'). Bit numbering
2548 * starts at 0 for the least-significant bit, 1 for the next most significant
2549 * bit, and so on.
2550 *
2551 * 'dst' is an nxm_header with nxm_hasmask=0. See the documentation for
2552 * NXAST_REG_MOVE, above, for the permitted fields and for the side effects of
2553 * loading them.
2554 *
2555 * The 'ofs' and 'n_bits' fields are combined into a single 'ofs_nbits' field
2556 * to avoid enlarging the structure by another 8 bytes. To allow 'n_bits' to
2557 * take a value between 1 and 64 (inclusive) while taking up only 6 bits, it is
2558 * also stored as one less than its true value:
2559 *
2560 * 15 6 5 0
2561 * +------------------------------+------------------+
2562 * | ofs | n_bits - 1 |
2563 * +------------------------------+------------------+
2564 *
2565 * The switch will reject actions for which ofs+n_bits is greater than the
2566 * width of 'dst', or in which any bits in 'value' with value 2**n_bits or
2567 * greater are set to 1, with error type OFPET_BAD_ACTION, code
2568 * OFPBAC_BAD_ARGUMENT.
2569 */
2570struct nx_action_reg_load {
2571 ovs_be16 type; /* OFPAT_VENDOR. */
2572 ovs_be16 len; /* Length is 24. */
2573 ovs_be32 vendor; /* NX_VENDOR_ID. */
2574 ovs_be16 subtype; /* NXAST_REG_LOAD. */
2575 ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */
2576 ovs_be32 dst; /* Destination register. */
2577 ovs_be64 value; /* Immediate value. */
2578};
2579OFP_ASSERT(sizeof(struct nx_action_reg_load) == 24);
b676167a 2580
aad28f47
BP
2581/* The NXAST_REG_LOAD2 action structure is "struct ext_action_header",
2582 * followed by:
bad8a439 2583 *
aad28f47
BP
2584 * - An NXM/OXM header, value, and optionally a mask.
2585 * - Enough 0-bytes to pad out to a multiple of 64 bits.
2586 *
2587 * The "pad" member is the beginning of the above. */
bad8a439 2588
c2d936a4 2589static enum ofperr
7eb4b1f1 2590decode_ofpat_set_field(const struct ofp12_action_set_field *oasf,
04f48a68 2591 bool may_mask, const struct vl_mff_map *vl_mff_map,
5c7c16d8 2592 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
7fdb60a7 2593{
0a2869d5 2594 struct ofpbuf b = ofpbuf_const_initializer(oasf, ntohs(oasf->len));
7eb4b1f1 2595 ofpbuf_pull(&b, OBJECT_OFFSETOF(oasf, pad));
0a2869d5 2596
128684a6
JR
2597 union mf_value value, mask;
2598 const struct mf_field *field;
5c7c16d8
YHW
2599 enum ofperr error;
2600 error = mf_vl_mff_nx_pull_entry(&b, vl_mff_map, &field, &value,
2601 may_mask ? &mask : NULL, tlv_bitmap);
178742f9 2602 if (error) {
178742f9
BP
2603 return (error == OFPERR_OFPBMC_BAD_MASK
2604 ? OFPERR_OFPBAC_BAD_SET_MASK
2605 : error);
c2d936a4 2606 }
5c7c16d8 2607
7eb4b1f1 2608 if (!may_mask) {
128684a6 2609 memset(&mask, 0xff, field->n_bytes);
7eb4b1f1 2610 }
178742f9 2611
6fd6ed71 2612 if (!is_all_zeros(b.data, b.size)) {
c2d936a4
BP
2613 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
2614 }
7fdb60a7 2615
178742f9
BP
2616 /* OpenFlow says specifically that one may not set OXM_OF_IN_PORT via
2617 * Set-Field. */
128684a6 2618 if (field->id == MFF_IN_PORT_OXM) {
178742f9 2619 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
c2d936a4 2620 }
178742f9 2621
c2d936a4 2622 /* oxm_length is now validated to be compatible with mf_value. */
128684a6 2623 if (!field->writable) {
178742f9 2624 VLOG_WARN_RL(&rl, "destination field %s is not writable",
128684a6 2625 field->name);
c2d936a4
BP
2626 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
2627 }
c2d936a4 2628
d3cb080e 2629 /* The value must be valid for match. OpenFlow 1.5 also says,
7eb4b1f1
BP
2630 * "In an OXM_OF_VLAN_VID set-field action, the OFPVID_PRESENT bit must be
2631 * a 1-bit in oxm_value and in oxm_mask." */
128684a6
JR
2632 if (!mf_is_value_valid(field, &value)
2633 || (field->id == MFF_VLAN_VID
2634 && (!(mask.be16 & htons(OFPVID12_PRESENT))
2635 || !(value.be16 & htons(OFPVID12_PRESENT))))) {
c2d936a4 2636 struct ds ds = DS_EMPTY_INITIALIZER;
50f96b10 2637 mf_format(field, &value, NULL, NULL, &ds);
c2d936a4 2638 VLOG_WARN_RL(&rl, "Invalid value for set field %s: %s",
128684a6 2639 field->name, ds_cstr(&ds));
c2d936a4
BP
2640 ds_destroy(&ds);
2641
2642 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
7fdb60a7 2643 }
128684a6
JR
2644
2645 ofpact_put_set_field(ofpacts, field, &value, &mask);
c2d936a4 2646 return 0;
7fdb60a7
SH
2647}
2648
7eb4b1f1
BP
2649static enum ofperr
2650decode_OFPAT_RAW12_SET_FIELD(const struct ofp12_action_set_field *oasf,
f3cd3ac7 2651 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2652 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2653 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
7eb4b1f1 2654{
5c7c16d8
YHW
2655 return decode_ofpat_set_field(oasf, false, vl_mff_map, tlv_bitmap,
2656 ofpacts);
7eb4b1f1
BP
2657}
2658
2659static enum ofperr
2660decode_OFPAT_RAW15_SET_FIELD(const struct ofp12_action_set_field *oasf,
f3cd3ac7 2661 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2662 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2663 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
7eb4b1f1 2664{
5c7c16d8 2665 return decode_ofpat_set_field(oasf, true, vl_mff_map, tlv_bitmap, ofpacts);
7eb4b1f1
BP
2666}
2667
2668static enum ofperr
2669decode_NXAST_RAW_REG_LOAD(const struct nx_action_reg_load *narl,
f3cd3ac7 2670 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2671 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2672 uint64_t *tlv_bitmap, struct ofpbuf *out)
7eb4b1f1 2673{
7eb4b1f1
BP
2674 struct mf_subfield dst;
2675 enum ofperr error;
2676
7eb4b1f1
BP
2677 dst.ofs = nxm_decode_ofs(narl->ofs_nbits);
2678 dst.n_bits = nxm_decode_n_bits(narl->ofs_nbits);
5c7c16d8
YHW
2679 error = mf_vl_mff_mf_from_nxm_header(ntohl(narl->dst), vl_mff_map,
2680 &dst.field, tlv_bitmap);
2681 if (error) {
2682 return error;
04f48a68
YHW
2683 }
2684
7eb4b1f1
BP
2685 error = mf_check_dst(&dst, NULL);
2686 if (error) {
2687 return error;
2688 }
2689
2690 /* Reject 'narl' if a bit numbered 'n_bits' or higher is set to 1 in
2691 * narl->value. */
2692 if (dst.n_bits < 64 && ntohll(narl->value) >> dst.n_bits) {
2693 return OFPERR_OFPBAC_BAD_ARGUMENT;
2694 }
2695
128684a6
JR
2696 struct ofpact_set_field *sf = ofpact_put_reg_load(out, dst.field, NULL,
2697 NULL);
7eb4b1f1 2698 bitwise_put(ntohll(narl->value),
128684a6 2699 sf->value, dst.field->n_bytes, dst.ofs,
7eb4b1f1
BP
2700 dst.n_bits);
2701 bitwise_put(UINT64_MAX,
128684a6 2702 ofpact_set_field_mask(sf), dst.field->n_bytes, dst.ofs,
7eb4b1f1 2703 dst.n_bits);
7eb4b1f1
BP
2704 return 0;
2705}
2706
bad8a439 2707static enum ofperr
aad28f47 2708decode_NXAST_RAW_REG_LOAD2(const struct ext_action_header *eah,
f3cd3ac7 2709 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 2710 const struct vl_mff_map *vl_mff_map,
5c7c16d8 2711 uint64_t *tlv_bitmap, struct ofpbuf *out)
bad8a439 2712{
aad28f47
BP
2713 struct ofpbuf b = ofpbuf_const_initializer(eah, ntohs(eah->len));
2714 ofpbuf_pull(&b, OBJECT_OFFSETOF(eah, pad));
0a2869d5 2715
128684a6
JR
2716 union mf_value value, mask;
2717 const struct mf_field *field;
5c7c16d8
YHW
2718 enum ofperr error;
2719 error = mf_vl_mff_nx_pull_entry(&b, vl_mff_map, &field, &value, &mask,
2720 tlv_bitmap);
bad8a439
BP
2721 if (error) {
2722 return error;
2723 }
5c7c16d8 2724
6fd6ed71 2725 if (!is_all_zeros(b.data, b.size)) {
bad8a439
BP
2726 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
2727 }
2728
128684a6
JR
2729 if (!field->writable) {
2730 VLOG_WARN_RL(&rl, "destination field %s is not writable", field->name);
bad8a439
BP
2731 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
2732 }
128684a6
JR
2733
2734 /* Put value and mask. */
2735 ofpact_put_reg_load2(out, field, &value, &mask);
bad8a439
BP
2736 return 0;
2737}
2738
7fdb60a7 2739static void
128684a6
JR
2740put_set_field(struct ofpbuf *openflow, enum ofp_version ofp_version,
2741 enum mf_field_id field, uint64_t value_)
7fdb60a7 2742{
7eb4b1f1 2743 struct ofp12_action_set_field *oasf OVS_UNUSED;
178742f9 2744 int n_bytes = mf_from_id(field)->n_bytes;
6fd6ed71 2745 size_t start_ofs = openflow->size;
178742f9 2746 union mf_value value;
7fdb60a7 2747
178742f9 2748 value.be64 = htonll(value_ << (8 * (8 - n_bytes)));
7fdb60a7 2749
7eb4b1f1 2750 oasf = put_OFPAT12_SET_FIELD(openflow);
6fd6ed71 2751 openflow->size = openflow->size - sizeof oasf->pad;
04f48a68 2752 nx_put_entry(openflow, mf_from_id(field), ofp_version, &value, NULL);
178742f9 2753 pad_ofpat(openflow, start_ofs);
7fdb60a7
SH
2754}
2755
4b684612
BP
2756static void
2757put_reg_load(struct ofpbuf *openflow,
2758 const struct mf_subfield *dst, uint64_t value)
2759{
2760 ovs_assert(dst->n_bits <= 64);
2761
2762 struct nx_action_reg_load *narl = put_NXAST_REG_LOAD(openflow);
2763 narl->ofs_nbits = nxm_encode_ofs_nbits(dst->ofs, dst->n_bits);
04f48a68 2764 narl->dst = htonl(nxm_header_from_mff(dst->field));
4b684612
BP
2765 narl->value = htonll(value);
2766}
2767
7eb4b1f1
BP
2768static bool
2769next_load_segment(const struct ofpact_set_field *sf,
2770 struct mf_subfield *dst, uint64_t *value)
2771{
fa078489
BP
2772 int n_bits = sf->field->n_bits;
2773 int n_bytes = sf->field->n_bytes;
7eb4b1f1
BP
2774 int start = dst->ofs + dst->n_bits;
2775
fa078489 2776 if (start < n_bits) {
7eb4b1f1 2777 dst->field = sf->field;
128684a6
JR
2778 dst->ofs = bitwise_scan(ofpact_set_field_mask(sf), n_bytes, 1, start,
2779 n_bits);
fa078489 2780 if (dst->ofs < n_bits) {
128684a6
JR
2781 dst->n_bits = bitwise_scan(ofpact_set_field_mask(sf), n_bytes, 0,
2782 dst->ofs + 1,
fa078489 2783 MIN(dst->ofs + 64, n_bits)) - dst->ofs;
128684a6 2784 *value = bitwise_get(sf->value, n_bytes, dst->ofs, dst->n_bits);
7eb4b1f1
BP
2785 return true;
2786 }
2787 }
2788 return false;
2789}
178742f9 2790
7eb4b1f1 2791/* Convert 'sf' to a series of REG_LOADs. */
7fdb60a7 2792static void
c2d936a4 2793set_field_to_nxast(const struct ofpact_set_field *sf, struct ofpbuf *openflow)
7fdb60a7 2794{
bad8a439 2795 /* If 'sf' cannot be encoded as NXAST_REG_LOAD because it requires an
4fe04a7e
JG
2796 * experimenter OXM or is variable length (or if it came in as
2797 * NXAST_REG_LOAD2), encode as NXAST_REG_LOAD2. Otherwise use
2798 * NXAST_REG_LOAD, which is backward compatible. */
bad8a439 2799 if (sf->ofpact.raw == NXAST_RAW_REG_LOAD2
4fe04a7e 2800 || !mf_nxm_header(sf->field->id) || sf->field->variable_len) {
aad28f47 2801 struct ext_action_header *eah OVS_UNUSED;
6fd6ed71 2802 size_t start_ofs = openflow->size;
bad8a439 2803
aad28f47
BP
2804 eah = put_NXAST_REG_LOAD2(openflow);
2805 openflow->size = openflow->size - sizeof eah->pad;
04f48a68 2806 nx_put_entry(openflow, sf->field, 0, sf->value,
128684a6 2807 ofpact_set_field_mask(sf));
bad8a439
BP
2808 pad_ofpat(openflow, start_ofs);
2809 } else {
2810 struct mf_subfield dst;
2811 uint64_t value;
7eb4b1f1 2812
bad8a439
BP
2813 dst.ofs = dst.n_bits = 0;
2814 while (next_load_segment(sf, &dst, &value)) {
4b684612 2815 put_reg_load(openflow, &dst, value);
bad8a439 2816 }
7fdb60a7
SH
2817 }
2818}
2819
7eb4b1f1
BP
2820/* Convert 'sf', which must set an entire field, to standard OpenFlow 1.0/1.1
2821 * actions, if we can, falling back to Nicira extensions if we must.
7fdb60a7 2822 *
c2d936a4
BP
2823 * We check only meta-flow types that can appear within set field actions and
2824 * that have a mapping to compatible action types. These struct mf_field
2825 * definitions have a defined OXM or NXM header value and specify the field as
2826 * writable. */
2827static void
2828set_field_to_legacy_openflow(const struct ofpact_set_field *sf,
2829 enum ofp_version ofp_version,
2830 struct ofpbuf *out)
7fdb60a7 2831{
c2d936a4
BP
2832 switch ((int) sf->field->id) {
2833 case MFF_VLAN_TCI: {
128684a6 2834 ovs_be16 tci = sf->value->be16;
c2d936a4
BP
2835 bool cfi = (tci & htons(VLAN_CFI)) != 0;
2836 uint16_t vid = vlan_tci_to_vid(tci);
2837 uint8_t pcp = vlan_tci_to_pcp(tci);
2838
2839 if (ofp_version < OFP11_VERSION) {
2840 /* NXM_OF_VLAN_TCI to OpenFlow 1.0 mapping:
2841 *
2842 * If CFI=1, Add or modify VLAN VID & PCP.
2843 * If CFI=0, strip VLAN header, if any.
2844 */
2845 if (cfi) {
2846 put_OFPAT10_SET_VLAN_VID(out, vid);
2847 put_OFPAT10_SET_VLAN_PCP(out, pcp);
2848 } else {
2849 put_OFPAT10_STRIP_VLAN(out);
2850 }
2851 } else {
2852 /* NXM_OF_VLAN_TCI to OpenFlow 1.1 mapping:
2853 *
2854 * If CFI=1, Add or modify VLAN VID & PCP.
2855 * OpenFlow 1.1 set actions only apply if the packet
2856 * already has VLAN tags. To be sure that is the case
2857 * we have to push a VLAN header. As we do not support
2858 * multiple layers of VLANs, this is a no-op, if a VLAN
2859 * header already exists. This may backfire, however,
2860 * when we start supporting multiple layers of VLANs.
2861 * If CFI=0, strip VLAN header, if any.
2862 */
2863 if (cfi) {
2864 /* Push a VLAN tag, if one was not seen at action validation
2865 * time. */
2866 if (!sf->flow_has_vlan) {
2867 put_OFPAT11_PUSH_VLAN(out, htons(ETH_TYPE_VLAN_8021Q));
2868 }
2869 put_OFPAT11_SET_VLAN_VID(out, vid);
2870 put_OFPAT11_SET_VLAN_PCP(out, pcp);
2871 } else {
2872 /* If the flow did not match on vlan, we have no way of
2873 * knowing if the vlan tag exists, so we must POP just to be
2874 * sure. */
2875 put_OFPAT11_POP_VLAN(out);
2876 }
2877 }
2878 break;
2879 }
7fdb60a7 2880
c2d936a4 2881 case MFF_VLAN_VID: {
128684a6 2882 uint16_t vid = ntohs(sf->value->be16) & VLAN_VID_MASK;
c2d936a4
BP
2883 if (ofp_version == OFP10_VERSION) {
2884 put_OFPAT10_SET_VLAN_VID(out, vid);
2885 } else {
2886 put_OFPAT11_SET_VLAN_VID(out, vid);
2887 }
2888 break;
2889 }
2890
2891 case MFF_VLAN_PCP:
2892 if (ofp_version == OFP10_VERSION) {
128684a6 2893 put_OFPAT10_SET_VLAN_PCP(out, sf->value->u8);
c2d936a4 2894 } else {
128684a6 2895 put_OFPAT11_SET_VLAN_PCP(out, sf->value->u8);
c2d936a4
BP
2896 }
2897 break;
2898
2899 case MFF_ETH_SRC:
128684a6 2900 put_OFPAT_SET_DL_SRC(out, ofp_version)->dl_addr = sf->value->mac;
c2d936a4
BP
2901 break;
2902
2903 case MFF_ETH_DST:
128684a6 2904 put_OFPAT_SET_DL_DST(out, ofp_version)->dl_addr = sf->value->mac;
c2d936a4
BP
2905 break;
2906
2907 case MFF_IPV4_SRC:
128684a6 2908 put_OFPAT_SET_NW_SRC(out, ofp_version, sf->value->be32);
c2d936a4
BP
2909 break;
2910
2911 case MFF_IPV4_DST:
128684a6 2912 put_OFPAT_SET_NW_DST(out, ofp_version, sf->value->be32);
c2d936a4
BP
2913 break;
2914
2915 case MFF_IP_DSCP:
128684a6 2916 put_OFPAT_SET_NW_TOS(out, ofp_version, sf->value->u8);
c2d936a4
BP
2917 break;
2918
2919 case MFF_IP_DSCP_SHIFTED:
128684a6 2920 put_OFPAT_SET_NW_TOS(out, ofp_version, sf->value->u8 << 2);
c2d936a4
BP
2921 break;
2922
1a1e1a49
EG
2923 case MFF_IP_ECN: {
2924 struct ofpact_ecn ip_ecn = { .ecn = sf->value->u8 };
2925 encode_SET_IP_ECN(&ip_ecn, ofp_version, out);
4b684612 2926 break;
1a1e1a49 2927 }
4b684612 2928
c2d936a4
BP
2929 case MFF_TCP_SRC:
2930 case MFF_UDP_SRC:
128684a6 2931 put_OFPAT_SET_TP_SRC(out, sf->value->be16);
c2d936a4
BP
2932 break;
2933
2934 case MFF_TCP_DST:
2935 case MFF_UDP_DST:
128684a6 2936 put_OFPAT_SET_TP_DST(out, sf->value->be16);
c2d936a4
BP
2937 break;
2938
2939 default:
2940 set_field_to_nxast(sf, out);
2941 break;
7fdb60a7
SH
2942 }
2943}
2944
7eb4b1f1
BP
2945static void
2946set_field_to_set_field(const struct ofpact_set_field *sf,
2947 enum ofp_version ofp_version, struct ofpbuf *out)
2948{
2949 struct ofp12_action_set_field *oasf OVS_UNUSED;
6fd6ed71 2950 size_t start_ofs = out->size;
7eb4b1f1
BP
2951
2952 oasf = put_OFPAT12_SET_FIELD(out);
6fd6ed71 2953 out->size = out->size - sizeof oasf->pad;
04f48a68 2954 nx_put_entry(out, sf->field, ofp_version, sf->value,
128684a6 2955 ofpact_set_field_mask(sf));
7eb4b1f1
BP
2956 pad_ofpat(out, start_ofs);
2957}
2958
c2d936a4
BP
2959static void
2960encode_SET_FIELD(const struct ofpact_set_field *sf,
2961 enum ofp_version ofp_version, struct ofpbuf *out)
2962{
7eb4b1f1 2963 if (ofp_version >= OFP15_VERSION) {
bad8a439
BP
2964 /* OF1.5+ only has Set-Field (reg_load is redundant so we drop it
2965 * entirely). */
7eb4b1f1 2966 set_field_to_set_field(sf, ofp_version, out);
bad8a439
BP
2967 } else if (sf->ofpact.raw == NXAST_RAW_REG_LOAD ||
2968 sf->ofpact.raw == NXAST_RAW_REG_LOAD2) {
2969 /* It came in as reg_load, send it out the same way. */
7eb4b1f1
BP
2970 set_field_to_nxast(sf, out);
2971 } else if (ofp_version < OFP12_VERSION) {
2972 /* OpenFlow 1.0 and 1.1 don't have Set-Field. */
c2d936a4 2973 set_field_to_legacy_openflow(sf, ofp_version, out);
128684a6 2974 } else if (is_all_ones(ofpact_set_field_mask(sf), sf->field->n_bytes)) {
7eb4b1f1
BP
2975 /* We're encoding to OpenFlow 1.2, 1.3, or 1.4. The action sets an
2976 * entire field, so encode it as OFPAT_SET_FIELD. */
2977 set_field_to_set_field(sf, ofp_version, out);
c2d936a4 2978 } else {
7eb4b1f1
BP
2979 /* We're encoding to OpenFlow 1.2, 1.3, or 1.4. The action cannot be
2980 * encoded as OFPAT_SET_FIELD because it does not set an entire field,
2981 * so encode it as reg_load. */
2982 set_field_to_nxast(sf, out);
c2d936a4
BP
2983 }
2984}
2985
36b43aa6
JS
2986/* Parses the input argument 'arg' into the key, value, and delimiter
2987 * components that are common across the reg_load and set_field action format.
2988 *
2989 * With an argument like "1->metadata", sets the following pointers to
2990 * point within 'arg':
2991 * key: "metadata"
2992 * value: "1"
2993 * delim: "->"
2994 *
2995 * Returns NULL if successful, otherwise a malloc()'d string describing the
2996 * error. The caller is responsible for freeing the returned string. */
2997static char * OVS_WARN_UNUSED_RESULT
2998set_field_split_str(char *arg, char **key, char **value, char **delim)
2999{
3000 char *value_end;
3001
3002 *value = arg;
3003 value_end = strstr(arg, "->");
3004 *key = value_end + strlen("->");
3005 if (delim) {
3006 *delim = value_end;
3007 }
3008
3009 if (!value_end) {
3010 return xasprintf("%s: missing `->'", arg);
3011 }
3012 if (strlen(value_end) <= strlen("->")) {
3013 return xasprintf("%s: missing field name following `->'", arg);
3014 }
3015
3016 return NULL;
3017}
3018
c2d936a4
BP
3019/* Parses a "set_field" action with argument 'arg', appending the parsed
3020 * action to 'ofpacts'.
3021 *
3022 * Returns NULL if successful, otherwise a malloc()'d string describing the
3023 * error. The caller is responsible for freeing the returned string. */
cab50449 3024static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3025set_field_parse__(char *arg, const struct ofputil_port_map *port_map,
3026 struct ofpbuf *ofpacts,
c2d936a4 3027 enum ofputil_protocol *usable_protocols)
7fdb60a7 3028{
c2d936a4
BP
3029 char *value;
3030 char *delim;
3031 char *key;
3032 const struct mf_field *mf;
128684a6 3033 union mf_value sf_value, sf_mask;
c2d936a4 3034 char *error;
7fdb60a7 3035
36b43aa6
JS
3036 error = set_field_split_str(arg, &key, &value, &delim);
3037 if (error) {
3038 return error;
c2d936a4 3039 }
e3f8f887 3040
c2d936a4
BP
3041 mf = mf_from_name(key);
3042 if (!mf) {
3043 return xasprintf("%s is not a valid OXM field name", key);
3044 }
3045 if (!mf->writable) {
3046 return xasprintf("%s is read-only", key);
3047 }
128684a6 3048
c2d936a4 3049 delim[0] = '\0';
50f96b10 3050 error = mf_parse(mf, value, port_map, &sf_value, &sf_mask);
7fdb60a7
SH
3051 if (error) {
3052 return error;
3053 }
3054
128684a6 3055 if (!mf_is_value_valid(mf, &sf_value)) {
c2d936a4 3056 return xasprintf("%s is not a valid value for field %s", value, key);
7fdb60a7
SH
3057 }
3058
a4ce8b25 3059 *usable_protocols &= mf->usable_protocols_exact;
128684a6
JR
3060
3061 ofpact_put_set_field(ofpacts, mf, &sf_value, &sf_mask);
c2d936a4 3062 return NULL;
7fdb60a7
SH
3063}
3064
c2d936a4
BP
3065/* Parses 'arg' as the argument to a "set_field" action, and appends such an
3066 * action to 'ofpacts'.
3067 *
3068 * Returns NULL if successful, otherwise a malloc()'d string describing the
3069 * error. The caller is responsible for freeing the returned string. */
cab50449 3070static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3071parse_SET_FIELD(const char *arg, const struct ofputil_port_map *port_map,
3072 struct ofpbuf *ofpacts,
c2d936a4
BP
3073 enum ofputil_protocol *usable_protocols)
3074{
3075 char *copy = xstrdup(arg);
50f96b10 3076 char *error = set_field_parse__(copy, port_map, ofpacts, usable_protocols);
c2d936a4
BP
3077 free(copy);
3078 return error;
3079}
a359d5ad 3080
cab50449 3081static char * OVS_WARN_UNUSED_RESULT
7eb4b1f1
BP
3082parse_reg_load(char *arg, struct ofpbuf *ofpacts)
3083{
7eb4b1f1 3084 struct mf_subfield dst;
36b43aa6 3085 char *key, *value_str;
81270993 3086 union mf_value value;
7eb4b1f1
BP
3087 char *error;
3088
36b43aa6
JS
3089 error = set_field_split_str(arg, &key, &value_str, NULL);
3090 if (error) {
3091 return error;
7eb4b1f1 3092 }
36b43aa6
JS
3093
3094 error = mf_parse_subfield(&dst, key);
7eb4b1f1
BP
3095 if (error) {
3096 return error;
3097 }
3098
81270993
JS
3099 if (parse_int_string(value_str, (uint8_t *)&value, dst.field->n_bytes,
3100 &key)) {
3101 return xasprintf("%s: cannot parse integer value", arg);
3102 }
3103
3104 if (!bitwise_is_all_zeros(&value, dst.field->n_bytes, dst.n_bits,
3105 dst.field->n_bytes * 8 - dst.n_bits)) {
3106 struct ds ds;
3107
3108 ds_init(&ds);
50f96b10 3109 mf_format(dst.field, &value, NULL, NULL, &ds);
81270993
JS
3110 error = xasprintf("%s: value %s does not fit into %d bits",
3111 arg, ds_cstr(&ds), dst.n_bits);
3112 ds_destroy(&ds);
3113 return error;
7eb4b1f1
BP
3114 }
3115
128684a6
JR
3116 struct ofpact_set_field *sf = ofpact_put_reg_load(ofpacts, dst.field, NULL,
3117 NULL);
81270993 3118
128684a6
JR
3119 bitwise_copy(&value, dst.field->n_bytes, 0, sf->value,
3120 dst.field->n_bytes, dst.ofs, dst.n_bits);
3121 bitwise_one(ofpact_set_field_mask(sf), dst.field->n_bytes, dst.ofs,
3122 dst.n_bits);
7eb4b1f1
BP
3123 return NULL;
3124}
3125
c2d936a4 3126static void
50f96b10
BP
3127format_SET_FIELD(const struct ofpact_set_field *a,
3128 const struct ofputil_port_map *port_map,
3129 struct ds *s)
c2d936a4 3130{
7eb4b1f1
BP
3131 if (a->ofpact.raw == NXAST_RAW_REG_LOAD) {
3132 struct mf_subfield dst;
3133 uint64_t value;
3134
3135 dst.ofs = dst.n_bits = 0;
3136 while (next_load_segment(a, &dst, &value)) {
b1c5bf1f
QM
3137 ds_put_format(s, "%sload:%s%#"PRIx64"%s->%s",
3138 colors.special, colors.end, value,
3139 colors.special, colors.end);
7eb4b1f1
BP
3140 mf_format_subfield(&dst, s);
3141 ds_put_char(s, ',');
3142 }
3143 ds_chomp(s, ',');
3144 } else {
b1c5bf1f 3145 ds_put_format(s, "%sset_field:%s", colors.special, colors.end);
50f96b10 3146 mf_format(a->field, a->value, ofpact_set_field_mask(a), port_map, s);
b1c5bf1f
QM
3147 ds_put_format(s, "%s->%s%s",
3148 colors.special, colors.end, a->field->name);
7eb4b1f1
BP
3149 }
3150}
3151
128684a6
JR
3152/* Appends an OFPACT_SET_FIELD ofpact with enough space for the value and mask
3153 * for the 'field' to 'ofpacts' and returns it. Fills in the value from
3154 * 'value', if non-NULL, and mask from 'mask' if non-NULL. If 'value' is
3155 * non-NULL and 'mask' is NULL, an all-ones mask will be filled in. */
3156struct ofpact_set_field *
3157ofpact_put_set_field(struct ofpbuf *ofpacts, const struct mf_field *field,
3158 const void *value, const void *mask)
3159{
3160 struct ofpact_set_field *sf = ofpact_put_SET_FIELD(ofpacts);
3161 sf->field = field;
3162
3163 /* Fill in the value and mask if given, otherwise put zeroes so that the
3164 * caller may fill in the value and mask itself. */
3165 if (value) {
3166 ofpbuf_put_uninit(ofpacts, 2 * field->n_bytes);
3167 sf = ofpacts->header;
3168 memcpy(sf->value, value, field->n_bytes);
3169 if (mask) {
3170 memcpy(ofpact_set_field_mask(sf), mask, field->n_bytes);
3171 } else {
3172 memset(ofpact_set_field_mask(sf), 0xff, field->n_bytes);
3173 }
3174 } else {
3175 ofpbuf_put_zeros(ofpacts, 2 * field->n_bytes);
3176 sf = ofpacts->header;
3177 }
3178 /* Update length. */
3179 ofpact_finish_SET_FIELD(ofpacts, &sf);
3180
3181 return sf;
3182}
3183
7eb4b1f1
BP
3184/* Appends an OFPACT_SET_FIELD ofpact to 'ofpacts' and returns it. The ofpact
3185 * is marked such that, if possible, it will be translated to OpenFlow as
3186 * NXAST_REG_LOAD extension actions rather than OFPAT_SET_FIELD, either because
3187 * that was the way that the action was expressed when it came into OVS or for
3188 * backward compatibility. */
3189struct ofpact_set_field *
128684a6
JR
3190ofpact_put_reg_load(struct ofpbuf *ofpacts, const struct mf_field *field,
3191 const void *value, const void *mask)
7eb4b1f1 3192{
128684a6
JR
3193 struct ofpact_set_field *sf = ofpact_put_set_field(ofpacts, field, value,
3194 mask);
7eb4b1f1 3195 sf->ofpact.raw = NXAST_RAW_REG_LOAD;
128684a6 3196
7eb4b1f1 3197 return sf;
c2d936a4 3198}
128684a6
JR
3199
3200struct ofpact_set_field *
3201ofpact_put_reg_load2(struct ofpbuf *ofpacts, const struct mf_field *field,
3202 const void *value, const void *mask)
3203{
3204 struct ofpact_set_field *sf = ofpact_put_set_field(ofpacts, field, value,
3205 mask);
3206 sf->ofpact.raw = NXAST_RAW_REG_LOAD2;
3207
3208 return sf;
3209}
3210
c2d936a4
BP
3211\f
3212/* Action structure for NXAST_STACK_PUSH and NXAST_STACK_POP.
3213 *
3214 * Pushes (or pops) field[offset: offset + n_bits] to (or from)
3215 * top of the stack.
3216 */
3217struct nx_action_stack {
3218 ovs_be16 type; /* OFPAT_VENDOR. */
3219 ovs_be16 len; /* Length is 16. */
3220 ovs_be32 vendor; /* NX_VENDOR_ID. */
3221 ovs_be16 subtype; /* NXAST_STACK_PUSH or NXAST_STACK_POP. */
3222 ovs_be16 offset; /* Bit offset into the field. */
bad8a439
BP
3223 /* Followed by:
3224 * - OXM/NXM header for field to push or pop (4 or 8 bytes).
3225 * - ovs_be16 'n_bits', the number of bits to extract from the field.
3226 * - Enough 0-bytes to pad out the action to 24 bytes. */
3227 uint8_t pad[12]; /* See above. */
a359d5ad 3228};
c2d936a4 3229OFP_ASSERT(sizeof(struct nx_action_stack) == 24);
a359d5ad 3230
bad8a439 3231static enum ofperr
c2d936a4 3232decode_stack_action(const struct nx_action_stack *nasp,
5c7c16d8 3233 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap,
c2d936a4 3234 struct ofpact_stack *stack_action)
a359d5ad 3235{
5c7c16d8 3236 enum ofperr error;
c2d936a4 3237 stack_action->subfield.ofs = ntohs(nasp->offset);
bad8a439 3238
0a2869d5 3239 struct ofpbuf b = ofpbuf_const_initializer(nasp, sizeof *nasp);
bad8a439 3240 ofpbuf_pull(&b, OBJECT_OFFSETOF(nasp, pad));
5c7c16d8
YHW
3241 error = mf_vl_mff_nx_pull_header(&b, vl_mff_map,
3242 &stack_action->subfield.field, NULL,
3243 tlv_bitmap);
bad8a439
BP
3244 if (error) {
3245 return error;
3246 }
5c7c16d8 3247
6fd6ed71 3248 stack_action->subfield.n_bits = ntohs(*(const ovs_be16 *) b.data);
bad8a439 3249 ofpbuf_pull(&b, 2);
6fd6ed71 3250 if (!is_all_zeros(b.data, b.size)) {
bad8a439
BP
3251 return OFPERR_NXBRC_MUST_BE_ZERO;
3252 }
3253
3254 return 0;
a359d5ad
IY
3255}
3256
c2d936a4
BP
3257static enum ofperr
3258decode_NXAST_RAW_STACK_PUSH(const struct nx_action_stack *nasp,
f3cd3ac7 3259 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 3260 const struct vl_mff_map *vl_mff_map,
5c7c16d8 3261 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
a359d5ad 3262{
c2d936a4 3263 struct ofpact_stack *push = ofpact_put_STACK_PUSH(ofpacts);
5c7c16d8
YHW
3264 enum ofperr error = decode_stack_action(nasp, vl_mff_map, tlv_bitmap,
3265 push);
bad8a439 3266 return error ? error : nxm_stack_push_check(push, NULL);
a359d5ad
IY
3267}
3268
c2d936a4
BP
3269static enum ofperr
3270decode_NXAST_RAW_STACK_POP(const struct nx_action_stack *nasp,
f3cd3ac7 3271 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 3272 const struct vl_mff_map *vl_mff_map,
5c7c16d8 3273 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
084c53de 3274{
c2d936a4 3275 struct ofpact_stack *pop = ofpact_put_STACK_POP(ofpacts);
5c7c16d8
YHW
3276 enum ofperr error = decode_stack_action(nasp, vl_mff_map, tlv_bitmap,
3277 pop);
bad8a439 3278 return error ? error : nxm_stack_pop_check(pop, NULL);
084c53de
BP
3279}
3280
c2d936a4
BP
3281static void
3282encode_STACK_op(const struct ofpact_stack *stack_action,
3283 struct nx_action_stack *nasp)
c0621c39 3284{
bad8a439
BP
3285 struct ofpbuf b;
3286 ovs_be16 n_bits;
3287
c2d936a4 3288 nasp->offset = htons(stack_action->subfield.ofs);
bad8a439
BP
3289
3290 ofpbuf_use_stack(&b, nasp, ntohs(nasp->len));
3291 ofpbuf_put_uninit(&b, OBJECT_OFFSETOF(nasp, pad));
04f48a68 3292 nx_put_mff_header(&b, stack_action->subfield.field, 0, false);
bad8a439
BP
3293 n_bits = htons(stack_action->subfield.n_bits);
3294 ofpbuf_put(&b, &n_bits, sizeof n_bits);
c0621c39
AW
3295}
3296
c2d936a4
BP
3297static void
3298encode_STACK_PUSH(const struct ofpact_stack *stack,
3299 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
3300{
3301 encode_STACK_op(stack, put_NXAST_STACK_PUSH(out));
3302}
8e97815e 3303
c2d936a4
BP
3304static void
3305encode_STACK_POP(const struct ofpact_stack *stack,
3306 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
8e97815e 3307{
c2d936a4
BP
3308 encode_STACK_op(stack, put_NXAST_STACK_POP(out));
3309}
8e97815e 3310
cab50449 3311static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3312parse_STACK_PUSH(char *arg,
3313 const struct ofputil_port_map *port_map OVS_UNUSED,
3314 struct ofpbuf *ofpacts,
c2d936a4
BP
3315 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3316{
3317 return nxm_parse_stack_action(ofpact_put_STACK_PUSH(ofpacts), arg);
3318}
8e97815e 3319
cab50449 3320static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3321parse_STACK_POP(char *arg,
3322 const struct ofputil_port_map *port_map OVS_UNUSED,
3323 struct ofpbuf *ofpacts,
c2d936a4
BP
3324 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3325{
3326 return nxm_parse_stack_action(ofpact_put_STACK_POP(ofpacts), arg);
8e97815e
BP
3327}
3328
c2d936a4 3329static void
50f96b10
BP
3330format_STACK_PUSH(const struct ofpact_stack *a,
3331 const struct ofputil_port_map *port_map OVS_UNUSED,
3332 struct ds *s)
8e97815e 3333{
c2d936a4
BP
3334 nxm_format_stack_push(a, s);
3335}
8e97815e 3336
c2d936a4 3337static void
50f96b10
BP
3338format_STACK_POP(const struct ofpact_stack *a,
3339 const struct ofputil_port_map *port_map OVS_UNUSED,
3340 struct ds *s)
c2d936a4
BP
3341{
3342 nxm_format_stack_pop(a, s);
3343}
3344\f
3345/* Action structure for NXAST_DEC_TTL_CNT_IDS.
3346 *
3347 * If the packet is not IPv4 or IPv6, does nothing. For IPv4 or IPv6, if the
3348 * TTL or hop limit is at least 2, decrements it by 1. Otherwise, if TTL or
3349 * hop limit is 0 or 1, sends a packet-in to the controllers with each of the
3350 * 'n_controllers' controller IDs specified in 'cnt_ids'.
3351 *
3352 * (This differs from NXAST_DEC_TTL in that for NXAST_DEC_TTL the packet-in is
3353 * sent only to controllers with id 0.)
3354 */
3355struct nx_action_cnt_ids {
3356 ovs_be16 type; /* OFPAT_VENDOR. */
3357 ovs_be16 len; /* Length including slaves. */
3358 ovs_be32 vendor; /* NX_VENDOR_ID. */
3359 ovs_be16 subtype; /* NXAST_DEC_TTL_CNT_IDS. */
3360
3361 ovs_be16 n_controllers; /* Number of controllers. */
3362 uint8_t zeros[4]; /* Must be zero. */
3363
3364 /* Followed by 1 or more controller ids.
3365 *
3366 * uint16_t cnt_ids[]; // Controller ids.
3367 * uint8_t pad[]; // Must be 0 to 8-byte align cnt_ids[].
3368 */
3369};
3370OFP_ASSERT(sizeof(struct nx_action_cnt_ids) == 16);
3371
3372static enum ofperr
3373decode_OFPAT_RAW_DEC_NW_TTL(struct ofpbuf *out)
3374{
3375 uint16_t id = 0;
3376 struct ofpact_cnt_ids *ids;
3377 enum ofperr error = 0;
3378
3379 ids = ofpact_put_DEC_TTL(out);
3380 ids->n_controllers = 1;
3381 ofpbuf_put(out, &id, sizeof id);
6fd6ed71 3382 ids = out->header;
ce058104 3383 ofpact_finish_DEC_TTL(out, &ids);
c2d936a4
BP
3384 return error;
3385}
3386
3387static enum ofperr
3388decode_NXAST_RAW_DEC_TTL_CNT_IDS(const struct nx_action_cnt_ids *nac_ids,
f3cd3ac7 3389 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4
BP
3390 struct ofpbuf *out)
3391{
3392 struct ofpact_cnt_ids *ids;
3393 size_t ids_size;
3394 int i;
3395
3396 ids = ofpact_put_DEC_TTL(out);
3397 ids->ofpact.raw = NXAST_RAW_DEC_TTL_CNT_IDS;
3398 ids->n_controllers = ntohs(nac_ids->n_controllers);
3399 ids_size = ntohs(nac_ids->len) - sizeof *nac_ids;
3400
3401 if (!is_all_zeros(nac_ids->zeros, sizeof nac_ids->zeros)) {
3402 return OFPERR_NXBRC_MUST_BE_ZERO;
8e97815e 3403 }
c2d936a4
BP
3404
3405 if (ids_size < ids->n_controllers * sizeof(ovs_be16)) {
3406 VLOG_WARN_RL(&rl, "Nicira action dec_ttl_cnt_ids only has %"PRIuSIZE" "
3407 "bytes allocated for controller ids. %"PRIuSIZE" bytes "
fd13c6b5 3408 "are required for %u controllers.",
c2d936a4
BP
3409 ids_size, ids->n_controllers * sizeof(ovs_be16),
3410 ids->n_controllers);
3411 return OFPERR_OFPBAC_BAD_LEN;
3412 }
3413
3414 for (i = 0; i < ids->n_controllers; i++) {
3415 uint16_t id = ntohs(((ovs_be16 *)(nac_ids + 1))[i]);
3416 ofpbuf_put(out, &id, sizeof id);
6fd6ed71 3417 ids = out->header;
c2d936a4
BP
3418 }
3419
ce058104 3420 ofpact_finish_DEC_TTL(out, &ids);
c2d936a4
BP
3421
3422 return 0;
8e97815e
BP
3423}
3424
c2d936a4
BP
3425static void
3426encode_DEC_TTL(const struct ofpact_cnt_ids *dec_ttl,
3427 enum ofp_version ofp_version, struct ofpbuf *out)
8e97815e 3428{
c2d936a4
BP
3429 if (dec_ttl->ofpact.raw == NXAST_RAW_DEC_TTL_CNT_IDS
3430 || dec_ttl->n_controllers != 1
3431 || dec_ttl->cnt_ids[0] != 0) {
3432 struct nx_action_cnt_ids *nac_ids = put_NXAST_DEC_TTL_CNT_IDS(out);
3433 int ids_len = ROUND_UP(2 * dec_ttl->n_controllers, OFP_ACTION_ALIGN);
3434 ovs_be16 *ids;
3435 size_t i;
8e97815e 3436
c2d936a4
BP
3437 nac_ids->len = htons(ntohs(nac_ids->len) + ids_len);
3438 nac_ids->n_controllers = htons(dec_ttl->n_controllers);
3439
3440 ids = ofpbuf_put_zeros(out, ids_len);
3441 for (i = 0; i < dec_ttl->n_controllers; i++) {
3442 ids[i] = htons(dec_ttl->cnt_ids[i]);
8e97815e 3443 }
c2d936a4
BP
3444 } else {
3445 put_OFPAT_DEC_NW_TTL(out, ofp_version);
8e97815e 3446 }
8e97815e
BP
3447}
3448
c2d936a4
BP
3449static void
3450parse_noargs_dec_ttl(struct ofpbuf *ofpacts)
d01c980f 3451{
c2d936a4
BP
3452 struct ofpact_cnt_ids *ids;
3453 uint16_t id = 0;
3454
3455 ofpact_put_DEC_TTL(ofpacts);
3456 ofpbuf_put(ofpacts, &id, sizeof id);
6fd6ed71 3457 ids = ofpacts->header;
c2d936a4 3458 ids->n_controllers++;
ce058104 3459 ofpact_finish_DEC_TTL(ofpacts, &ids);
d01c980f
BP
3460}
3461
cab50449 3462static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3463parse_DEC_TTL(char *arg,
3464 const struct ofputil_port_map *port_map OVS_UNUSED,
3465 struct ofpbuf *ofpacts,
c2d936a4 3466 enum ofputil_protocol *usable_protocols OVS_UNUSED)
d01c980f 3467{
c2d936a4
BP
3468 if (*arg == '\0') {
3469 parse_noargs_dec_ttl(ofpacts);
3470 } else {
3471 struct ofpact_cnt_ids *ids;
3472 char *cntr;
3473
3474 ids = ofpact_put_DEC_TTL(ofpacts);
3475 ids->ofpact.raw = NXAST_RAW_DEC_TTL_CNT_IDS;
3476 for (cntr = strtok_r(arg, ", ", &arg); cntr != NULL;
3477 cntr = strtok_r(NULL, ", ", &arg)) {
3478 uint16_t id = atoi(cntr);
3479
3480 ofpbuf_put(ofpacts, &id, sizeof id);
6fd6ed71 3481 ids = ofpacts->header;
c2d936a4
BP
3482 ids->n_controllers++;
3483 }
3484 if (!ids->n_controllers) {
3485 return xstrdup("dec_ttl_cnt_ids: expected at least one controller "
3486 "id.");
3487 }
ce058104 3488 ofpact_finish_DEC_TTL(ofpacts, &ids);
c2d936a4
BP
3489 }
3490 return NULL;
d01c980f
BP
3491}
3492
c2d936a4 3493static void
50f96b10
BP
3494format_DEC_TTL(const struct ofpact_cnt_ids *a,
3495 const struct ofputil_port_map *port_map OVS_UNUSED,
3496 struct ds *s)
d01c980f 3497{
c2d936a4 3498 size_t i;
d01c980f 3499
b1c5bf1f 3500 ds_put_format(s, "%sdec_ttl%s", colors.paren, colors.end);
c2d936a4 3501 if (a->ofpact.raw == NXAST_RAW_DEC_TTL_CNT_IDS) {
b1c5bf1f 3502 ds_put_format(s, "%s(%s", colors.paren, colors.end);
c2d936a4
BP
3503 for (i = 0; i < a->n_controllers; i++) {
3504 if (i) {
3505 ds_put_cstr(s, ",");
d01c980f 3506 }
c2d936a4
BP
3507 ds_put_format(s, "%"PRIu16, a->cnt_ids[i]);
3508 }
b1c5bf1f 3509 ds_put_format(s, "%s)%s", colors.paren, colors.end);
d01c980f
BP
3510 }
3511}
c2d936a4
BP
3512\f
3513/* Set MPLS label actions. */
d01c980f
BP
3514
3515static enum ofperr
f3cd3ac7
JS
3516decode_OFPAT_RAW_SET_MPLS_LABEL(ovs_be32 label,
3517 enum ofp_version ofp_version OVS_UNUSED,
3518 struct ofpbuf *out)
d01c980f 3519{
c2d936a4
BP
3520 ofpact_put_SET_MPLS_LABEL(out)->label = label;
3521 return 0;
3522}
d01c980f 3523
c2d936a4
BP
3524static void
3525encode_SET_MPLS_LABEL(const struct ofpact_mpls_label *label,
3526 enum ofp_version ofp_version,
3527 struct ofpbuf *out)
3528{
3529 if (ofp_version < OFP12_VERSION) {
3530 put_OFPAT_SET_MPLS_LABEL(out, ofp_version, label->label);
3531 } else {
128684a6 3532 put_set_field(out, ofp_version, MFF_MPLS_LABEL, ntohl(label->label));
d01c980f 3533 }
c2d936a4 3534}
d01c980f 3535
cab50449 3536static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3537parse_SET_MPLS_LABEL(char *arg,
3538 const struct ofputil_port_map *port_map OVS_UNUSED,
3539 struct ofpbuf *ofpacts,
c2d936a4
BP
3540 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3541{
3542 struct ofpact_mpls_label *mpls_label = ofpact_put_SET_MPLS_LABEL(ofpacts);
3543 if (*arg == '\0') {
3544 return xstrdup("set_mpls_label: expected label.");
d01c980f 3545 }
c2d936a4
BP
3546
3547 mpls_label->label = htonl(atoi(arg));
3548 return NULL;
d01c980f
BP
3549}
3550
3551static void
50f96b10
BP
3552format_SET_MPLS_LABEL(const struct ofpact_mpls_label *a,
3553 const struct ofputil_port_map *port_map OVS_UNUSED,
3554 struct ds *s)
d01c980f 3555{
b1c5bf1f
QM
3556 ds_put_format(s, "%sset_mpls_label(%s%"PRIu32"%s)%s",
3557 colors.paren, colors.end, ntohl(a->label),
3558 colors.paren, colors.end);
d01c980f 3559}
c2d936a4
BP
3560\f
3561/* Set MPLS TC actions. */
d01c980f 3562
c2d936a4 3563static enum ofperr
f3cd3ac7
JS
3564decode_OFPAT_RAW_SET_MPLS_TC(uint8_t tc,
3565 enum ofp_version ofp_version OVS_UNUSED,
3566 struct ofpbuf *out)
d01c980f 3567{
c2d936a4
BP
3568 ofpact_put_SET_MPLS_TC(out)->tc = tc;
3569 return 0;
3570}
d01c980f 3571
c2d936a4
BP
3572static void
3573encode_SET_MPLS_TC(const struct ofpact_mpls_tc *tc,
3574 enum ofp_version ofp_version, struct ofpbuf *out)
3575{
3576 if (ofp_version < OFP12_VERSION) {
3577 put_OFPAT_SET_MPLS_TC(out, ofp_version, tc->tc);
3578 } else {
128684a6 3579 put_set_field(out, ofp_version, MFF_MPLS_TC, tc->tc);
8f2cded4 3580 }
c2d936a4 3581}
8f2cded4 3582
cab50449 3583static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3584parse_SET_MPLS_TC(char *arg,
3585 const struct ofputil_port_map *port_map OVS_UNUSED,
3586 struct ofpbuf *ofpacts,
c2d936a4
BP
3587 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3588{
3589 struct ofpact_mpls_tc *mpls_tc = ofpact_put_SET_MPLS_TC(ofpacts);
d01c980f 3590
c2d936a4
BP
3591 if (*arg == '\0') {
3592 return xstrdup("set_mpls_tc: expected tc.");
d01c980f
BP
3593 }
3594
c2d936a4
BP
3595 mpls_tc->tc = atoi(arg);
3596 return NULL;
3597}
d01c980f 3598
c2d936a4 3599static void
50f96b10
BP
3600format_SET_MPLS_TC(const struct ofpact_mpls_tc *a,
3601 const struct ofputil_port_map *port_map OVS_UNUSED,
3602 struct ds *s)
c2d936a4 3603{
b1c5bf1f
QM
3604 ds_put_format(s, "%sset_mpls_ttl(%s%"PRIu8"%s)%s",
3605 colors.paren, colors.end, a->tc,
3606 colors.paren, colors.end);
c2d936a4
BP
3607}
3608\f
3609/* Set MPLS TTL actions. */
d01c980f 3610
c2d936a4 3611static enum ofperr
f3cd3ac7
JS
3612decode_OFPAT_RAW_SET_MPLS_TTL(uint8_t ttl,
3613 enum ofp_version ofp_version OVS_UNUSED,
3614 struct ofpbuf *out)
c2d936a4
BP
3615{
3616 ofpact_put_SET_MPLS_TTL(out)->ttl = ttl;
3617 return 0;
3618}
638a19b0 3619
c2d936a4
BP
3620static void
3621encode_SET_MPLS_TTL(const struct ofpact_mpls_ttl *ttl,
3622 enum ofp_version ofp_version, struct ofpbuf *out)
3623{
3624 put_OFPAT_SET_MPLS_TTL(out, ofp_version, ttl->ttl);
3625}
638a19b0 3626
c2d936a4
BP
3627/* Parses 'arg' as the argument to a "set_mpls_ttl" action, and appends such an
3628 * action to 'ofpacts'.
3629 *
3630 * Returns NULL if successful, otherwise a malloc()'d string describing the
3631 * error. The caller is responsible for freeing the returned string. */
cab50449 3632static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3633parse_SET_MPLS_TTL(char *arg,
3634 const struct ofputil_port_map *port_map OVS_UNUSED,
3635 struct ofpbuf *ofpacts,
c2d936a4
BP
3636 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3637{
3638 struct ofpact_mpls_ttl *mpls_ttl = ofpact_put_SET_MPLS_TTL(ofpacts);
d01c980f 3639
c2d936a4
BP
3640 if (*arg == '\0') {
3641 return xstrdup("set_mpls_ttl: expected ttl.");
b19e8793 3642 }
7fdb60a7 3643
c2d936a4
BP
3644 mpls_ttl->ttl = atoi(arg);
3645 return NULL;
3646}
4cceacb9 3647
c2d936a4 3648static void
50f96b10
BP
3649format_SET_MPLS_TTL(const struct ofpact_mpls_ttl *a,
3650 const struct ofputil_port_map *port_map OVS_UNUSED,
3651 struct ds *s)
c2d936a4 3652{
b1c5bf1f
QM
3653 ds_put_format(s, "%sset_mpls_ttl(%s%"PRIu8"%s)%s",
3654 colors.paren, colors.end, a->ttl,
3655 colors.paren, colors.end);
c2d936a4
BP
3656}
3657\f
3658/* Decrement MPLS TTL actions. */
4cceacb9 3659
c2d936a4
BP
3660static enum ofperr
3661decode_OFPAT_RAW_DEC_MPLS_TTL(struct ofpbuf *out)
3662{
3663 ofpact_put_DEC_MPLS_TTL(out);
3664 return 0;
3665}
8dd54666 3666
c2d936a4
BP
3667static void
3668encode_DEC_MPLS_TTL(const struct ofpact_null *null OVS_UNUSED,
3669 enum ofp_version ofp_version, struct ofpbuf *out)
3670{
3671 put_OFPAT_DEC_MPLS_TTL(out, ofp_version);
3672}
3673
cab50449 3674static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3675parse_DEC_MPLS_TTL(char *arg OVS_UNUSED,
3676 const struct ofputil_port_map *port_map OVS_UNUSED,
3677 struct ofpbuf *ofpacts,
c2d936a4
BP
3678 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3679{
3680 ofpact_put_DEC_MPLS_TTL(ofpacts);
3681 return NULL;
3682}
3683
3684static void
50f96b10
BP
3685format_DEC_MPLS_TTL(const struct ofpact_null *a OVS_UNUSED,
3686 const struct ofputil_port_map *port_map OVS_UNUSED,
3687 struct ds *s)
c2d936a4 3688{
b1c5bf1f 3689 ds_put_format(s, "%sdec_mpls_ttl%s", colors.value, colors.end);
c2d936a4
BP
3690}
3691\f
3692/* Push MPLS label action. */
3693
3694static enum ofperr
f3cd3ac7
JS
3695decode_OFPAT_RAW_PUSH_MPLS(ovs_be16 ethertype,
3696 enum ofp_version ofp_version OVS_UNUSED,
3697 struct ofpbuf *out)
c2d936a4
BP
3698{
3699 struct ofpact_push_mpls *oam;
3700
3701 if (!eth_type_mpls(ethertype)) {
3702 return OFPERR_OFPBAC_BAD_ARGUMENT;
8dd54666 3703 }
c2d936a4
BP
3704 oam = ofpact_put_PUSH_MPLS(out);
3705 oam->ethertype = ethertype;
d01c980f 3706
c2d936a4
BP
3707 return 0;
3708}
3709
3710static void
3711encode_PUSH_MPLS(const struct ofpact_push_mpls *push_mpls,
3712 enum ofp_version ofp_version, struct ofpbuf *out)
3713{
3714 put_OFPAT_PUSH_MPLS(out, ofp_version, push_mpls->ethertype);
3715}
3716
cab50449 3717static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3718parse_PUSH_MPLS(char *arg,
3719 const struct ofputil_port_map *port_map OVS_UNUSED,
3720 struct ofpbuf *ofpacts,
c2d936a4
BP
3721 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3722{
3723 uint16_t ethertype;
3724 char *error;
3725
3726 error = str_to_u16(arg, "push_mpls", &ethertype);
3727 if (!error) {
3728 ofpact_put_PUSH_MPLS(ofpacts)->ethertype = htons(ethertype);
d01c980f
BP
3729 }
3730 return error;
3731}
c2d936a4
BP
3732
3733static void
50f96b10
BP
3734format_PUSH_MPLS(const struct ofpact_push_mpls *a,
3735 const struct ofputil_port_map *port_map OVS_UNUSED,
3736 struct ds *s)
c2d936a4 3737{
b1c5bf1f
QM
3738 ds_put_format(s, "%spush_mpls:%s0x%04"PRIx16,
3739 colors.param, colors.end, ntohs(a->ethertype));
c2d936a4 3740}
d01c980f 3741\f
c2d936a4
BP
3742/* Pop MPLS label action. */
3743
3744static enum ofperr
f3cd3ac7
JS
3745decode_OFPAT_RAW_POP_MPLS(ovs_be16 ethertype,
3746 enum ofp_version ofp_version OVS_UNUSED,
3747 struct ofpbuf *out)
57ad4e9e 3748{
c2d936a4
BP
3749 ofpact_put_POP_MPLS(out)->ethertype = ethertype;
3750 return 0;
3751}
57ad4e9e 3752
c2d936a4
BP
3753static void
3754encode_POP_MPLS(const struct ofpact_pop_mpls *pop_mpls,
3755 enum ofp_version ofp_version, struct ofpbuf *out)
3756{
3757 put_OFPAT_POP_MPLS(out, ofp_version, pop_mpls->ethertype);
3758}
3759
cab50449 3760static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3761parse_POP_MPLS(char *arg,
3762 const struct ofputil_port_map *port_map OVS_UNUSED,
3763 struct ofpbuf *ofpacts,
3764 enum ofputil_protocol *usable_protocols OVS_UNUSED)
c2d936a4
BP
3765{
3766 uint16_t ethertype;
3767 char *error;
3768
3769 error = str_to_u16(arg, "pop_mpls", &ethertype);
3770 if (!error) {
3771 ofpact_put_POP_MPLS(ofpacts)->ethertype = htons(ethertype);
57ad4e9e 3772 }
c2d936a4 3773 return error;
57ad4e9e
BP
3774}
3775
ba2fe8e9 3776static void
50f96b10
BP
3777format_POP_MPLS(const struct ofpact_pop_mpls *a,
3778 const struct ofputil_port_map *port_map OVS_UNUSED,
3779 struct ds *s)
ba2fe8e9 3780{
b1c5bf1f
QM
3781 ds_put_format(s, "%spop_mpls:%s0x%04"PRIx16,
3782 colors.param, colors.end, ntohs(a->ethertype));
ba2fe8e9 3783}
c2d936a4
BP
3784\f
3785/* Set tunnel ID actions. */
ba2fe8e9 3786
f25d0cf3 3787static enum ofperr
f3cd3ac7
JS
3788decode_NXAST_RAW_SET_TUNNEL(uint32_t tun_id,
3789 enum ofp_version ofp_version OVS_UNUSED,
3790 struct ofpbuf *out)
f25d0cf3 3791{
c2d936a4
BP
3792 struct ofpact_tunnel *tunnel = ofpact_put_SET_TUNNEL(out);
3793 tunnel->ofpact.raw = NXAST_RAW_SET_TUNNEL;
3794 tunnel->tun_id = tun_id;
3795 return 0;
3796}
f25d0cf3 3797
c2d936a4 3798static enum ofperr
f3cd3ac7
JS
3799decode_NXAST_RAW_SET_TUNNEL64(uint64_t tun_id,
3800 enum ofp_version ofp_version OVS_UNUSED,
3801 struct ofpbuf *out)
c2d936a4
BP
3802{
3803 struct ofpact_tunnel *tunnel = ofpact_put_SET_TUNNEL(out);
3804 tunnel->ofpact.raw = NXAST_RAW_SET_TUNNEL64;
3805 tunnel->tun_id = tun_id;
3806 return 0;
3807}
f25d0cf3 3808
c2d936a4
BP
3809static void
3810encode_SET_TUNNEL(const struct ofpact_tunnel *tunnel,
3811 enum ofp_version ofp_version, struct ofpbuf *out)
3812{
3813 uint64_t tun_id = tunnel->tun_id;
f25d0cf3 3814
c2d936a4
BP
3815 if (ofp_version < OFP12_VERSION) {
3816 if (tun_id <= UINT32_MAX
3817 && tunnel->ofpact.raw != NXAST_RAW_SET_TUNNEL64) {
3818 put_NXAST_SET_TUNNEL(out, tun_id);
3819 } else {
3820 put_NXAST_SET_TUNNEL64(out, tun_id);
f25d0cf3 3821 }
c2d936a4 3822 } else {
128684a6 3823 put_set_field(out, ofp_version, MFF_TUN_ID, tun_id);
c2d936a4
BP
3824 }
3825}
f25d0cf3 3826
cab50449 3827static char * OVS_WARN_UNUSED_RESULT
c2d936a4
BP
3828parse_set_tunnel(char *arg, struct ofpbuf *ofpacts,
3829 enum ofp_raw_action_type raw)
3830{
3831 struct ofpact_tunnel *tunnel;
ca287d20 3832
c2d936a4
BP
3833 tunnel = ofpact_put_SET_TUNNEL(ofpacts);
3834 tunnel->ofpact.raw = raw;
3835 return str_to_u64(arg, &tunnel->tun_id);
3836}
8621547c 3837
cab50449 3838static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3839parse_SET_TUNNEL(char *arg,
3840 const struct ofputil_port_map *port_map OVS_UNUSED,
3841 struct ofpbuf *ofpacts,
c2d936a4
BP
3842 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3843{
3844 return parse_set_tunnel(arg, ofpacts, NXAST_RAW_SET_TUNNEL);
3845}
8621547c 3846
c2d936a4 3847static void
50f96b10
BP
3848format_SET_TUNNEL(const struct ofpact_tunnel *a,
3849 const struct ofputil_port_map *port_map OVS_UNUSED,
3850 struct ds *s)
c2d936a4 3851{
b1c5bf1f 3852 ds_put_format(s, "%sset_tunnel%s:%s%#"PRIx64, colors.param,
c2d936a4
BP
3853 (a->tun_id > UINT32_MAX
3854 || a->ofpact.raw == NXAST_RAW_SET_TUNNEL64 ? "64" : ""),
b1c5bf1f 3855 colors.end, a->tun_id);
c2d936a4
BP
3856}
3857\f
3858/* Set queue action. */
8621547c 3859
c2d936a4 3860static enum ofperr
f3cd3ac7
JS
3861decode_OFPAT_RAW_SET_QUEUE(uint32_t queue_id,
3862 enum ofp_version ofp_version OVS_UNUSED,
3863 struct ofpbuf *out)
c2d936a4
BP
3864{
3865 ofpact_put_SET_QUEUE(out)->queue_id = queue_id;
3866 return 0;
3867}
8621547c 3868
c2d936a4
BP
3869static void
3870encode_SET_QUEUE(const struct ofpact_queue *queue,
3871 enum ofp_version ofp_version, struct ofpbuf *out)
3872{
3873 put_OFPAT_SET_QUEUE(out, ofp_version, queue->queue_id);
3874}
8621547c 3875
cab50449 3876static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3877parse_SET_QUEUE(char *arg,
3878 const struct ofputil_port_map *port_map OVS_UNUSED,
3879 struct ofpbuf *ofpacts,
c2d936a4
BP
3880 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3881{
3882 return str_to_u32(arg, &ofpact_put_SET_QUEUE(ofpacts)->queue_id);
3883}
8621547c 3884
c2d936a4 3885static void
50f96b10
BP
3886format_SET_QUEUE(const struct ofpact_queue *a,
3887 const struct ofputil_port_map *port_map OVS_UNUSED,
3888 struct ds *s)
c2d936a4 3889{
b1c5bf1f
QM
3890 ds_put_format(s, "%sset_queue:%s%"PRIu32,
3891 colors.param, colors.end, a->queue_id);
c2d936a4
BP
3892}
3893\f
3894/* Pop queue action. */
1e7db674 3895
c2d936a4
BP
3896static enum ofperr
3897decode_NXAST_RAW_POP_QUEUE(struct ofpbuf *out)
3898{
3899 ofpact_put_POP_QUEUE(out);
3900 return 0;
3901}
f25d0cf3 3902
c2d936a4
BP
3903static void
3904encode_POP_QUEUE(const struct ofpact_null *null OVS_UNUSED,
3905 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
3906{
3907 put_NXAST_POP_QUEUE(out);
3908}
f25d0cf3 3909
cab50449 3910static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3911parse_POP_QUEUE(const char *arg OVS_UNUSED,
3912 const struct ofputil_port_map *port_map OVS_UNUSED,
3913 struct ofpbuf *ofpacts,
c2d936a4
BP
3914 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3915{
3916 ofpact_put_POP_QUEUE(ofpacts);
3917 return NULL;
3918}
f25d0cf3 3919
c2d936a4 3920static void
50f96b10
BP
3921format_POP_QUEUE(const struct ofpact_null *a OVS_UNUSED,
3922 const struct ofputil_port_map *port_map OVS_UNUSED,
3923 struct ds *s)
c2d936a4 3924{
b1c5bf1f 3925 ds_put_format(s, "%spop_queue%s", colors.value, colors.end);
c2d936a4
BP
3926}
3927\f
3928/* Action structure for NXAST_FIN_TIMEOUT.
3929 *
3930 * This action changes the idle timeout or hard timeout, or both, of this
3931 * OpenFlow rule when the rule matches a TCP packet with the FIN or RST flag.
3932 * When such a packet is observed, the action reduces the rule's idle timeout
3933 * to 'fin_idle_timeout' and its hard timeout to 'fin_hard_timeout'. This
3934 * action has no effect on an existing timeout that is already shorter than the
3935 * one that the action specifies. A 'fin_idle_timeout' or 'fin_hard_timeout'
3936 * of zero has no effect on the respective timeout.
3937 *
3938 * 'fin_idle_timeout' and 'fin_hard_timeout' are measured in seconds.
3939 * 'fin_hard_timeout' specifies time since the flow's creation, not since the
3940 * receipt of the FIN or RST.
3941 *
3942 * This is useful for quickly discarding learned TCP flows that otherwise will
3943 * take a long time to expire.
3944 *
3945 * This action is intended for use with an OpenFlow rule that matches only a
3946 * single TCP flow. If the rule matches multiple TCP flows (e.g. it wildcards
3947 * all TCP traffic, or all TCP traffic to a particular port), then any FIN or
3948 * RST in any of those flows will cause the entire OpenFlow rule to expire
3949 * early, which is not normally desirable.
3950 */
3951struct nx_action_fin_timeout {
3952 ovs_be16 type; /* OFPAT_VENDOR. */
3953 ovs_be16 len; /* 16. */
3954 ovs_be32 vendor; /* NX_VENDOR_ID. */
3955 ovs_be16 subtype; /* NXAST_FIN_TIMEOUT. */
3956 ovs_be16 fin_idle_timeout; /* New idle timeout, if nonzero. */
3957 ovs_be16 fin_hard_timeout; /* New hard timeout, if nonzero. */
3958 ovs_be16 pad; /* Must be zero. */
3959};
3960OFP_ASSERT(sizeof(struct nx_action_fin_timeout) == 16);
f25d0cf3 3961
c2d936a4
BP
3962static enum ofperr
3963decode_NXAST_RAW_FIN_TIMEOUT(const struct nx_action_fin_timeout *naft,
f3cd3ac7 3964 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4
BP
3965 struct ofpbuf *out)
3966{
3967 struct ofpact_fin_timeout *oft;
8621547c 3968
c2d936a4
BP
3969 oft = ofpact_put_FIN_TIMEOUT(out);
3970 oft->fin_idle_timeout = ntohs(naft->fin_idle_timeout);
3971 oft->fin_hard_timeout = ntohs(naft->fin_hard_timeout);
3972 return 0;
3973}
f25d0cf3 3974
c2d936a4
BP
3975static void
3976encode_FIN_TIMEOUT(const struct ofpact_fin_timeout *fin_timeout,
3977 enum ofp_version ofp_version OVS_UNUSED,
3978 struct ofpbuf *out)
3979{
3980 struct nx_action_fin_timeout *naft = put_NXAST_FIN_TIMEOUT(out);
3981 naft->fin_idle_timeout = htons(fin_timeout->fin_idle_timeout);
3982 naft->fin_hard_timeout = htons(fin_timeout->fin_hard_timeout);
3983}
f25d0cf3 3984
cab50449 3985static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
3986parse_FIN_TIMEOUT(char *arg,
3987 const struct ofputil_port_map *port_map OVS_UNUSED,
3988 struct ofpbuf *ofpacts,
c2d936a4
BP
3989 enum ofputil_protocol *usable_protocols OVS_UNUSED)
3990{
3991 struct ofpact_fin_timeout *oft = ofpact_put_FIN_TIMEOUT(ofpacts);
3992 char *key, *value;
f25d0cf3 3993
c2d936a4
BP
3994 while (ofputil_parse_key_value(&arg, &key, &value)) {
3995 char *error;
b02475c5 3996
c2d936a4
BP
3997 if (!strcmp(key, "idle_timeout")) {
3998 error = str_to_u16(value, key, &oft->fin_idle_timeout);
3999 } else if (!strcmp(key, "hard_timeout")) {
4000 error = str_to_u16(value, key, &oft->fin_hard_timeout);
4001 } else {
4002 error = xasprintf("invalid key '%s' in 'fin_timeout' argument",
4003 key);
8621547c 4004 }
8dd54666 4005
c2d936a4
BP
4006 if (error) {
4007 return error;
9cae45dc 4008 }
9cae45dc 4009 }
c2d936a4
BP
4010 return NULL;
4011}
e3b56933 4012
c2d936a4 4013static void
50f96b10
BP
4014format_FIN_TIMEOUT(const struct ofpact_fin_timeout *a,
4015 const struct ofputil_port_map *port_map OVS_UNUSED,
4016 struct ds *s)
c2d936a4 4017{
b1c5bf1f 4018 ds_put_format(s, "%sfin_timeout(%s", colors.paren, colors.end);
c2d936a4 4019 if (a->fin_idle_timeout) {
b1c5bf1f
QM
4020 ds_put_format(s, "%sidle_timeout=%s%"PRIu16",",
4021 colors.param, colors.end, a->fin_idle_timeout);
7e9f8266 4022 }
c2d936a4 4023 if (a->fin_hard_timeout) {
b1c5bf1f
QM
4024 ds_put_format(s, "%shard_timeout=%s%"PRIu16",",
4025 colors.param, colors.end, a->fin_hard_timeout);
f25d0cf3 4026 }
c2d936a4 4027 ds_chomp(s, ',');
b1c5bf1f 4028 ds_put_format(s, "%s)%s", colors.paren, colors.end);
f25d0cf3 4029}
f839892a
JS
4030
4031/* Action structure for NXAST_ENCAP */
4032struct nx_action_encap {
4033 ovs_be16 type; /* OFPAT_VENDOR. */
4034 ovs_be16 len; /* Total size including any property TLVs. */
4035 ovs_be32 vendor; /* NX_VENDOR_ID. */
4036 ovs_be16 subtype; /* NXAST_ENCAP. */
4037 ovs_be16 hdr_size; /* Header size in bytes, 0 = 'not specified'.*/
4038 ovs_be32 new_pkt_type; /* Header type to add and PACKET_TYPE of result. */
4039 struct ofp_ed_prop_header props[]; /* Encap TLV properties. */
4040};
4041OFP_ASSERT(sizeof(struct nx_action_encap) == 16);
4042
4043static enum ofperr
4044decode_NXAST_RAW_ENCAP(const struct nx_action_encap *nae,
4045 enum ofp_version ofp_version OVS_UNUSED,
4046 struct ofpbuf *out)
4047{
4048 struct ofpact_encap *encap;
4049 const struct ofp_ed_prop_header *ofp_prop;
4050 size_t props_len;
4051 uint16_t n_props = 0;
4052 int err;
4053
4054 encap = ofpact_put_ENCAP(out);
4055 encap->ofpact.raw = NXAST_RAW_ENCAP;
4056 switch (ntohl(nae->new_pkt_type)) {
4057 case PT_ETH:
4058 /* Add supported encap header types here. */
4059 break;
4060 default:
4061 return OFPERR_NXBAC_BAD_HEADER_TYPE;
4062 }
4063 encap->new_pkt_type = nae->new_pkt_type;
4064 encap->hdr_size = ntohs(nae->hdr_size);
4065
4066 ofp_prop = nae->props;
4067 props_len = ntohs(nae->len) - offsetof(struct nx_action_encap, props);
4068 n_props = 0;
4069 while (props_len > 0) {
4070 err = decode_ed_prop(&ofp_prop, out, &props_len);
4071 if (err) {
4072 return err;
4073 }
4074 n_props++;
4075 }
4076 encap->n_props = n_props;
4077 out->header = &encap->ofpact;
4078 ofpact_finish_ENCAP(out, &encap);
4079
4080 return 0;
4081}
4082
4083static void
4084encode_ENCAP(const struct ofpact_encap *encap,
4085 enum ofp_version ofp_version OVS_UNUSED,
4086 struct ofpbuf *out)
4087{
4088 size_t start_ofs = out->size;
4089 struct nx_action_encap *nae = put_NXAST_ENCAP(out);
4090 int i;
4091
4092 nae->new_pkt_type = encap->new_pkt_type;
4093 nae->hdr_size = htons(encap->hdr_size);
4094 const struct ofpact_ed_prop *prop = encap->props;
4095 for (i = 0; i < encap->n_props; i++) {
4096 encode_ed_prop(&prop, out);
4097 }
4098 pad_ofpat(out, start_ofs);
4099}
4100
4101static bool
4102parse_encap_header(const char *hdr, ovs_be32 *packet_type)
4103{
4104 if (strcmp(hdr, "ethernet") == 0) {
4105 *packet_type = htonl(PT_ETH);
4106 } else {
4107 return false;
4108 }
4109 return true;
4110}
4111
4112static char *
4113parse_ed_props(const uint16_t prop_class, char **arg, int *n_props, struct ofpbuf *out)
4114{
4115 char *key, *value, *err;
4116 uint8_t prop_type;
4117
4118 while (ofputil_parse_key_value(arg, &key, &value)) {
4119 if (!parse_ed_prop_type(prop_class, key, &prop_type)) {
4120 return xasprintf("Invalid property: %s", key);
4121 }
4122 if (value == NULL) {
4123 return xasprintf("Missing the value for property: %s", key);
4124 }
4125 err = parse_ed_prop_value(prop_class, prop_type, value, out);
4126 if (err != NULL) {
4127 return err;
4128 }
4129 (*n_props)++;
4130 }
4131 return NULL;
4132}
4133
4134/* The string representation of the encap action is
4135 * encap(header_type(prop=<value>,tlv(<class>,<type>,<value>),...))
4136 */
4137
4138static char * OVS_WARN_UNUSED_RESULT
4139parse_ENCAP(char *arg,
4140 const struct ofputil_port_map *port_map OVS_UNUSED,
4141 struct ofpbuf *out,
4142 enum ofputil_protocol *usable_protocols OVS_UNUSED)
4143{
4144 struct ofpact_encap *encap;
4145 char *key, *value, *str;
4146 char *error = NULL;
4147 uint16_t prop_class;
4148 int n_props = 0;
4149
4150 encap = ofpact_put_ENCAP(out);
4151 encap->hdr_size = 0;
4152 /* Parse encap header type. */
4153 str = arg;
4154 if (!ofputil_parse_key_value(&arg, &key, &value)) {
4155 return xasprintf("Missing encap hdr: %s", str);
4156 }
4157 if (!parse_encap_header(key, &encap->new_pkt_type)) {
4158 return xasprintf("Encap hdr not supported: %s", value);
4159 }
4160 if (!parse_ed_prop_class(key, &prop_class)) {
4161 return xasprintf("Invalid encap prop class: %s", key);
4162 }
4163 /* Parse encap properties. */
4164 error = parse_ed_props(prop_class, &value, &n_props, out);
4165 if (error != NULL) {
4166 return error;
4167 }
4168 /* ofbuf out may have been re-allocated. */
4169 encap = out->header;
4170 encap->n_props = n_props;
4171 ofpact_finish_ENCAP(out, &encap);
4172 return NULL;
4173}
4174
4175static char *
4176format_encap_pkt_type(const ovs_be32 pkt_type)
4177{
4178 switch (ntohl(pkt_type)) {
4179 case PT_ETH:
4180 return "ethernet";
4181 default:
4182 return "UNKNOWN";
4183 }
4184}
4185
4186static void
4187format_ed_props(struct ds *s, uint16_t n_props,
4188 const struct ofpact_ed_prop *prop)
4189{
4190 const uint8_t *p = (uint8_t *) prop;
4191 int i;
4192
4193 if (n_props == 0) {
4194 return;
4195 }
4196 for (i = 0; i < n_props; i++) {
4197 format_ed_prop(s, prop);
4198 ds_put_char(s, ',');
4199 p += ROUND_UP(prop->len, 8);
4200 prop = ALIGNED_CAST(const struct ofpact_ed_prop *, p);
4201 }
4202 if (n_props > 0) {
4203 ds_chomp(s, ',');
4204 }
4205}
4206
4207static void
4208format_ENCAP(const struct ofpact_encap *a,
4209 const struct ofputil_port_map *port_map OVS_UNUSED,
4210 struct ds *s)
4211{
4212 ds_put_format(s, "%sencap(%s", colors.paren, colors.end);
4213 ds_put_format(s, "%s", format_encap_pkt_type(a->new_pkt_type));
4214 if (a->n_props > 0) {
4215 ds_put_format(s, "%s(%s", colors.paren, colors.end);
4216 format_ed_props(s, a->n_props, a->props);
4217 ds_put_format(s, "%s)%s", colors.paren, colors.end);
4218 }
4219 ds_put_format(s, "%s)%s", colors.paren, colors.end);
4220}
4221
4222/* Action structure for NXAST_DECAP */
4223struct nx_action_decap {
4224 ovs_be16 type; /* OFPAT_VENDOR. */
4225 ovs_be16 len; /* Total size including any property TLVs. */
4226 ovs_be32 vendor; /* NX_VENDOR_ID. */
4227 ovs_be16 subtype; /* NXAST_DECAP. */
4228 uint8_t pad[2]; /* 2 bytes padding */
4229
4230 /* Packet type or result.
4231 *
4232 * The special value (0,0xFFFE) "Use next proto"
4233 * is used to request OVS to automatically set the new packet type based
4234 * on the decap'ed header's next protocol.
4235 */
4236 ovs_be32 new_pkt_type;
4237};
4238OFP_ASSERT(sizeof(struct nx_action_decap) == 16);
4239
4240static enum ofperr
4241decode_NXAST_RAW_DECAP(const struct nx_action_decap *nad,
4242 enum ofp_version ofp_version OVS_UNUSED,
4243 struct ofpbuf *ofpacts)
4244{
4245 struct ofpact_decap * decap;
4246
4247 if (ntohs(nad->len) > sizeof *nad) {
4248 /* No properties supported yet. */
4249 return OFPERR_NXBAC_UNKNOWN_ED_PROP;
4250 }
4251
4252 decap = ofpact_put_DECAP(ofpacts);
4253 decap->ofpact.raw = NXAST_RAW_DECAP;
4254 decap->new_pkt_type = nad->new_pkt_type;
4255 return 0;
4256}
4257
4258static void
4259encode_DECAP(const struct ofpact_decap *decap,
4260 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
4261{
4262 struct nx_action_decap *nad = put_NXAST_DECAP(out);
4263
4264 nad->len = htons(sizeof(struct nx_action_decap));
4265 nad->new_pkt_type = decap->new_pkt_type;
4266}
4267
4268static char * OVS_WARN_UNUSED_RESULT
4269parse_DECAP(char *arg,
4270 const struct ofputil_port_map *port_map OVS_UNUSED,
4271 struct ofpbuf *ofpacts,
4272 enum ofputil_protocol *usable_protocols OVS_UNUSED)
4273{
4274 struct ofpact_decap *decap;
4275 char *key, *value, *pos;
4276 char *error = NULL;
4277 uint16_t ns, type;
4278
4279 decap = ofpact_put_DECAP(ofpacts);
4280 /* Default next packet_type is PT_USE_NEXT_PROTO. */
4281 decap->new_pkt_type = htonl(PT_USE_NEXT_PROTO);
4282
4283 /* Parse decap packet_type if given. */
4284 if (ofputil_parse_key_value(&arg, &key, &value)) {
4285 if (strcmp(key, "packet_type") == 0) {
4286 pos = value;
4287 if (!ofputil_parse_key_value(&pos, &key, &value)
4288 || strcmp(key, "ns") != 0) {
4289 return xstrdup("Missing packet_type attribute ns");
4290 }
4291 error = str_to_u16(value, "ns", &ns);
4292 if (error) {
4293 return error;
4294 }
4295 if (ns >= OFPHTN_N_TYPES) {
4296 return xasprintf("Unsupported ns value: %"PRIu16, ns);
4297 }
4298 if (!ofputil_parse_key_value(&pos, &key, &value)
4299 || strcmp(key, "type") != 0) {
4300 return xstrdup("Missing packet_type attribute type");
4301 }
4302 error = str_to_u16(value, "type", &type);
4303 if (error) {
4304 return error;
4305 }
4306 decap->new_pkt_type = htonl(PACKET_TYPE(ns, type));
4307 } else {
4308 return xasprintf("Invalid decap argument: %s", key);
4309 }
4310 }
4311 return NULL;
4312}
4313
4314static void
4315format_DECAP(const struct ofpact_decap *a,
4316 const struct ofputil_port_map *port_map OVS_UNUSED,
4317 struct ds *s)
4318{
4319 ds_put_format(s, "%sdecap(%s", colors.paren, colors.end);
4320 if (a->new_pkt_type != htonl(PT_USE_NEXT_PROTO)) {
4321 ds_put_format(s, "packet_type(ns=%"PRIu16",id=%#"PRIx16")",
4322 pt_ns(a->new_pkt_type),
4323 pt_ns_type(a->new_pkt_type));
4324 }
4325 ds_put_format(s, "%s)%s", colors.paren, colors.end);
4326}
4327
c2d936a4 4328\f
2cd20955
JR
4329/* Action structures for NXAST_RESUBMIT, NXAST_RESUBMIT_TABLE, and
4330 * NXAST_RESUBMIT_TABLE_CT.
eca39bce 4331 *
c2d936a4 4332 * These actions search one of the switch's flow tables:
ba2fe8e9 4333 *
2cd20955
JR
4334 * - For NXAST_RESUBMIT_TABLE and NXAST_RESUBMIT_TABLE_CT, if the
4335 * 'table' member is not 255, then it specifies the table to search.
ca287d20 4336 *
2cd20955
JR
4337 * - Otherwise (for NXAST_RESUBMIT_TABLE or NXAST_RESUBMIT_TABLE_CT with a
4338 * 'table' of 255, or for NXAST_RESUBMIT regardless of 'table'), it
4339 * searches the current flow table, that is, the OpenFlow flow table that
4340 * contains the flow from which this action was obtained. If this action
4341 * did not come from a flow table (e.g. it came from an OFPT_PACKET_OUT
4342 * message), then table 0 is the current table.
c2d936a4
BP
4343 *
4344 * The flow table lookup uses a flow that may be slightly modified from the
4345 * original lookup:
4346 *
4347 * - For NXAST_RESUBMIT, the 'in_port' member of struct nx_action_resubmit
4348 * is used as the flow's in_port.
4349 *
2cd20955
JR
4350 * - For NXAST_RESUBMIT_TABLE and NXAST_RESUBMIT_TABLE_CT, if the 'in_port'
4351 * member is not OFPP_IN_PORT, then its value is used as the flow's
4352 * in_port. Otherwise, the original in_port is used.
4353 *
4354 * - For NXAST_RESUBMIT_TABLE_CT the Conntrack 5-tuple fields are used as
4355 * the packets IP header fields during the lookup.
c2d936a4
BP
4356 *
4357 * - If actions that modify the flow (e.g. OFPAT_SET_VLAN_VID) precede the
4358 * resubmit action, then the flow is updated with the new values.
4359 *
4360 * Following the lookup, the original in_port is restored.
4361 *
4362 * If the modified flow matched in the flow table, then the corresponding
4363 * actions are executed. Afterward, actions following the resubmit in the
4364 * original set of actions, if any, are executed; any changes made to the
4365 * packet (e.g. changes to VLAN) by secondary actions persist when those
4366 * actions are executed, although the original in_port is restored.
4367 *
4368 * Resubmit actions may be used any number of times within a set of actions.
4369 *
790c5d26
BP
4370 * Resubmit actions may nest. To prevent infinite loops and excessive resource
4371 * use, the implementation may limit nesting depth and the total number of
4372 * resubmits:
4373 *
4374 * - Open vSwitch 1.0.1 and earlier did not support recursion.
4375 *
4376 * - Open vSwitch 1.0.2 and 1.0.3 limited recursion to 8 levels.
4377 *
4378 * - Open vSwitch 1.1 and 1.2 limited recursion to 16 levels.
4379 *
4380 * - Open vSwitch 1.2 through 1.8 limited recursion to 32 levels.
4381 *
4382 * - Open vSwitch 1.9 through 2.0 limited recursion to 64 levels.
4383 *
4384 * - Open vSwitch 2.1 through 2.5 limited recursion to 64 levels and impose
4385 * a total limit of 4,096 resubmits per flow translation (earlier versions
4386 * did not impose any total limit).
c2d936a4 4387 *
2cd20955
JR
4388 * NXAST_RESUBMIT ignores 'table' and 'pad'. NXAST_RESUBMIT_TABLE and
4389 * NXAST_RESUBMIT_TABLE_CT require 'pad' to be all-bits-zero.
c2d936a4
BP
4390 *
4391 * Open vSwitch 1.0.1 and earlier did not support recursion. Open vSwitch
2cd20955
JR
4392 * before 1.2.90 did not support NXAST_RESUBMIT_TABLE. Open vSwitch before
4393 * 2.8.0 did not support NXAST_RESUBMIT_TABLE_CT.
c2d936a4
BP
4394 */
4395struct nx_action_resubmit {
4396 ovs_be16 type; /* OFPAT_VENDOR. */
4397 ovs_be16 len; /* Length is 16. */
4398 ovs_be32 vendor; /* NX_VENDOR_ID. */
4399 ovs_be16 subtype; /* NXAST_RESUBMIT. */
4400 ovs_be16 in_port; /* New in_port for checking flow table. */
4401 uint8_t table; /* NXAST_RESUBMIT_TABLE: table to use. */
4402 uint8_t pad[3];
4403};
4404OFP_ASSERT(sizeof(struct nx_action_resubmit) == 16);
4405
4406static enum ofperr
f3cd3ac7
JS
4407decode_NXAST_RAW_RESUBMIT(uint16_t port,
4408 enum ofp_version ofp_version OVS_UNUSED,
4409 struct ofpbuf *out)
f25d0cf3 4410{
c2d936a4 4411 struct ofpact_resubmit *resubmit;
f25d0cf3 4412
c2d936a4
BP
4413 resubmit = ofpact_put_RESUBMIT(out);
4414 resubmit->ofpact.raw = NXAST_RAW_RESUBMIT;
4415 resubmit->in_port = u16_to_ofp(port);
4416 resubmit->table_id = 0xff;
4417 return 0;
f25d0cf3 4418}
4cceacb9 4419
c2d936a4
BP
4420static enum ofperr
4421decode_NXAST_RAW_RESUBMIT_TABLE(const struct nx_action_resubmit *nar,
f3cd3ac7 4422 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4 4423 struct ofpbuf *out)
ba2fe8e9 4424{
c2d936a4 4425 struct ofpact_resubmit *resubmit;
ba2fe8e9 4426
c2d936a4
BP
4427 if (nar->pad[0] || nar->pad[1] || nar->pad[2]) {
4428 return OFPERR_OFPBAC_BAD_ARGUMENT;
4429 }
4430
4431 resubmit = ofpact_put_RESUBMIT(out);
4432 resubmit->ofpact.raw = NXAST_RAW_RESUBMIT_TABLE;
4433 resubmit->in_port = u16_to_ofp(ntohs(nar->in_port));
4434 resubmit->table_id = nar->table;
4435 return 0;
ba2fe8e9
BP
4436}
4437
2cd20955
JR
4438static enum ofperr
4439decode_NXAST_RAW_RESUBMIT_TABLE_CT(const struct nx_action_resubmit *nar,
4440 enum ofp_version ofp_version OVS_UNUSED,
4441 struct ofpbuf *out)
4442{
4443 enum ofperr error = decode_NXAST_RAW_RESUBMIT_TABLE(nar, ofp_version, out);
4444 if (error) {
4445 return error;
4446 }
4447 struct ofpact_resubmit *resubmit = out->header;
4448 resubmit->ofpact.raw = NXAST_RAW_RESUBMIT_TABLE_CT;
4449 resubmit->with_ct_orig = true;
4450 return 0;
4451}
4452
c2d936a4
BP
4453static void
4454encode_RESUBMIT(const struct ofpact_resubmit *resubmit,
4455 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
4cceacb9 4456{
c2d936a4 4457 uint16_t in_port = ofp_to_u16(resubmit->in_port);
4cceacb9 4458
c2d936a4 4459 if (resubmit->table_id == 0xff
2cd20955 4460 && resubmit->ofpact.raw == NXAST_RAW_RESUBMIT) {
c2d936a4
BP
4461 put_NXAST_RESUBMIT(out, in_port);
4462 } else {
2cd20955
JR
4463 struct nx_action_resubmit *nar;
4464 nar = resubmit->with_ct_orig
4465 ? put_NXAST_RESUBMIT_TABLE_CT(out) : put_NXAST_RESUBMIT_TABLE(out);
c2d936a4
BP
4466 nar->table = resubmit->table_id;
4467 nar->in_port = htons(in_port);
4468 }
4469}
6813ee7c 4470
cab50449 4471static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
4472parse_RESUBMIT(char *arg,
4473 const struct ofputil_port_map *port_map,
4474 struct ofpbuf *ofpacts,
c2d936a4
BP
4475 enum ofputil_protocol *usable_protocols OVS_UNUSED)
4476{
4477 struct ofpact_resubmit *resubmit;
2cd20955 4478 char *in_port_s, *table_s, *ct_s;
6813ee7c 4479
c2d936a4 4480 resubmit = ofpact_put_RESUBMIT(ofpacts);
8f2cded4 4481
c2d936a4
BP
4482 in_port_s = strsep(&arg, ",");
4483 if (in_port_s && in_port_s[0]) {
50f96b10
BP
4484 if (!ofputil_port_from_string(in_port_s, port_map,
4485 &resubmit->in_port)) {
c2d936a4 4486 return xasprintf("%s: resubmit to unknown port", in_port_s);
8f2cded4 4487 }
c2d936a4
BP
4488 } else {
4489 resubmit->in_port = OFPP_IN_PORT;
4490 }
4cceacb9 4491
c2d936a4
BP
4492 table_s = strsep(&arg, ",");
4493 if (table_s && table_s[0]) {
4494 uint32_t table_id = 0;
4495 char *error;
4496
4497 error = str_to_u32(table_s, &table_id);
4498 if (error) {
4499 return error;
4500 }
4501 resubmit->table_id = table_id;
4502 } else {
4503 resubmit->table_id = 255;
4cceacb9
JS
4504 }
4505
2cd20955
JR
4506 ct_s = strsep(&arg, ",");
4507 if (ct_s && ct_s[0]) {
4508 if (strcmp(ct_s, "ct")) {
4509 return xasprintf("%s: unknown parameter", ct_s);
4510 }
4511 resubmit->with_ct_orig = true;
4512 } else {
4513 resubmit->with_ct_orig = false;
4514 }
4515
c2d936a4
BP
4516 if (resubmit->in_port == OFPP_IN_PORT && resubmit->table_id == 255) {
4517 return xstrdup("at least one \"in_port\" or \"table\" must be "
4518 "specified on resubmit");
4519 }
4520 return NULL;
4521}
4522
4523static void
50f96b10
BP
4524format_RESUBMIT(const struct ofpact_resubmit *a,
4525 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4
BP
4526{
4527 if (a->in_port != OFPP_IN_PORT && a->table_id == 255) {
b1c5bf1f 4528 ds_put_format(s, "%sresubmit:%s", colors.special, colors.end);
50f96b10 4529 ofputil_format_port(a->in_port, port_map, s);
c2d936a4 4530 } else {
b1c5bf1f 4531 ds_put_format(s, "%sresubmit(%s", colors.paren, colors.end);
c2d936a4 4532 if (a->in_port != OFPP_IN_PORT) {
50f96b10 4533 ofputil_format_port(a->in_port, port_map, s);
c2d936a4
BP
4534 }
4535 ds_put_char(s, ',');
4536 if (a->table_id != 255) {
4537 ds_put_format(s, "%"PRIu8, a->table_id);
4538 }
2cd20955
JR
4539 if (a->with_ct_orig) {
4540 ds_put_cstr(s, ",ct");
4541 }
b1c5bf1f 4542 ds_put_format(s, "%s)%s", colors.paren, colors.end);
c2d936a4
BP
4543 }
4544}
4545\f
4c71600d 4546/* Action structure for NXAST_LEARN and NXAST_LEARN2.
c2d936a4
BP
4547 *
4548 * This action adds or modifies a flow in an OpenFlow table, similar to
4549 * OFPT_FLOW_MOD with OFPFC_MODIFY_STRICT as 'command'. The new flow has the
4550 * specified idle timeout, hard timeout, priority, cookie, and flags. The new
4551 * flow's match criteria and actions are built by applying each of the series
4552 * of flow_mod_spec elements included as part of the action.
4553 *
4554 * A flow_mod_spec starts with a 16-bit header. A header that is all-bits-0 is
4555 * a no-op used for padding the action as a whole to a multiple of 8 bytes in
4556 * length. Otherwise, the flow_mod_spec can be thought of as copying 'n_bits'
4557 * bits from a source to a destination. In this case, the header contains
4558 * multiple fields:
4559 *
4560 * 15 14 13 12 11 10 0
4561 * +------+---+------+---------------------------------+
4562 * | 0 |src| dst | n_bits |
4563 * +------+---+------+---------------------------------+
4564 *
4565 * The meaning and format of a flow_mod_spec depends on 'src' and 'dst'. The
4566 * following table summarizes the meaning of each possible combination.
4567 * Details follow the table:
4568 *
4569 * src dst meaning
4570 * --- --- ----------------------------------------------------------
4571 * 0 0 Add match criteria based on value in a field.
4572 * 1 0 Add match criteria based on an immediate value.
4573 * 0 1 Add NXAST_REG_LOAD action to copy field into a different field.
4574 * 1 1 Add NXAST_REG_LOAD action to load immediate value into a field.
4575 * 0 2 Add OFPAT_OUTPUT action to output to port from specified field.
4576 * All other combinations are undefined and not allowed.
4577 *
4578 * The flow_mod_spec header is followed by a source specification and a
4579 * destination specification. The format and meaning of the source
4580 * specification depends on 'src':
4581 *
4582 * - If 'src' is 0, the source bits are taken from a field in the flow to
4583 * which this action is attached. (This should be a wildcarded field. If
4584 * its value is fully specified then the source bits being copied have
4585 * constant values.)
4586 *
4587 * The source specification is an ovs_be32 'field' and an ovs_be16 'ofs'.
4588 * 'field' is an nxm_header with nxm_hasmask=0, and 'ofs' the starting bit
4589 * offset within that field. The source bits are field[ofs:ofs+n_bits-1].
4590 * 'field' and 'ofs' are subject to the same restrictions as the source
4591 * field in NXAST_REG_MOVE.
4592 *
4593 * - If 'src' is 1, the source bits are a constant value. The source
4594 * specification is (n_bits+15)/16*2 bytes long. Taking those bytes as a
4595 * number in network order, the source bits are the 'n_bits'
4596 * least-significant bits. The switch will report an error if other bits
4597 * in the constant are nonzero.
4598 *
4599 * The flow_mod_spec destination specification, for 'dst' of 0 or 1, is an
4600 * ovs_be32 'field' and an ovs_be16 'ofs'. 'field' is an nxm_header with
4601 * nxm_hasmask=0 and 'ofs' is a starting bit offset within that field. The
4602 * meaning of the flow_mod_spec depends on 'dst':
4603 *
4604 * - If 'dst' is 0, the flow_mod_spec specifies match criteria for the new
4605 * flow. The new flow matches only if bits field[ofs:ofs+n_bits-1] in a
4606 * packet equal the source bits. 'field' may be any nxm_header with
4607 * nxm_hasmask=0 that is allowed in NXT_FLOW_MOD.
4608 *
4609 * Order is significant. Earlier flow_mod_specs must satisfy any
4610 * prerequisites for matching fields specified later, by copying constant
4611 * values into prerequisite fields.
4612 *
4613 * The switch will reject flow_mod_specs that do not satisfy NXM masking
4614 * restrictions.
4615 *
4616 * - If 'dst' is 1, the flow_mod_spec specifies an NXAST_REG_LOAD action for
4617 * the new flow. The new flow copies the source bits into
4618 * field[ofs:ofs+n_bits-1]. Actions are executed in the same order as the
4619 * flow_mod_specs.
4620 *
4621 * A single NXAST_REG_LOAD action writes no more than 64 bits, so n_bits
4622 * greater than 64 yields multiple NXAST_REG_LOAD actions.
4623 *
4624 * The flow_mod_spec destination spec for 'dst' of 2 (when 'src' is 0) is
4625 * empty. It has the following meaning:
4626 *
4627 * - The flow_mod_spec specifies an OFPAT_OUTPUT action for the new flow.
4628 * The new flow outputs to the OpenFlow port specified by the source field.
4629 * Of the special output ports with value OFPP_MAX or larger, OFPP_IN_PORT,
4630 * OFPP_FLOOD, OFPP_LOCAL, and OFPP_ALL are supported. Other special ports
4631 * may not be used.
4632 *
4633 * Resource Management
4634 * -------------------
4635 *
4636 * A switch has a finite amount of flow table space available for learning.
4637 * When this space is exhausted, no new learning table entries will be learned
4638 * until some existing flow table entries expire. The controller should be
4639 * prepared to handle this by flooding (which can be implemented as a
4640 * low-priority flow).
4641 *
4642 * If a learned flow matches a single TCP stream with a relatively long
4643 * timeout, one may make the best of resource constraints by setting
4644 * 'fin_idle_timeout' or 'fin_hard_timeout' (both measured in seconds), or
4645 * both, to shorter timeouts. When either of these is specified as a nonzero
4646 * value, OVS adds a NXAST_FIN_TIMEOUT action, with the specified timeouts, to
4647 * the learned flow.
4648 *
4649 * Examples
4650 * --------
4651 *
4652 * The following examples give a prose description of the flow_mod_specs along
4653 * with informal notation for how those would be represented and a hex dump of
4654 * the bytes that would be required.
4655 *
4656 * These examples could work with various nx_action_learn parameters. Typical
4657 * values would be idle_timeout=OFP_FLOW_PERMANENT, hard_timeout=60,
4658 * priority=OFP_DEFAULT_PRIORITY, flags=0, table_id=10.
4659 *
4660 * 1. Learn input port based on the source MAC, with lookup into
4661 * NXM_NX_REG1[16:31] by resubmit to in_port=99:
4662 *
4663 * Match on in_port=99:
4664 * ovs_be16(src=1, dst=0, n_bits=16), 20 10
4665 * ovs_be16(99), 00 63
4666 * ovs_be32(NXM_OF_IN_PORT), ovs_be16(0) 00 00 00 02 00 00
4667 *
4668 * Match Ethernet destination on Ethernet source from packet:
4669 * ovs_be16(src=0, dst=0, n_bits=48), 00 30
4670 * ovs_be32(NXM_OF_ETH_SRC), ovs_be16(0) 00 00 04 06 00 00
4671 * ovs_be32(NXM_OF_ETH_DST), ovs_be16(0) 00 00 02 06 00 00
4672 *
4673 * Set NXM_NX_REG1[16:31] to the packet's input port:
4674 * ovs_be16(src=0, dst=1, n_bits=16), 08 10
4675 * ovs_be32(NXM_OF_IN_PORT), ovs_be16(0) 00 00 00 02 00 00
4676 * ovs_be32(NXM_NX_REG1), ovs_be16(16) 00 01 02 04 00 10
4677 *
4678 * Given a packet that arrived on port A with Ethernet source address B,
4679 * this would set up the flow "in_port=99, dl_dst=B,
4680 * actions=load:A->NXM_NX_REG1[16..31]".
4681 *
4682 * In syntax accepted by ovs-ofctl, this action is: learn(in_port=99,
4683 * NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],
4684 * load:NXM_OF_IN_PORT[]->NXM_NX_REG1[16..31])
4685 *
4686 * 2. Output to input port based on the source MAC and VLAN VID, with lookup
4687 * into NXM_NX_REG1[16:31]:
4688 *
4689 * Match on same VLAN ID as packet:
4690 * ovs_be16(src=0, dst=0, n_bits=12), 00 0c
4691 * ovs_be32(NXM_OF_VLAN_TCI), ovs_be16(0) 00 00 08 02 00 00
4692 * ovs_be32(NXM_OF_VLAN_TCI), ovs_be16(0) 00 00 08 02 00 00
4693 *
4694 * Match Ethernet destination on Ethernet source from packet:
4695 * ovs_be16(src=0, dst=0, n_bits=48), 00 30
4696 * ovs_be32(NXM_OF_ETH_SRC), ovs_be16(0) 00 00 04 06 00 00
4697 * ovs_be32(NXM_OF_ETH_DST), ovs_be16(0) 00 00 02 06 00 00
4698 *
4699 * Output to the packet's input port:
4700 * ovs_be16(src=0, dst=2, n_bits=16), 10 10
4701 * ovs_be32(NXM_OF_IN_PORT), ovs_be16(0) 00 00 00 02 00 00
4702 *
4703 * Given a packet that arrived on port A with Ethernet source address B in
4704 * VLAN C, this would set up the flow "dl_dst=B, vlan_vid=C,
4705 * actions=output:A".
4706 *
4707 * In syntax accepted by ovs-ofctl, this action is:
4708 * learn(NXM_OF_VLAN_TCI[0..11], NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],
4709 * output:NXM_OF_IN_PORT[])
4710 *
4711 * 3. Here's a recipe for a very simple-minded MAC learning switch. It uses a
4712 * 10-second MAC expiration time to make it easier to see what's going on
4713 *
4714 * ovs-vsctl del-controller br0
4715 * ovs-ofctl del-flows br0
4716 * ovs-ofctl add-flow br0 "table=0 actions=learn(table=1, \
4717 hard_timeout=10, NXM_OF_VLAN_TCI[0..11], \
4718 NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[], \
4719 output:NXM_OF_IN_PORT[]), resubmit(,1)"
4720 * ovs-ofctl add-flow br0 "table=1 priority=0 actions=flood"
4721 *
4722 * You can then dump the MAC learning table with:
4723 *
4724 * ovs-ofctl dump-flows br0 table=1
4725 *
4726 * Usage Advice
4727 * ------------
4728 *
4729 * For best performance, segregate learned flows into a table that is not used
4730 * for any other flows except possibly for a lowest-priority "catch-all" flow
4731 * (a flow with no match criteria). If different learning actions specify
4732 * different match criteria, use different tables for the learned flows.
4733 *
4734 * The meaning of 'hard_timeout' and 'idle_timeout' can be counterintuitive.
4735 * These timeouts apply to the flow that is added, which means that a flow with
4736 * an idle timeout will expire when no traffic has been sent *to* the learned
4737 * address. This is not usually the intent in MAC learning; instead, we want
4738 * the MAC learn entry to expire when no traffic has been sent *from* the
4739 * learned address. Use a hard timeout for that.
39c94593
JR
4740 *
4741 *
4742 * Visibility of Changes
4743 * ---------------------
4744 *
4745 * Prior to Open vSwitch 2.4, any changes made by a "learn" action in a given
4746 * flow translation are visible to flow table lookups made later in the flow
4747 * translation. This means that, in the example above, a MAC learned by the
4748 * learn action in table 0 would be found in table 1 (if the packet being
4749 * processed had the same source and destination MAC address).
4750 *
4751 * In Open vSwitch 2.4 and later, changes to a flow table (whether to add or
4752 * modify a flow) by a "learn" action are visible only for later flow
4753 * translations, not for later lookups within the same flow translation. In
4754 * the MAC learning example, a MAC learned by the learn action in table 0 would
4755 * not be found in table 1 if the flow translation would resubmit to table 1
4756 * after the processing of the learn action, meaning that if this MAC had not
4757 * been learned before then the packet would be flooded. */
c2d936a4
BP
4758struct nx_action_learn {
4759 ovs_be16 type; /* OFPAT_VENDOR. */
4760 ovs_be16 len; /* At least 24. */
4761 ovs_be32 vendor; /* NX_VENDOR_ID. */
4762 ovs_be16 subtype; /* NXAST_LEARN. */
4763 ovs_be16 idle_timeout; /* Idle time before discarding (seconds). */
4764 ovs_be16 hard_timeout; /* Max time before discarding (seconds). */
4765 ovs_be16 priority; /* Priority level of flow entry. */
4766 ovs_be64 cookie; /* Cookie for new flow. */
4767 ovs_be16 flags; /* NX_LEARN_F_*. */
4768 uint8_t table_id; /* Table to insert flow entry. */
4769 uint8_t pad; /* Must be zero. */
4770 ovs_be16 fin_idle_timeout; /* Idle timeout after FIN, if nonzero. */
4771 ovs_be16 fin_hard_timeout; /* Hard timeout after FIN, if nonzero. */
4772 /* Followed by a sequence of flow_mod_spec elements, as described above,
4773 * until the end of the action is reached. */
4774};
4775OFP_ASSERT(sizeof(struct nx_action_learn) == 32);
4776
4c71600d
DDP
4777struct nx_action_learn2 {
4778 struct nx_action_learn up; /* The wire format includes nx_action_learn. */
1746822c
JS
4779 ovs_be32 limit; /* Maximum number of learned flows.
4780 * 0 indicates unlimited. */
4c71600d
DDP
4781
4782 /* Where to store the result. */
4783 ovs_be16 result_dst_ofs; /* Starting bit offset in destination. */
4784
4785 ovs_be16 pad2; /* Must be zero. */
4786 /* Followed by:
4787 * - OXM/NXM header for destination field (4 or 8 bytes),
4788 * if NX_LEARN_F_WRITE_RESULT is set in 'flags'
4789 * - a sequence of flow_mod_spec elements, as described above,
4790 * until the end of the action is reached. */
4791};
4792OFP_ASSERT(sizeof(struct nx_action_learn2) == 40);
4793
c2d936a4
BP
4794static ovs_be16
4795get_be16(const void **pp)
4796{
4797 const ovs_be16 *p = *pp;
4798 ovs_be16 value = *p;
4799 *pp = p + 1;
4800 return value;
4801}
4802
4803static ovs_be32
4804get_be32(const void **pp)
4805{
4806 const ovs_be32 *p = *pp;
4807 ovs_be32 value = get_unaligned_be32(p);
4808 *pp = p + 1;
4809 return value;
4810}
4811
04f48a68
YHW
4812static enum ofperr
4813get_subfield(int n_bits, const void **p, struct mf_subfield *sf,
5c7c16d8 4814 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap)
c2d936a4 4815{
5c7c16d8
YHW
4816 enum ofperr error;
4817
4818 error = mf_vl_mff_mf_from_nxm_header(ntohl(get_be32(p)), vl_mff_map,
4819 &sf->field, tlv_bitmap);
c2d936a4
BP
4820 sf->ofs = ntohs(get_be16(p));
4821 sf->n_bits = n_bits;
5c7c16d8 4822 return error;
c2d936a4
BP
4823}
4824
4825static unsigned int
4826learn_min_len(uint16_t header)
4827{
4828 int n_bits = header & NX_LEARN_N_BITS_MASK;
4829 int src_type = header & NX_LEARN_SRC_MASK;
4830 int dst_type = header & NX_LEARN_DST_MASK;
4831 unsigned int min_len;
4832
4833 min_len = 0;
4834 if (src_type == NX_LEARN_SRC_FIELD) {
4835 min_len += sizeof(ovs_be32); /* src_field */
4836 min_len += sizeof(ovs_be16); /* src_ofs */
4837 } else {
4838 min_len += DIV_ROUND_UP(n_bits, 16);
4839 }
4840 if (dst_type == NX_LEARN_DST_MATCH ||
4841 dst_type == NX_LEARN_DST_LOAD) {
4842 min_len += sizeof(ovs_be32); /* dst_field */
4843 min_len += sizeof(ovs_be16); /* dst_ofs */
4844 }
4845 return min_len;
4846}
4847
c2d936a4 4848static enum ofperr
2ce5f311 4849decode_LEARN_common(const struct nx_action_learn *nal,
a9fedc78 4850 enum ofp_raw_action_type raw,
2ce5f311 4851 struct ofpact_learn *learn)
c2d936a4 4852{
c2d936a4
BP
4853 if (nal->pad) {
4854 return OFPERR_OFPBAC_BAD_ARGUMENT;
4855 }
4856
a9fedc78 4857 learn->ofpact.raw = raw;
c2d936a4
BP
4858 learn->idle_timeout = ntohs(nal->idle_timeout);
4859 learn->hard_timeout = ntohs(nal->hard_timeout);
4860 learn->priority = ntohs(nal->priority);
4861 learn->cookie = nal->cookie;
4862 learn->table_id = nal->table_id;
4863 learn->fin_idle_timeout = ntohs(nal->fin_idle_timeout);
4864 learn->fin_hard_timeout = ntohs(nal->fin_hard_timeout);
c2d936a4 4865 learn->flags = ntohs(nal->flags);
c2d936a4
BP
4866
4867 if (learn->table_id == 0xff) {
4868 return OFPERR_OFPBAC_BAD_ARGUMENT;
4869 }
4870
2ce5f311
DDP
4871 return 0;
4872}
4873
4874static enum ofperr
4875decode_LEARN_specs(const void *p, const void *end,
4876 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap,
4877 struct ofpbuf *ofpacts)
4878{
4879 struct ofpact_learn *learn = ofpacts->header;
4880
4881 while (p != end) {
c2d936a4
BP
4882 struct ofpact_learn_spec *spec;
4883 uint16_t header = ntohs(get_be16(&p));
4884
4885 if (!header) {
4886 break;
4887 }
4888
4889 spec = ofpbuf_put_zeros(ofpacts, sizeof *spec);
6fd6ed71 4890 learn = ofpacts->header;
c2d936a4
BP
4891
4892 spec->src_type = header & NX_LEARN_SRC_MASK;
4893 spec->dst_type = header & NX_LEARN_DST_MASK;
4894 spec->n_bits = header & NX_LEARN_N_BITS_MASK;
4895
4896 /* Check for valid src and dst type combination. */
4897 if (spec->dst_type == NX_LEARN_DST_MATCH ||
4898 spec->dst_type == NX_LEARN_DST_LOAD ||
4899 (spec->dst_type == NX_LEARN_DST_OUTPUT &&
4900 spec->src_type == NX_LEARN_SRC_FIELD)) {
4901 /* OK. */
4902 } else {
4903 return OFPERR_OFPBAC_BAD_ARGUMENT;
4904 }
4905
4906 /* Check that the arguments don't overrun the end of the action. */
4907 if ((char *) end - (char *) p < learn_min_len(header)) {
4908 return OFPERR_OFPBAC_BAD_LEN;
4909 }
4910
4911 /* Get the source. */
dfe191d5
JR
4912 const uint8_t *imm = NULL;
4913 unsigned int imm_bytes = 0;
04f48a68 4914 enum ofperr error;
c2d936a4 4915 if (spec->src_type == NX_LEARN_SRC_FIELD) {
5c7c16d8
YHW
4916 error = get_subfield(spec->n_bits, &p, &spec->src, vl_mff_map,
4917 tlv_bitmap);
04f48a68
YHW
4918 if (error) {
4919 return error;
4920 }
c2d936a4
BP
4921 } else {
4922 int p_bytes = 2 * DIV_ROUND_UP(spec->n_bits, 16);
c2d936a4 4923 p = (const uint8_t *) p + p_bytes;
dfe191d5
JR
4924
4925 imm_bytes = DIV_ROUND_UP(spec->n_bits, 8);
4926 imm = (const uint8_t *) p - imm_bytes;
c2d936a4
BP
4927 }
4928
4929 /* Get the destination. */
4930 if (spec->dst_type == NX_LEARN_DST_MATCH ||
4931 spec->dst_type == NX_LEARN_DST_LOAD) {
5c7c16d8
YHW
4932 error = get_subfield(spec->n_bits, &p, &spec->dst, vl_mff_map,
4933 tlv_bitmap);
04f48a68
YHW
4934 if (error) {
4935 return error;
4936 }
c2d936a4 4937 }
dfe191d5
JR
4938
4939 if (imm) {
4940 uint8_t *src_imm = ofpbuf_put_zeros(ofpacts,
4941 OFPACT_ALIGN(imm_bytes));
4942 memcpy(src_imm, imm, imm_bytes);
4943
4944 learn = ofpacts->header;
4945 }
c2d936a4 4946 }
ce058104 4947 ofpact_finish_LEARN(ofpacts, &learn);
c2d936a4
BP
4948
4949 if (!is_all_zeros(p, (char *) end - (char *) p)) {
4950 return OFPERR_OFPBAC_BAD_ARGUMENT;
4951 }
4952
4953 return 0;
4954}
4955
2ce5f311
DDP
4956/* Converts 'nal' into a "struct ofpact_learn" and appends that struct to
4957 * 'ofpacts'. Returns 0 if successful, otherwise an OFPERR_*. */
4958static enum ofperr
4959decode_NXAST_RAW_LEARN(const struct nx_action_learn *nal,
4960 enum ofp_version ofp_version OVS_UNUSED,
4961 const struct vl_mff_map *vl_mff_map,
4962 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
4963{
4964 struct ofpact_learn *learn;
4965 enum ofperr error;
4966
4967 learn = ofpact_put_LEARN(ofpacts);
4968
a9fedc78 4969 error = decode_LEARN_common(nal, NXAST_RAW_LEARN, learn);
2ce5f311
DDP
4970 if (error) {
4971 return error;
4972 }
4973
4974 if (learn->flags & ~(NX_LEARN_F_SEND_FLOW_REM |
4975 NX_LEARN_F_DELETE_LEARNED)) {
4976 return OFPERR_OFPBAC_BAD_ARGUMENT;
4977 }
4978
4979 return decode_LEARN_specs(nal + 1, (char *) nal + ntohs(nal->len),
4980 vl_mff_map, tlv_bitmap, ofpacts);
4981}
4982
4c71600d
DDP
4983/* Converts 'nal' into a "struct ofpact_learn" and appends that struct to
4984 * 'ofpacts'. Returns 0 if successful, otherwise an OFPERR_*. */
4985static enum ofperr
4986decode_NXAST_RAW_LEARN2(const struct nx_action_learn2 *nal,
4987 enum ofp_version ofp_version OVS_UNUSED,
4988 const struct vl_mff_map *vl_mff_map,
4989 uint64_t *tlv_bitmap, struct ofpbuf *ofpacts)
4990{
4991 struct ofpbuf b = ofpbuf_const_initializer(nal, ntohs(nal->up.len));
4992 struct ofpact_learn *learn;
4993 enum ofperr error;
4994
4995 if (nal->pad2) {
4996 return OFPERR_NXBAC_MUST_BE_ZERO;
4997 }
4998
4999 learn = ofpact_put_LEARN(ofpacts);
a9fedc78 5000 error = decode_LEARN_common(&nal->up, NXAST_RAW_LEARN2, learn);
4c71600d
DDP
5001 if (error) {
5002 return error;
5003 }
5004
5005 learn->limit = ntohl(nal->limit);
5006
5007 if (learn->flags & ~(NX_LEARN_F_SEND_FLOW_REM |
5008 NX_LEARN_F_DELETE_LEARNED |
5009 NX_LEARN_F_WRITE_RESULT)) {
5010 return OFPERR_OFPBAC_BAD_ARGUMENT;
5011 }
5012
5013 ofpbuf_pull(&b, sizeof *nal);
5014
5015 if (learn->flags & NX_LEARN_F_WRITE_RESULT) {
5016 error = nx_pull_header(&b, vl_mff_map, &learn->result_dst.field, NULL);
5017 if (error) {
5018 return error;
5019 }
5020 if (!learn->result_dst.field->writable) {
5021 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
5022 }
5023 learn->result_dst.ofs = ntohs(nal->result_dst_ofs);
5024 learn->result_dst.n_bits = 1;
5025 } else if (nal->result_dst_ofs) {
5026 return OFPERR_OFPBAC_BAD_ARGUMENT;
5027 }
5028
5029 return decode_LEARN_specs(b.data, (char *) nal + ntohs(nal->up.len),
5030 vl_mff_map, tlv_bitmap, ofpacts);
5031}
5032
c2d936a4
BP
5033static void
5034put_be16(struct ofpbuf *b, ovs_be16 x)
5035{
5036 ofpbuf_put(b, &x, sizeof x);
5037}
5038
5039static void
5040put_be32(struct ofpbuf *b, ovs_be32 x)
5041{
5042 ofpbuf_put(b, &x, sizeof x);
5043}
5044
5045static void
5046put_u16(struct ofpbuf *b, uint16_t x)
5047{
5048 put_be16(b, htons(x));
5049}
5050
5051static void
5052put_u32(struct ofpbuf *b, uint32_t x)
5053{
5054 put_be32(b, htonl(x));
5055}
5056
5057static void
5058encode_LEARN(const struct ofpact_learn *learn,
5059 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5060{
5061 const struct ofpact_learn_spec *spec;
5062 struct nx_action_learn *nal;
5063 size_t start_ofs;
5064
6fd6ed71 5065 start_ofs = out->size;
4c71600d
DDP
5066
5067 if (learn->ofpact.raw == NXAST_RAW_LEARN2
5068 || learn->limit != 0
5069 || learn->flags & NX_LEARN_F_WRITE_RESULT) {
5070 struct nx_action_learn2 *nal2;
5071
5072 nal2 = put_NXAST_LEARN2(out);
5073 nal2->limit = htonl(learn->limit);
5074 nal2->result_dst_ofs = htons(learn->result_dst.ofs);
5075 nal = &nal2->up;
5076 } else {
5077 nal = put_NXAST_LEARN(out);
5078 }
c2d936a4
BP
5079 nal->idle_timeout = htons(learn->idle_timeout);
5080 nal->hard_timeout = htons(learn->hard_timeout);
5081 nal->fin_idle_timeout = htons(learn->fin_idle_timeout);
5082 nal->fin_hard_timeout = htons(learn->fin_hard_timeout);
5083 nal->priority = htons(learn->priority);
5084 nal->cookie = learn->cookie;
5085 nal->flags = htons(learn->flags);
5086 nal->table_id = learn->table_id;
5087
4c71600d
DDP
5088 if (learn->flags & NX_LEARN_F_WRITE_RESULT) {
5089 nx_put_header(out, learn->result_dst.field->id, 0, false);
5090 }
5091
c65a31e2 5092 OFPACT_LEARN_SPEC_FOR_EACH (spec, learn) {
c2d936a4
BP
5093 put_u16(out, spec->n_bits | spec->dst_type | spec->src_type);
5094
5095 if (spec->src_type == NX_LEARN_SRC_FIELD) {
04f48a68 5096 put_u32(out, nxm_header_from_mff(spec->src.field));
c2d936a4
BP
5097 put_u16(out, spec->src.ofs);
5098 } else {
5099 size_t n_dst_bytes = 2 * DIV_ROUND_UP(spec->n_bits, 16);
5100 uint8_t *bits = ofpbuf_put_zeros(out, n_dst_bytes);
507a9a16 5101 unsigned int n_bytes = DIV_ROUND_UP(spec->n_bits, 8);
dfe191d5 5102
507a9a16
JR
5103 memcpy(bits + n_dst_bytes - n_bytes, ofpact_learn_spec_imm(spec),
5104 n_bytes);
c2d936a4
BP
5105 }
5106
5107 if (spec->dst_type == NX_LEARN_DST_MATCH ||
5108 spec->dst_type == NX_LEARN_DST_LOAD) {
04f48a68 5109 put_u32(out, nxm_header_from_mff(spec->dst.field));
c2d936a4
BP
5110 put_u16(out, spec->dst.ofs);
5111 }
5112 }
5113
178742f9 5114 pad_ofpat(out, start_ofs);
c2d936a4
BP
5115}
5116
cab50449 5117static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5118parse_LEARN(char *arg, const struct ofputil_port_map *port_map,
5119 struct ofpbuf *ofpacts,
c2d936a4
BP
5120 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5121{
50f96b10 5122 return learn_parse(arg, port_map, ofpacts);
c2d936a4
BP
5123}
5124
5125static void
50f96b10
BP
5126format_LEARN(const struct ofpact_learn *a,
5127 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4 5128{
50f96b10 5129 learn_format(a, port_map, s);
c2d936a4
BP
5130}
5131\f
18080541
BP
5132/* Action structure for NXAST_CONJUNCTION. */
5133struct nx_action_conjunction {
5134 ovs_be16 type; /* OFPAT_VENDOR. */
5135 ovs_be16 len; /* At least 16. */
5136 ovs_be32 vendor; /* NX_VENDOR_ID. */
5137 ovs_be16 subtype; /* See enum ofp_raw_action_type. */
5138 uint8_t clause;
5139 uint8_t n_clauses;
5140 ovs_be32 id;
5141};
5142OFP_ASSERT(sizeof(struct nx_action_conjunction) == 16);
5143
5144static void
5145add_conjunction(struct ofpbuf *out,
5146 uint32_t id, uint8_t clause, uint8_t n_clauses)
5147{
5148 struct ofpact_conjunction *oc;
5149
5150 oc = ofpact_put_CONJUNCTION(out);
5151 oc->id = id;
5152 oc->clause = clause;
5153 oc->n_clauses = n_clauses;
5154}
5155
5156static enum ofperr
5157decode_NXAST_RAW_CONJUNCTION(const struct nx_action_conjunction *nac,
f3cd3ac7 5158 enum ofp_version ofp_version OVS_UNUSED,
18080541
BP
5159 struct ofpbuf *out)
5160{
5161 if (nac->n_clauses < 2 || nac->n_clauses > 64
5162 || nac->clause >= nac->n_clauses) {
5163 return OFPERR_NXBAC_BAD_CONJUNCTION;
5164 } else {
5165 add_conjunction(out, ntohl(nac->id), nac->clause, nac->n_clauses);
5166 return 0;
5167 }
5168}
5169
5170static void
5171encode_CONJUNCTION(const struct ofpact_conjunction *oc,
5172 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5173{
5174 struct nx_action_conjunction *nac = put_NXAST_CONJUNCTION(out);
5175 nac->clause = oc->clause;
5176 nac->n_clauses = oc->n_clauses;
5177 nac->id = htonl(oc->id);
5178}
5179
5180static void
50f96b10
BP
5181format_CONJUNCTION(const struct ofpact_conjunction *oc,
5182 const struct ofputil_port_map *port_map OVS_UNUSED,
5183 struct ds *s)
18080541 5184{
fd13c6b5 5185 ds_put_format(s, "%sconjunction(%s%"PRIu32",%d/%"PRIu8"%s)%s",
b1c5bf1f
QM
5186 colors.paren, colors.end,
5187 oc->id, oc->clause + 1, oc->n_clauses,
5188 colors.paren, colors.end);
18080541
BP
5189}
5190
5191static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5192parse_CONJUNCTION(const char *arg,
5193 const struct ofputil_port_map *port_map OVS_UNUSED,
5194 struct ofpbuf *ofpacts,
18080541
BP
5195 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5196{
5197 uint8_t n_clauses;
5198 uint8_t clause;
5199 uint32_t id;
5200 int n;
5201
5202 if (!ovs_scan(arg, "%"SCNi32" , %"SCNu8" / %"SCNu8" %n",
5203 &id, &clause, &n_clauses, &n) || n != strlen(arg)) {
5204 return xstrdup("\"conjunction\" syntax is \"conjunction(id,i/n)\"");
5205 }
5206
5207 if (n_clauses < 2) {
5208 return xstrdup("conjunction must have at least 2 clauses");
5209 } else if (n_clauses > 64) {
5210 return xstrdup("conjunction must have at most 64 clauses");
5211 } else if (clause < 1) {
5212 return xstrdup("clause index must be positive");
5213 } else if (clause > n_clauses) {
5214 return xstrdup("clause index must be less than or equal to "
5215 "number of clauses");
5216 }
5217
5218 add_conjunction(ofpacts, id, clause - 1, n_clauses);
5219 return NULL;
5220}
5221\f
c2d936a4
BP
5222/* Action structure for NXAST_MULTIPATH.
5223 *
5224 * This action performs the following steps in sequence:
5225 *
5226 * 1. Hashes the fields designated by 'fields', one of NX_HASH_FIELDS_*.
5227 * Refer to the definition of "enum nx_mp_fields" for details.
5228 *
5229 * The 'basis' value is used as a universal hash parameter, that is,
5230 * different values of 'basis' yield different hash functions. The
5231 * particular universal hash function used is implementation-defined.
5232 *
5233 * The hashed fields' values are drawn from the current state of the
5234 * flow, including all modifications that have been made by actions up to
5235 * this point.
5236 *
5237 * 2. Applies the multipath link choice algorithm specified by 'algorithm',
5238 * one of NX_MP_ALG_*. Refer to the definition of "enum nx_mp_algorithm"
5239 * for details.
5240 *
5241 * The output of the algorithm is 'link', an unsigned integer less than
5242 * or equal to 'max_link'.
5243 *
5244 * Some algorithms use 'arg' as an additional argument.
5245 *
5246 * 3. Stores 'link' in dst[ofs:ofs+n_bits]. The format and semantics of
5247 * 'dst' and 'ofs_nbits' are similar to those for the NXAST_REG_LOAD
5248 * action.
5249 *
5250 * The switch will reject actions that have an unknown 'fields', or an unknown
5251 * 'algorithm', or in which ofs+n_bits is greater than the width of 'dst', or
5252 * in which 'max_link' is greater than or equal to 2**n_bits, with error type
5253 * OFPET_BAD_ACTION, code OFPBAC_BAD_ARGUMENT.
5254 */
5255struct nx_action_multipath {
5256 ovs_be16 type; /* OFPAT_VENDOR. */
5257 ovs_be16 len; /* Length is 32. */
5258 ovs_be32 vendor; /* NX_VENDOR_ID. */
5259 ovs_be16 subtype; /* NXAST_MULTIPATH. */
5260
5261 /* What fields to hash and how. */
5262 ovs_be16 fields; /* One of NX_HASH_FIELDS_*. */
5263 ovs_be16 basis; /* Universal hash parameter. */
5264 ovs_be16 pad0;
5265
5266 /* Multipath link choice algorithm to apply to hash value. */
5267 ovs_be16 algorithm; /* One of NX_MP_ALG_*. */
5268 ovs_be16 max_link; /* Number of output links, minus 1. */
5269 ovs_be32 arg; /* Algorithm-specific argument. */
5270 ovs_be16 pad1;
5271
5272 /* Where to store the result. */
5273 ovs_be16 ofs_nbits; /* (ofs << 6) | (n_bits - 1). */
5274 ovs_be32 dst; /* Destination. */
5275};
5276OFP_ASSERT(sizeof(struct nx_action_multipath) == 32);
5277
5278static enum ofperr
5279decode_NXAST_RAW_MULTIPATH(const struct nx_action_multipath *nam,
f3cd3ac7 5280 enum ofp_version ofp_version OVS_UNUSED,
04f48a68 5281 const struct vl_mff_map *vl_mff_map,
5c7c16d8 5282 uint64_t *tlv_bitmap, struct ofpbuf *out)
c2d936a4
BP
5283{
5284 uint32_t n_links = ntohs(nam->max_link) + 1;
5285 size_t min_n_bits = log_2_ceil(n_links);
5286 struct ofpact_multipath *mp;
5c7c16d8 5287 enum ofperr error;
c2d936a4
BP
5288
5289 mp = ofpact_put_MULTIPATH(out);
5290 mp->fields = ntohs(nam->fields);
5291 mp->basis = ntohs(nam->basis);
5292 mp->algorithm = ntohs(nam->algorithm);
5293 mp->max_link = ntohs(nam->max_link);
5294 mp->arg = ntohl(nam->arg);
c2d936a4
BP
5295 mp->dst.ofs = nxm_decode_ofs(nam->ofs_nbits);
5296 mp->dst.n_bits = nxm_decode_n_bits(nam->ofs_nbits);
5c7c16d8
YHW
5297 error = mf_vl_mff_mf_from_nxm_header(ntohl(nam->dst), vl_mff_map,
5298 &mp->dst.field, tlv_bitmap);
5299 if (error) {
5300 return error;
04f48a68
YHW
5301 }
5302
c2d936a4
BP
5303 if (!flow_hash_fields_valid(mp->fields)) {
5304 VLOG_WARN_RL(&rl, "unsupported fields %d", (int) mp->fields);
5305 return OFPERR_OFPBAC_BAD_ARGUMENT;
5306 } else if (mp->algorithm != NX_MP_ALG_MODULO_N
5307 && mp->algorithm != NX_MP_ALG_HASH_THRESHOLD
5308 && mp->algorithm != NX_MP_ALG_HRW
5309 && mp->algorithm != NX_MP_ALG_ITER_HASH) {
5310 VLOG_WARN_RL(&rl, "unsupported algorithm %d", (int) mp->algorithm);
5311 return OFPERR_OFPBAC_BAD_ARGUMENT;
5312 } else if (mp->dst.n_bits < min_n_bits) {
5313 VLOG_WARN_RL(&rl, "multipath action requires at least %"PRIuSIZE" bits for "
5314 "%"PRIu32" links", min_n_bits, n_links);
5315 return OFPERR_OFPBAC_BAD_ARGUMENT;
5316 }
5317
5318 return multipath_check(mp, NULL);
5319}
5320
5321static void
5322encode_MULTIPATH(const struct ofpact_multipath *mp,
5323 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5324{
5325 struct nx_action_multipath *nam = put_NXAST_MULTIPATH(out);
5326
5327 nam->fields = htons(mp->fields);
5328 nam->basis = htons(mp->basis);
5329 nam->algorithm = htons(mp->algorithm);
5330 nam->max_link = htons(mp->max_link);
5331 nam->arg = htonl(mp->arg);
5332 nam->ofs_nbits = nxm_encode_ofs_nbits(mp->dst.ofs, mp->dst.n_bits);
04f48a68 5333 nam->dst = htonl(nxm_header_from_mff(mp->dst.field));
c2d936a4
BP
5334}
5335
cab50449 5336static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5337parse_MULTIPATH(const char *arg,
5338 const struct ofputil_port_map *port_map OVS_UNUSED,
5339 struct ofpbuf *ofpacts,
c2d936a4
BP
5340 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5341{
5342 return multipath_parse(ofpact_put_MULTIPATH(ofpacts), arg);
5343}
5344
5345static void
50f96b10
BP
5346format_MULTIPATH(const struct ofpact_multipath *a,
5347 const struct ofputil_port_map *port_map OVS_UNUSED,
5348 struct ds *s)
c2d936a4
BP
5349{
5350 multipath_format(a, s);
5351}
5352\f
5353/* Action structure for NXAST_NOTE.
5354 *
5355 * This action has no effect. It is variable length. The switch does not
5356 * attempt to interpret the user-defined 'note' data in any way. A controller
5357 * can use this action to attach arbitrary metadata to a flow.
5358 *
5359 * This action might go away in the future.
5360 */
5361struct nx_action_note {
5362 ovs_be16 type; /* OFPAT_VENDOR. */
5363 ovs_be16 len; /* A multiple of 8, but at least 16. */
5364 ovs_be32 vendor; /* NX_VENDOR_ID. */
5365 ovs_be16 subtype; /* NXAST_NOTE. */
5366 uint8_t note[6]; /* Start of user-defined data. */
5367 /* Possibly followed by additional user-defined data. */
5368};
5369OFP_ASSERT(sizeof(struct nx_action_note) == 16);
5370
5371static enum ofperr
f3cd3ac7
JS
5372decode_NXAST_RAW_NOTE(const struct nx_action_note *nan,
5373 enum ofp_version ofp_version OVS_UNUSED,
5374 struct ofpbuf *out)
c2d936a4
BP
5375{
5376 struct ofpact_note *note;
5377 unsigned int length;
5378
5379 length = ntohs(nan->len) - offsetof(struct nx_action_note, note);
2bd318de 5380 note = ofpact_put_NOTE(out);
c2d936a4 5381 note->length = length;
2bd318de 5382 ofpbuf_put(out, nan->note, length);
ace39a6f 5383 note = out->header;
ce058104 5384 ofpact_finish_NOTE(out, &note);
c2d936a4
BP
5385
5386 return 0;
5387}
5388
5389static void
5390encode_NOTE(const struct ofpact_note *note,
5391 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5392{
6fd6ed71 5393 size_t start_ofs = out->size;
c2d936a4 5394 struct nx_action_note *nan;
c2d936a4
BP
5395
5396 put_NXAST_NOTE(out);
6fd6ed71 5397 out->size = out->size - sizeof nan->note;
c2d936a4
BP
5398
5399 ofpbuf_put(out, note->data, note->length);
9ac0aada 5400 pad_ofpat(out, start_ofs);
c2d936a4
BP
5401}
5402
cab50449 5403static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5404parse_NOTE(const char *arg,
5405 const struct ofputil_port_map *port_map OVS_UNUSED,
5406 struct ofpbuf *ofpacts,
c2d936a4
BP
5407 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5408{
27aa8793
BP
5409 size_t start_ofs = ofpacts->size;
5410 ofpact_put_NOTE(ofpacts);
5411 arg = ofpbuf_put_hex(ofpacts, arg, NULL);
5412 if (arg[0]) {
5413 return xstrdup("bad hex digit in `note' argument");
5414 }
5415 struct ofpact_note *note = ofpbuf_at_assert(ofpacts, start_ofs,
5416 sizeof *note);
5417 note->length = ofpacts->size - (start_ofs + sizeof *note);
ce058104 5418 ofpact_finish_NOTE(ofpacts, &note);
c2d936a4
BP
5419 return NULL;
5420}
5421
5422static void
50f96b10
BP
5423format_NOTE(const struct ofpact_note *a,
5424 const struct ofputil_port_map *port_map OVS_UNUSED, struct ds *s)
c2d936a4 5425{
b1c5bf1f 5426 ds_put_format(s, "%snote:%s", colors.param, colors.end);
bdcad671 5427 format_hex_arg(s, a->data, a->length);
c2d936a4
BP
5428}
5429\f
5430/* Exit action. */
5431
5432static enum ofperr
5433decode_NXAST_RAW_EXIT(struct ofpbuf *out)
5434{
5435 ofpact_put_EXIT(out);
5436 return 0;
5437}
5438
5439static void
5440encode_EXIT(const struct ofpact_null *null OVS_UNUSED,
5441 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5442{
5443 put_NXAST_EXIT(out);
5444}
5445
cab50449 5446static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5447parse_EXIT(char *arg OVS_UNUSED,
5448 const struct ofputil_port_map *port_map OVS_UNUSED,
5449 struct ofpbuf *ofpacts,
c2d936a4
BP
5450 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5451{
5452 ofpact_put_EXIT(ofpacts);
5453 return NULL;
5454}
5455
5456static void
50f96b10
BP
5457format_EXIT(const struct ofpact_null *a OVS_UNUSED,
5458 const struct ofputil_port_map *port_map OVS_UNUSED, struct ds *s)
c2d936a4 5459{
b1c5bf1f 5460 ds_put_format(s, "%sexit%s", colors.special, colors.end);
c2d936a4
BP
5461}
5462\f
e672ff9b
JR
5463/* Unroll xlate action. */
5464
5465static void
5466encode_UNROLL_XLATE(const struct ofpact_unroll_xlate *unroll OVS_UNUSED,
5467 enum ofp_version ofp_version OVS_UNUSED,
5468 struct ofpbuf *out OVS_UNUSED)
5469{
5470 OVS_NOT_REACHED();
5471}
5472
5473static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5474parse_UNROLL_XLATE(char *arg OVS_UNUSED,
5475 const struct ofputil_port_map *port_map OVS_UNUSED,
5476 struct ofpbuf *ofpacts OVS_UNUSED,
e672ff9b
JR
5477 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5478{
5479 OVS_NOT_REACHED();
5480 return NULL;
5481}
5482
5483static void
50f96b10
BP
5484format_UNROLL_XLATE(const struct ofpact_unroll_xlate *a,
5485 const struct ofputil_port_map *port_map OVS_UNUSED,
5486 struct ds *s)
e672ff9b 5487{
b1c5bf1f
QM
5488 ds_put_format(s, "%sunroll_xlate(%s%stable=%s%"PRIu8
5489 ", %scookie=%s%"PRIu64"%s)%s",
5490 colors.paren, colors.end,
5491 colors.special, colors.end, a->rule_table_id,
5492 colors.param, colors.end, ntohll(a->rule_cookie),
5493 colors.paren, colors.end);
e672ff9b
JR
5494}
5495\f
7ae62a67
WT
5496/* The NXAST_CLONE action is "struct ext_action_header", followed by zero or
5497 * more embedded OpenFlow actions. */
5498
5499static enum ofperr
5500decode_NXAST_RAW_CLONE(const struct ext_action_header *eah,
04f48a68
YHW
5501 enum ofp_version ofp_version,
5502 const struct vl_mff_map *vl_mff_map,
5c7c16d8 5503 uint64_t *tlv_bitmap, struct ofpbuf *out)
7ae62a67
WT
5504{
5505 int error;
5506 struct ofpbuf openflow;
5507 const size_t clone_offset = ofpacts_pull(out);
5508 struct ofpact_nest *clone = ofpact_put_CLONE(out);
5509
5510 /* decode action list */
5511 ofpbuf_pull(out, sizeof(*clone));
5512 openflow = ofpbuf_const_initializer(
5513 eah + 1, ntohs(eah->len) - sizeof *eah);
5514 error = ofpacts_pull_openflow_actions__(&openflow, openflow.size,
5515 ofp_version,
5516 1u << OVSINST_OFPIT11_APPLY_ACTIONS,
5c7c16d8 5517 out, 0, vl_mff_map, tlv_bitmap);
7ae62a67
WT
5518 clone = ofpbuf_push_uninit(out, sizeof *clone);
5519 out->header = &clone->ofpact;
5520 ofpact_finish_CLONE(out, &clone);
5521 ofpbuf_push_uninit(out, clone_offset);
5522 return error;
5523}
5524
5525static void
5526encode_CLONE(const struct ofpact_nest *clone,
5527 enum ofp_version ofp_version, struct ofpbuf *out)
5528{
5529 size_t len;
5530 const size_t ofs = out->size;
5531 struct ext_action_header *eah;
5532
5533 eah = put_NXAST_CLONE(out);
5534 len = ofpacts_put_openflow_actions(clone->actions,
5535 ofpact_nest_get_action_len(clone),
5536 out, ofp_version);
5537 len += sizeof *eah;
5538 eah = ofpbuf_at(out, ofs, sizeof *eah);
5539 eah->len = htons(len);
5540}
5541
5542static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5543parse_CLONE(char *arg, const struct ofputil_port_map *port_map,
5544 struct ofpbuf *ofpacts,
5545 enum ofputil_protocol *usable_protocols)
7ae62a67
WT
5546{
5547 const size_t clone_offset = ofpacts_pull(ofpacts);
5548 struct ofpact_nest *clone = ofpact_put_CLONE(ofpacts);
5549 char *error;
5550
5551 ofpbuf_pull(ofpacts, sizeof *clone);
50f96b10
BP
5552 error = ofpacts_parse_copy(arg, port_map, ofpacts,
5553 usable_protocols, false, 0);
7ae62a67
WT
5554 /* header points to the action list */
5555 ofpacts->header = ofpbuf_push_uninit(ofpacts, sizeof *clone);
5556 clone = ofpacts->header;
5557
5558 ofpact_finish_CLONE(ofpacts, &clone);
5559 ofpbuf_push_uninit(ofpacts, clone_offset);
5560 return error;
5561}
5562
5563static void
50f96b10
BP
5564format_CLONE(const struct ofpact_nest *a,
5565 const struct ofputil_port_map *port_map, struct ds *s)
7ae62a67
WT
5566{
5567 ds_put_format(s, "%sclone(%s", colors.paren, colors.end);
50f96b10 5568 ofpacts_format(a->actions, ofpact_nest_get_action_len(a), port_map, s);
7ae62a67
WT
5569 ds_put_format(s, "%s)%s", colors.paren, colors.end);
5570}
5571\f
c2d936a4
BP
5572/* Action structure for NXAST_SAMPLE.
5573 *
5574 * Samples matching packets with the given probability and sends them
5575 * each to the set of collectors identified with the given ID. The
5576 * probability is expressed as a number of packets to be sampled out
5577 * of USHRT_MAX packets, and must be >0.
5578 *
5579 * When sending packet samples to IPFIX collectors, the IPFIX flow
5580 * record sent for each sampled packet is associated with the given
5581 * observation domain ID and observation point ID. Each IPFIX flow
5582 * record contain the sampled packet's headers when executing this
5583 * rule. If a sampled packet's headers are modified by previous
5584 * actions in the flow, those modified headers are sent. */
5585struct nx_action_sample {
5586 ovs_be16 type; /* OFPAT_VENDOR. */
5587 ovs_be16 len; /* Length is 24. */
5588 ovs_be32 vendor; /* NX_VENDOR_ID. */
5589 ovs_be16 subtype; /* NXAST_SAMPLE. */
5590 ovs_be16 probability; /* Fraction of packets to sample. */
5591 ovs_be32 collector_set_id; /* ID of collector set in OVSDB. */
5592 ovs_be32 obs_domain_id; /* ID of sampling observation domain. */
5593 ovs_be32 obs_point_id; /* ID of sampling observation point. */
5594};
5595OFP_ASSERT(sizeof(struct nx_action_sample) == 24);
5596
4930ea56 5597/* Action structure for NXAST_SAMPLE2 and NXAST_SAMPLE3.
f69f713b 5598 *
4930ea56
BP
5599 * NXAST_SAMPLE2 was added in Open vSwitch 2.5.90. Compared to NXAST_SAMPLE,
5600 * it adds support for exporting egress tunnel information.
5601 *
5602 * NXAST_SAMPLE3 was added in Open vSwitch 2.6.90. Compared to NXAST_SAMPLE2,
5603 * it adds support for the 'direction' field. */
f69f713b
BY
5604struct nx_action_sample2 {
5605 ovs_be16 type; /* OFPAT_VENDOR. */
5606 ovs_be16 len; /* Length is 32. */
5607 ovs_be32 vendor; /* NX_VENDOR_ID. */
5608 ovs_be16 subtype; /* NXAST_SAMPLE. */
5609 ovs_be16 probability; /* Fraction of packets to sample. */
5610 ovs_be32 collector_set_id; /* ID of collector set in OVSDB. */
5611 ovs_be32 obs_domain_id; /* ID of sampling observation domain. */
5612 ovs_be32 obs_point_id; /* ID of sampling observation point. */
5613 ovs_be16 sampling_port; /* Sampling port. */
4930ea56
BP
5614 uint8_t direction; /* NXAST_SAMPLE3 only. */
5615 uint8_t zeros[5]; /* Pad to a multiple of 8 bytes */
f69f713b
BY
5616 };
5617 OFP_ASSERT(sizeof(struct nx_action_sample2) == 32);
5618
c2d936a4 5619static enum ofperr
f3cd3ac7
JS
5620decode_NXAST_RAW_SAMPLE(const struct nx_action_sample *nas,
5621 enum ofp_version ofp_version OVS_UNUSED,
5622 struct ofpbuf *out)
c2d936a4
BP
5623{
5624 struct ofpact_sample *sample;
5625
5626 sample = ofpact_put_SAMPLE(out);
f69f713b
BY
5627 sample->ofpact.raw = NXAST_RAW_SAMPLE;
5628 sample->probability = ntohs(nas->probability);
5629 sample->collector_set_id = ntohl(nas->collector_set_id);
5630 sample->obs_domain_id = ntohl(nas->obs_domain_id);
5631 sample->obs_point_id = ntohl(nas->obs_point_id);
f69f713b 5632 sample->sampling_port = OFPP_NONE;
4930ea56 5633 sample->direction = NX_ACTION_SAMPLE_DEFAULT;
f69f713b
BY
5634
5635 if (sample->probability == 0) {
5636 return OFPERR_OFPBAC_BAD_ARGUMENT;
5637 }
5638
5639 return 0;
5640}
5641
5642static enum ofperr
4930ea56
BP
5643decode_SAMPLE2(const struct nx_action_sample2 *nas,
5644 enum ofp_raw_action_type raw,
5645 enum nx_action_sample_direction direction,
5646 struct ofpact_sample *sample)
f69f713b 5647{
4930ea56 5648 sample->ofpact.raw = raw;
c2d936a4
BP
5649 sample->probability = ntohs(nas->probability);
5650 sample->collector_set_id = ntohl(nas->collector_set_id);
5651 sample->obs_domain_id = ntohl(nas->obs_domain_id);
5652 sample->obs_point_id = ntohl(nas->obs_point_id);
f69f713b 5653 sample->sampling_port = u16_to_ofp(ntohs(nas->sampling_port));
4930ea56 5654 sample->direction = direction;
c2d936a4
BP
5655
5656 if (sample->probability == 0) {
5657 return OFPERR_OFPBAC_BAD_ARGUMENT;
5658 }
5659
5660 return 0;
5661}
5662
4930ea56
BP
5663static enum ofperr
5664decode_NXAST_RAW_SAMPLE2(const struct nx_action_sample2 *nas,
5665 enum ofp_version ofp_version OVS_UNUSED,
5666 struct ofpbuf *out)
5667{
5668 return decode_SAMPLE2(nas, NXAST_RAW_SAMPLE2, NX_ACTION_SAMPLE_DEFAULT,
5669 ofpact_put_SAMPLE(out));
5670}
5671
5672static enum ofperr
5673decode_NXAST_RAW_SAMPLE3(const struct nx_action_sample2 *nas,
5674 enum ofp_version ofp_version OVS_UNUSED,
5675 struct ofpbuf *out)
5676{
5677 struct ofpact_sample *sample = ofpact_put_SAMPLE(out);
5678 if (!is_all_zeros(nas->zeros, sizeof nas->zeros)) {
5679 return OFPERR_NXBRC_MUST_BE_ZERO;
5680 }
5681 if (nas->direction != NX_ACTION_SAMPLE_DEFAULT &&
5682 nas->direction != NX_ACTION_SAMPLE_INGRESS &&
5683 nas->direction != NX_ACTION_SAMPLE_EGRESS) {
5684 VLOG_WARN_RL(&rl, "invalid sample direction %"PRIu8, nas->direction);
5685 return OFPERR_OFPBAC_BAD_ARGUMENT;
5686 }
5687 return decode_SAMPLE2(nas, NXAST_RAW_SAMPLE3, nas->direction, sample);
5688}
5689
5690static void
5691encode_SAMPLE2(const struct ofpact_sample *sample,
5692 struct nx_action_sample2 *nas)
5693{
5694 nas->probability = htons(sample->probability);
5695 nas->collector_set_id = htonl(sample->collector_set_id);
5696 nas->obs_domain_id = htonl(sample->obs_domain_id);
5697 nas->obs_point_id = htonl(sample->obs_point_id);
5698 nas->sampling_port = htons(ofp_to_u16(sample->sampling_port));
5699 nas->direction = sample->direction;
5700}
5701
c2d936a4
BP
5702static void
5703encode_SAMPLE(const struct ofpact_sample *sample,
5704 enum ofp_version ofp_version OVS_UNUSED, struct ofpbuf *out)
5705{
4930ea56
BP
5706 if (sample->ofpact.raw == NXAST_RAW_SAMPLE3
5707 || sample->direction != NX_ACTION_SAMPLE_DEFAULT) {
5708 encode_SAMPLE2(sample, put_NXAST_SAMPLE3(out));
5709 } else if (sample->ofpact.raw == NXAST_RAW_SAMPLE2
5710 || sample->sampling_port != OFPP_NONE) {
5711 encode_SAMPLE2(sample, put_NXAST_SAMPLE2(out));
f69f713b
BY
5712 } else {
5713 struct nx_action_sample *nas = put_NXAST_SAMPLE(out);
5714 nas->probability = htons(sample->probability);
5715 nas->collector_set_id = htonl(sample->collector_set_id);
5716 nas->obs_domain_id = htonl(sample->obs_domain_id);
5717 nas->obs_point_id = htonl(sample->obs_point_id);
5718 }
c2d936a4
BP
5719}
5720
5721/* Parses 'arg' as the argument to a "sample" action, and appends such an
5722 * action to 'ofpacts'.
5723 *
5724 * Returns NULL if successful, otherwise a malloc()'d string describing the
5725 * error. The caller is responsible for freeing the returned string. */
cab50449 5726static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5727parse_SAMPLE(char *arg, const struct ofputil_port_map *port_map,
5728 struct ofpbuf *ofpacts,
c2d936a4
BP
5729 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5730{
5731 struct ofpact_sample *os = ofpact_put_SAMPLE(ofpacts);
f69f713b 5732 os->sampling_port = OFPP_NONE;
4930ea56 5733 os->direction = NX_ACTION_SAMPLE_DEFAULT;
c2d936a4 5734
f69f713b 5735 char *key, *value;
c2d936a4
BP
5736 while (ofputil_parse_key_value(&arg, &key, &value)) {
5737 char *error = NULL;
5738
5739 if (!strcmp(key, "probability")) {
5740 error = str_to_u16(value, "probability", &os->probability);
5741 if (!error && os->probability == 0) {
5742 error = xasprintf("invalid probability value \"%s\"", value);
5743 }
5744 } else if (!strcmp(key, "collector_set_id")) {
5745 error = str_to_u32(value, &os->collector_set_id);
5746 } else if (!strcmp(key, "obs_domain_id")) {
5747 error = str_to_u32(value, &os->obs_domain_id);
5748 } else if (!strcmp(key, "obs_point_id")) {
5749 error = str_to_u32(value, &os->obs_point_id);
f69f713b 5750 } else if (!strcmp(key, "sampling_port")) {
50f96b10
BP
5751 if (!ofputil_port_from_string(value, port_map,
5752 &os->sampling_port)) {
f69f713b
BY
5753 error = xasprintf("%s: unknown port", value);
5754 }
4930ea56
BP
5755 } else if (!strcmp(key, "ingress")) {
5756 os->direction = NX_ACTION_SAMPLE_INGRESS;
5757 } else if (!strcmp(key, "egress")) {
5758 os->direction = NX_ACTION_SAMPLE_EGRESS;
c2d936a4
BP
5759 } else {
5760 error = xasprintf("invalid key \"%s\" in \"sample\" argument",
5761 key);
5762 }
5763 if (error) {
5764 return error;
5765 }
5766 }
5767 if (os->probability == 0) {
5768 return xstrdup("non-zero \"probability\" must be specified on sample");
5769 }
f69f713b 5770
c2d936a4
BP
5771 return NULL;
5772}
5773
5774static void
50f96b10
BP
5775format_SAMPLE(const struct ofpact_sample *a,
5776 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4 5777{
b1c5bf1f
QM
5778 ds_put_format(s, "%ssample(%s%sprobability=%s%"PRIu16
5779 ",%scollector_set_id=%s%"PRIu32
5780 ",%sobs_domain_id=%s%"PRIu32
f69f713b 5781 ",%sobs_point_id=%s%"PRIu32,
b1c5bf1f
QM
5782 colors.paren, colors.end,
5783 colors.param, colors.end, a->probability,
5784 colors.param, colors.end, a->collector_set_id,
5785 colors.param, colors.end, a->obs_domain_id,
f69f713b
BY
5786 colors.param, colors.end, a->obs_point_id);
5787 if (a->sampling_port != OFPP_NONE) {
50f96b10
BP
5788 ds_put_format(s, ",%ssampling_port=%s", colors.param, colors.end);
5789 ofputil_format_port(a->sampling_port, port_map, s);
f69f713b 5790 }
4930ea56
BP
5791 if (a->direction == NX_ACTION_SAMPLE_INGRESS) {
5792 ds_put_format(s, ",%singress%s", colors.param, colors.end);
5793 } else if (a->direction == NX_ACTION_SAMPLE_EGRESS) {
5794 ds_put_format(s, ",%segress%s", colors.param, colors.end);
5795 }
f69f713b 5796 ds_put_format(s, "%s)%s", colors.paren, colors.end);
c2d936a4
BP
5797}
5798\f
d4abaff5
BP
5799/* debug_recirc instruction. */
5800
5801static bool enable_debug;
5802
5803void
5804ofpact_dummy_enable(void)
5805{
5806 enable_debug = true;
5807}
5808
5809static enum ofperr
5810decode_NXAST_RAW_DEBUG_RECIRC(struct ofpbuf *out)
5811{
5812 if (!enable_debug) {
5813 return OFPERR_OFPBAC_BAD_VENDOR_TYPE;
5814 }
5815
5816 ofpact_put_DEBUG_RECIRC(out);
5817 return 0;
5818}
5819
5820static void
5821encode_DEBUG_RECIRC(const struct ofpact_null *n OVS_UNUSED,
5822 enum ofp_version ofp_version OVS_UNUSED,
5823 struct ofpbuf *out)
5824{
5825 put_NXAST_DEBUG_RECIRC(out);
5826}
5827
5828static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
5829parse_DEBUG_RECIRC(char *arg OVS_UNUSED,
5830 const struct ofputil_port_map *port_map OVS_UNUSED,
5831 struct ofpbuf *ofpacts,
d4abaff5
BP
5832 enum ofputil_protocol *usable_protocols OVS_UNUSED)
5833{
5834 ofpact_put_DEBUG_RECIRC(ofpacts);
5835 return NULL;
5836}
5837
5838static void
50f96b10
BP
5839format_DEBUG_RECIRC(const struct ofpact_null *a OVS_UNUSED,
5840 const struct ofputil_port_map *port_map OVS_UNUSED,
5841 struct ds *s)
d4abaff5 5842{
b1c5bf1f 5843 ds_put_format(s, "%sdebug_recirc%s", colors.value, colors.end);
d4abaff5 5844}
07659514
JS
5845
5846/* Action structure for NXAST_CT.
5847 *
5848 * Pass traffic to the connection tracker.
5849 *
5850 * There are two important concepts to understanding the connection tracking
5851 * interface: Packet state and Connection state. Packets may be "Untracked" or
5852 * "Tracked". Connections may be "Uncommitted" or "Committed".
5853 *
5854 * - Packet State:
5855 *
5856 * Untracked packets have not yet passed through the connection tracker,
5857 * and the connection state for such packets is unknown. In most cases,
5858 * packets entering the OpenFlow pipeline will initially be in the
5859 * untracked state. Untracked packets may become tracked by executing
5860 * NXAST_CT with a "recirc_table" specified. This makes various aspects
5861 * about the connection available, in particular the connection state.
5862 *
5863 * Tracked packets have previously passed through the connection tracker.
5864 * These packets will remain tracked through until the end of the OpenFlow
5865 * pipeline. Tracked packets which have NXAST_CT executed with a
5866 * "recirc_table" specified will return to the tracked state.
5867 *
5868 * The packet state is only significant for the duration of packet
5869 * processing within the OpenFlow pipeline.
5870 *
5871 * - Connection State:
5872 *
5873 * Multiple packets may be associated with a single connection. Initially,
5874 * all connections are uncommitted. The connection state corresponding to
5875 * a packet is available in the NXM_NX_CT_STATE field for tracked packets.
5876 *
5877 * Uncommitted connections have no state stored about them. Uncommitted
5878 * connections may transition into the committed state by executing
5879 * NXAST_CT with the NX_CT_F_COMMIT flag.
5880 *
5881 * Once a connection becomes committed, information may be gathered about
5882 * the connection by passing subsequent packets through the connection
5883 * tracker, and the state of the connection will be stored beyond the
5884 * lifetime of packet processing.
5885 *
a76a37ef
JR
5886 * A committed connection always has the directionality of the packet that
5887 * caused the connection to be committed in the first place. This is the
5888 * "original direction" of the connection, and the opposite direction is
5889 * the "reply direction". If a connection is already committed, but it is
5890 * then decided that the original direction should be the opposite of the
5891 * existing connection, NX_CT_F_FORCE flag may be used in addition to
5892 * NX_CT_F_COMMIT flag to in effect terminate the existing connection and
5893 * start a new one in the current direction.
5894 *
07659514
JS
5895 * Connections may transition back into the uncommitted state due to
5896 * external timers, or due to the contents of packets that are sent to the
5897 * connection tracker. This behaviour is outside of the scope of the
5898 * OpenFlow interface.
5899 *
5900 * The "zone" specifies a context within which the tracking is done:
5901 *
5902 * The connection tracking zone is a 16-bit number. Each zone is an
5903 * independent connection tracking context. The connection state for each
5904 * connection is completely separate for each zone, so if a connection
5905 * is committed to zone A, then it will remain uncommitted in zone B.
5906 * If NXAST_CT is executed with the same zone multiple times, later
5907 * executions have no effect.
5908 *
5909 * If 'zone_src' is nonzero, this specifies that the zone should be
5910 * sourced from a field zone_src[ofs:ofs+nbits]. The format and semantics
5911 * of 'zone_src' and 'zone_ofs_nbits' are similar to those for the
5912 * NXAST_REG_LOAD action. The acceptable nxm_header values for 'zone_src'
5913 * are the same as the acceptable nxm_header values for the 'src' field of
5914 * NXAST_REG_MOVE.
5915 *
5916 * If 'zone_src' is zero, then the value of 'zone_imm' will be used as the
5917 * connection tracking zone.
5918 *
5919 * The "recirc_table" allows NXM_NX_CT_* fields to become available:
5920 *
5921 * If "recirc_table" has a value other than NX_CT_RECIRC_NONE, then the
5922 * packet will be logically cloned prior to executing this action. One
5923 * copy will be sent to the connection tracker, then will be re-injected
5924 * into the OpenFlow pipeline beginning at the OpenFlow table specified in
5925 * this field. When the packet re-enters the pipeline, the NXM_NX_CT_*
5926 * fields will be populated. The original instance of the packet will
5927 * continue the current actions list. This can be thought of as similar to
5928 * the effect of the "output" action: One copy is sent out (in this case,
5929 * to the connection tracker), but the current copy continues processing.
5930 *
5931 * It is strongly recommended that this table is later than the current
5932 * table, to prevent loops.
8e53fe8c 5933 *
d787ad39
JS
5934 * The "alg" attaches protocol-specific behaviour to this action:
5935 *
5936 * The ALG is a 16-bit number which specifies that additional
5937 * processing should be applied to this traffic.
5938 *
5939 * Protocol | Value | Meaning
5940 * --------------------------------------------------------------------
5941 * None | 0 | No protocol-specific behaviour.
5942 * FTP | 21 | Parse FTP control connections and observe the
5943 * | | negotiation of related data connections.
5944 * Other | Other | Unsupported protocols.
5945 *
5946 * By way of example, if FTP control connections have this action applied
5947 * with the ALG set to FTP (21), then the connection tracker will observe
5948 * the negotiation of data connections. This allows the connection
5949 * tracker to identify subsequent data connections as "related" to this
5950 * existing connection. The "related" flag will be populated in the
5951 * NXM_NX_CT_STATE field for such connections if the 'recirc_table' is
5952 * specified.
5953 *
8e53fe8c
JS
5954 * Zero or more actions may immediately follow this action. These actions will
5955 * be executed within the context of the connection tracker, and they require
a76a37ef 5956 * NX_CT_F_COMMIT flag be set.
07659514
JS
5957 */
5958struct nx_action_conntrack {
5959 ovs_be16 type; /* OFPAT_VENDOR. */
5960 ovs_be16 len; /* At least 24. */
5961 ovs_be32 vendor; /* NX_VENDOR_ID. */
5962 ovs_be16 subtype; /* NXAST_CT. */
5963 ovs_be16 flags; /* Zero or more NX_CT_F_* flags.
5964 * Unspecified flag bits must be zero. */
5965 ovs_be32 zone_src; /* Connection tracking context. */
5966 union {
5967 ovs_be16 zone_ofs_nbits;/* Range to use from source field. */
5968 ovs_be16 zone_imm; /* Immediate value for zone. */
5969 };
5970 uint8_t recirc_table; /* Recirculate to a specific table, or
5971 NX_CT_RECIRC_NONE for no recirculation. */
d787ad39
JS
5972 uint8_t pad[3]; /* Zeroes */
5973 ovs_be16 alg; /* Well-known port number for the protocol.
5974 * 0 indicates no ALG is required. */
07659514
JS
5975 /* Followed by a sequence of zero or more OpenFlow actions. The length of
5976 * these is included in 'len'. */
5977};
5978OFP_ASSERT(sizeof(struct nx_action_conntrack) == 24);
5979
5980static enum ofperr
5981decode_ct_zone(const struct nx_action_conntrack *nac,
04f48a68 5982 struct ofpact_conntrack *out,
5c7c16d8 5983 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap)
07659514
JS
5984{
5985 if (nac->zone_src) {
5986 enum ofperr error;
5987
07659514
JS
5988 out->zone_src.ofs = nxm_decode_ofs(nac->zone_ofs_nbits);
5989 out->zone_src.n_bits = nxm_decode_n_bits(nac->zone_ofs_nbits);
5c7c16d8
YHW
5990 error = mf_vl_mff_mf_from_nxm_header(ntohl(nac->zone_src),
5991 vl_mff_map, &out->zone_src.field,
5992 tlv_bitmap);
5993 if (error) {
5994 return error;
04f48a68
YHW
5995 }
5996
07659514
JS
5997 error = mf_check_src(&out->zone_src, NULL);
5998 if (error) {
5999 return error;
6000 }
6001
6002 if (out->zone_src.n_bits != 16) {
6003 VLOG_WARN_RL(&rl, "zone n_bits %d not within valid range [16..16]",
6004 out->zone_src.n_bits);
6005 return OFPERR_OFPBAC_BAD_SET_LEN;
6006 }
6007 } else {
6008 out->zone_src.field = NULL;
6009 out->zone_imm = ntohs(nac->zone_imm);
6010 }
6011
6012 return 0;
6013}
6014
6015static enum ofperr
6016decode_NXAST_RAW_CT(const struct nx_action_conntrack *nac,
04f48a68 6017 enum ofp_version ofp_version,
5c7c16d8
YHW
6018 const struct vl_mff_map *vl_mff_map, uint64_t *tlv_bitmap,
6019 struct ofpbuf *out)
07659514 6020{
8e53fe8c 6021 const size_t ct_offset = ofpacts_pull(out);
0a2869d5 6022 struct ofpact_conntrack *conntrack = ofpact_put_CT(out);
a76a37ef
JR
6023 int error;
6024
07659514 6025 conntrack->flags = ntohs(nac->flags);
a76a37ef
JR
6026 if (conntrack->flags & NX_CT_F_FORCE &&
6027 !(conntrack->flags & NX_CT_F_COMMIT)) {
6028 error = OFPERR_OFPBAC_BAD_ARGUMENT;
6029 goto out;
6030 }
0a2869d5 6031
5c7c16d8 6032 error = decode_ct_zone(nac, conntrack, vl_mff_map, tlv_bitmap);
07659514
JS
6033 if (error) {
6034 goto out;
6035 }
6036 conntrack->recirc_table = nac->recirc_table;
d787ad39 6037 conntrack->alg = ntohs(nac->alg);
07659514 6038
8e53fe8c
JS
6039 ofpbuf_pull(out, sizeof(*conntrack));
6040
0a2869d5
BP
6041 struct ofpbuf openflow = ofpbuf_const_initializer(
6042 nac + 1, ntohs(nac->len) - sizeof(*nac));
8e53fe8c
JS
6043 error = ofpacts_pull_openflow_actions__(&openflow, openflow.size,
6044 ofp_version,
6045 1u << OVSINST_OFPIT11_APPLY_ACTIONS,
5c7c16d8
YHW
6046 out, OFPACT_CT, vl_mff_map,
6047 tlv_bitmap);
8e53fe8c
JS
6048 if (error) {
6049 goto out;
6050 }
6051
6052 conntrack = ofpbuf_push_uninit(out, sizeof(*conntrack));
6053 out->header = &conntrack->ofpact;
ce058104 6054 ofpact_finish_CT(out, &conntrack);
8e53fe8c
JS
6055
6056 if (conntrack->ofpact.len > sizeof(*conntrack)
6057 && !(conntrack->flags & NX_CT_F_COMMIT)) {
9ac0aada
JR
6058 const struct ofpact *a;
6059 size_t ofpacts_len = conntrack->ofpact.len - sizeof(*conntrack);
6060
6061 OFPACT_FOR_EACH (a, conntrack->actions, ofpacts_len) {
6062 if (a->type != OFPACT_NAT || ofpact_get_NAT(a)->flags
6063 || ofpact_get_NAT(a)->range_af != AF_UNSPEC) {
6064 VLOG_WARN_RL(&rl, "CT action requires commit flag if actions "
6065 "other than NAT without arguments are specified.");
6066 error = OFPERR_OFPBAC_BAD_ARGUMENT;
6067 goto out;
6068 }
6069 }
8e53fe8c
JS
6070 }
6071
07659514 6072out:
8e53fe8c 6073 ofpbuf_push_uninit(out, ct_offset);
07659514
JS
6074 return error;
6075}
6076
6077static void
6078encode_CT(const struct ofpact_conntrack *conntrack,
8e53fe8c 6079 enum ofp_version ofp_version, struct ofpbuf *out)
07659514
JS
6080{
6081 struct nx_action_conntrack *nac;
8e53fe8c
JS
6082 const size_t ofs = out->size;
6083 size_t len;
07659514
JS
6084
6085 nac = put_NXAST_CT(out);
6086 nac->flags = htons(conntrack->flags);
6087 if (conntrack->zone_src.field) {
04f48a68 6088 nac->zone_src = htonl(nxm_header_from_mff(conntrack->zone_src.field));
07659514
JS
6089 nac->zone_ofs_nbits = nxm_encode_ofs_nbits(conntrack->zone_src.ofs,
6090 conntrack->zone_src.n_bits);
6091 } else {
6092 nac->zone_src = htonl(0);
6093 nac->zone_imm = htons(conntrack->zone_imm);
6094 }
6095 nac->recirc_table = conntrack->recirc_table;
d787ad39 6096 nac->alg = htons(conntrack->alg);
8e53fe8c
JS
6097
6098 len = ofpacts_put_openflow_actions(conntrack->actions,
6099 ofpact_ct_get_action_len(conntrack),
6100 out, ofp_version);
6101 len += sizeof(*nac);
6102 nac = ofpbuf_at(out, ofs, sizeof(*nac));
6103 nac->len = htons(len);
07659514
JS
6104}
6105
50f96b10
BP
6106static char *OVS_WARN_UNUSED_RESULT
6107parse_NAT(char *arg, const struct ofputil_port_map *port_map OVS_UNUSED,
6108 struct ofpbuf *, enum ofputil_protocol * OVS_UNUSED);
9ac0aada 6109
07659514
JS
6110/* Parses 'arg' as the argument to a "ct" action, and appends such an
6111 * action to 'ofpacts'.
6112 *
6113 * Returns NULL if successful, otherwise a malloc()'d string describing the
6114 * error. The caller is responsible for freeing the returned string. */
6115static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6116parse_CT(char *arg, const struct ofputil_port_map *port_map,
6117 struct ofpbuf *ofpacts,
8e53fe8c 6118 enum ofputil_protocol *usable_protocols)
07659514 6119{
8e53fe8c 6120 const size_t ct_offset = ofpacts_pull(ofpacts);
07659514
JS
6121 struct ofpact_conntrack *oc;
6122 char *error = NULL;
6123 char *key, *value;
6124
6125 oc = ofpact_put_CT(ofpacts);
6126 oc->flags = 0;
6127 oc->recirc_table = NX_CT_RECIRC_NONE;
6128 while (ofputil_parse_key_value(&arg, &key, &value)) {
6129 if (!strcmp(key, "commit")) {
6130 oc->flags |= NX_CT_F_COMMIT;
a76a37ef
JR
6131 } else if (!strcmp(key, "force")) {
6132 oc->flags |= NX_CT_F_FORCE;
07659514
JS
6133 } else if (!strcmp(key, "table")) {
6134 error = str_to_u8(value, "recirc_table", &oc->recirc_table);
6135 if (!error && oc->recirc_table == NX_CT_RECIRC_NONE) {
fd13c6b5 6136 error = xasprintf("invalid table %#"PRIx8, oc->recirc_table);
07659514
JS
6137 }
6138 } else if (!strcmp(key, "zone")) {
6139 error = str_to_u16(value, "zone", &oc->zone_imm);
6140
6141 if (error) {
6142 free(error);
6143 error = mf_parse_subfield(&oc->zone_src, value);
6144 if (error) {
6145 return error;
6146 }
6147 }
d787ad39
JS
6148 } else if (!strcmp(key, "alg")) {
6149 error = str_to_connhelper(value, &oc->alg);
9ac0aada
JR
6150 } else if (!strcmp(key, "nat")) {
6151 const size_t nat_offset = ofpacts_pull(ofpacts);
6152
50f96b10 6153 error = parse_NAT(value, port_map, ofpacts, usable_protocols);
9ac0aada
JR
6154 /* Update CT action pointer and length. */
6155 ofpacts->header = ofpbuf_push_uninit(ofpacts, nat_offset);
6156 oc = ofpacts->header;
8e53fe8c
JS
6157 } else if (!strcmp(key, "exec")) {
6158 /* Hide existing actions from ofpacts_parse_copy(), so the
6159 * nesting can be handled transparently. */
76e3e669 6160 enum ofputil_protocol usable_protocols2;
9ac0aada 6161 const size_t exec_offset = ofpacts_pull(ofpacts);
76e3e669 6162
76e3e669
JR
6163 /* Initializes 'usable_protocol2', fold it back to
6164 * '*usable_protocols' afterwards, so that we do not lose
6165 * restrictions already in there. */
50f96b10
BP
6166 error = ofpacts_parse_copy(value, port_map, ofpacts,
6167 &usable_protocols2, false, OFPACT_CT);
76e3e669 6168 *usable_protocols &= usable_protocols2;
9ac0aada 6169 ofpacts->header = ofpbuf_push_uninit(ofpacts, exec_offset);
8e53fe8c 6170 oc = ofpacts->header;
07659514
JS
6171 } else {
6172 error = xasprintf("invalid argument to \"ct\" action: `%s'", key);
6173 }
6174 if (error) {
6175 break;
6176 }
6177 }
fce16ca1 6178 if (!error && oc->flags & NX_CT_F_FORCE && !(oc->flags & NX_CT_F_COMMIT)) {
a76a37ef
JR
6179 error = xasprintf("\"force\" flag requires \"commit\" flag.");
6180 }
ce058104 6181 ofpact_finish_CT(ofpacts, &oc);
8e53fe8c 6182 ofpbuf_push_uninit(ofpacts, ct_offset);
07659514
JS
6183 return error;
6184}
6185
d787ad39
JS
6186static void
6187format_alg(int port, struct ds *s)
6188{
40c7b2fc
JS
6189 switch(port) {
6190 case IPPORT_FTP:
b1c5bf1f 6191 ds_put_format(s, "%salg=%sftp,", colors.param, colors.end);
40c7b2fc
JS
6192 break;
6193 case IPPORT_TFTP:
6194 ds_put_format(s, "%salg=%stftp,", colors.param, colors.end);
6195 break;
6196 case 0:
6197 /* Don't print. */
6198 break;
6199 default:
b1c5bf1f 6200 ds_put_format(s, "%salg=%s%d,", colors.param, colors.end, port);
40c7b2fc 6201 break;
d787ad39
JS
6202 }
6203}
6204
50f96b10
BP
6205static void format_NAT(const struct ofpact_nat *,
6206 const struct ofputil_port_map *port_map,
6207 struct ds *ds);
9ac0aada 6208
07659514 6209static void
50f96b10
BP
6210format_CT(const struct ofpact_conntrack *a,
6211 const struct ofputil_port_map *port_map,
6212 struct ds *s)
07659514 6213{
b1c5bf1f 6214 ds_put_format(s, "%sct(%s", colors.paren, colors.end);
07659514 6215 if (a->flags & NX_CT_F_COMMIT) {
b1c5bf1f 6216 ds_put_format(s, "%scommit%s,", colors.value, colors.end);
07659514 6217 }
a76a37ef
JR
6218 if (a->flags & NX_CT_F_FORCE) {
6219 ds_put_format(s, "%sforce%s,", colors.value, colors.end);
6220 }
07659514 6221 if (a->recirc_table != NX_CT_RECIRC_NONE) {
b1c5bf1f
QM
6222 ds_put_format(s, "%stable=%s%"PRIu8",",
6223 colors.special, colors.end, a->recirc_table);
07659514
JS
6224 }
6225 if (a->zone_src.field) {
b1c5bf1f 6226 ds_put_format(s, "%szone=%s", colors.param, colors.end);
07659514
JS
6227 mf_format_subfield(&a->zone_src, s);
6228 ds_put_char(s, ',');
6229 } else if (a->zone_imm) {
b1c5bf1f
QM
6230 ds_put_format(s, "%szone=%s%"PRIu16",",
6231 colors.param, colors.end, a->zone_imm);
07659514 6232 }
9ac0aada
JR
6233 /* If the first action is a NAT action, format it outside of the 'exec'
6234 * envelope. */
6235 const struct ofpact *action = a->actions;
6236 size_t actions_len = ofpact_ct_get_action_len(a);
6237 if (actions_len && action->type == OFPACT_NAT) {
50f96b10 6238 format_NAT(ofpact_get_NAT(action), port_map, s);
9ac0aada
JR
6239 ds_put_char(s, ',');
6240 actions_len -= OFPACT_ALIGN(action->len);
6241 action = ofpact_next(action);
6242 }
6243 if (actions_len) {
b1c5bf1f 6244 ds_put_format(s, "%sexec(%s", colors.paren, colors.end);
50f96b10 6245 ofpacts_format(action, actions_len, port_map, s);
b1c5bf1f 6246 ds_put_format(s, "%s),%s", colors.paren, colors.end);
8e53fe8c 6247 }
d787ad39 6248 format_alg(a->alg, s);
07659514 6249 ds_chomp(s, ',');
b1c5bf1f 6250 ds_put_format(s, "%s)%s", colors.paren, colors.end);
07659514 6251}
9ac0aada 6252\f
72fe7578
BP
6253/* ct_clear action. */
6254
6255static enum ofperr
6256decode_NXAST_RAW_CT_CLEAR(struct ofpbuf *out)
6257{
6258 ofpact_put_CT_CLEAR(out);
6259 return 0;
6260}
6261
6262static void
6263encode_CT_CLEAR(const struct ofpact_null *null OVS_UNUSED,
6264 enum ofp_version ofp_version OVS_UNUSED,
6265 struct ofpbuf *out)
6266{
6267 put_NXAST_CT_CLEAR(out);
6268}
6269
6270static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6271parse_CT_CLEAR(char *arg OVS_UNUSED,
6272 const struct ofputil_port_map *port_map OVS_UNUSED,
6273 struct ofpbuf *ofpacts,
72fe7578
BP
6274 enum ofputil_protocol *usable_protocols OVS_UNUSED)
6275{
6276 ofpact_put_CT_CLEAR(ofpacts);
6277 return NULL;
6278}
6279
6280static void
50f96b10
BP
6281format_CT_CLEAR(const struct ofpact_null *a OVS_UNUSED,
6282 const struct ofputil_port_map *port_map OVS_UNUSED,
6283 struct ds *s)
72fe7578
BP
6284{
6285 ds_put_format(s, "%sct_clear%s", colors.value, colors.end);
50f96b10
BP
6286}
6287\f
9ac0aada
JR
6288/* NAT action. */
6289
6290/* Which optional fields are present? */
6291enum nx_nat_range {
6292 NX_NAT_RANGE_IPV4_MIN = 1 << 0, /* ovs_be32 */
6293 NX_NAT_RANGE_IPV4_MAX = 1 << 1, /* ovs_be32 */
6294 NX_NAT_RANGE_IPV6_MIN = 1 << 2, /* struct in6_addr */
6295 NX_NAT_RANGE_IPV6_MAX = 1 << 3, /* struct in6_addr */
6296 NX_NAT_RANGE_PROTO_MIN = 1 << 4, /* ovs_be16 */
6297 NX_NAT_RANGE_PROTO_MAX = 1 << 5, /* ovs_be16 */
6298};
6299
6300/* Action structure for NXAST_NAT. */
6301struct nx_action_nat {
6302 ovs_be16 type; /* OFPAT_VENDOR. */
6303 ovs_be16 len; /* At least 16. */
6304 ovs_be32 vendor; /* NX_VENDOR_ID. */
6305 ovs_be16 subtype; /* NXAST_NAT. */
6306 uint8_t pad[2]; /* Must be zero. */
6307 ovs_be16 flags; /* Zero or more NX_NAT_F_* flags.
6308 * Unspecified flag bits must be zero. */
6309 ovs_be16 range_present; /* NX_NAT_RANGE_* */
6310 /* Followed by optional parameters as specified by 'range_present' */
6311};
6312OFP_ASSERT(sizeof(struct nx_action_nat) == 16);
6313
6314static void
6315encode_NAT(const struct ofpact_nat *nat,
6316 enum ofp_version ofp_version OVS_UNUSED,
6317 struct ofpbuf *out)
6318{
6319 struct nx_action_nat *nan;
6320 const size_t ofs = out->size;
6321 uint16_t range_present = 0;
6322
6323 nan = put_NXAST_NAT(out);
6324 nan->flags = htons(nat->flags);
6325 if (nat->range_af == AF_INET) {
6326 if (nat->range.addr.ipv4.min) {
6327 ovs_be32 *min = ofpbuf_put_uninit(out, sizeof *min);
6328 *min = nat->range.addr.ipv4.min;
6329 range_present |= NX_NAT_RANGE_IPV4_MIN;
6330 }
6331 if (nat->range.addr.ipv4.max) {
6332 ovs_be32 *max = ofpbuf_put_uninit(out, sizeof *max);
6333 *max = nat->range.addr.ipv4.max;
6334 range_present |= NX_NAT_RANGE_IPV4_MAX;
6335 }
6336 } else if (nat->range_af == AF_INET6) {
6337 if (!ipv6_mask_is_any(&nat->range.addr.ipv6.min)) {
6338 struct in6_addr *min = ofpbuf_put_uninit(out, sizeof *min);
6339 *min = nat->range.addr.ipv6.min;
6340 range_present |= NX_NAT_RANGE_IPV6_MIN;
6341 }
6342 if (!ipv6_mask_is_any(&nat->range.addr.ipv6.max)) {
6343 struct in6_addr *max = ofpbuf_put_uninit(out, sizeof *max);
6344 *max = nat->range.addr.ipv6.max;
6345 range_present |= NX_NAT_RANGE_IPV6_MAX;
6346 }
6347 }
6348 if (nat->range_af != AF_UNSPEC) {
6349 if (nat->range.proto.min) {
6350 ovs_be16 *min = ofpbuf_put_uninit(out, sizeof *min);
6351 *min = htons(nat->range.proto.min);
6352 range_present |= NX_NAT_RANGE_PROTO_MIN;
6353 }
6354 if (nat->range.proto.max) {
6355 ovs_be16 *max = ofpbuf_put_uninit(out, sizeof *max);
6356 *max = htons(nat->range.proto.max);
6357 range_present |= NX_NAT_RANGE_PROTO_MAX;
6358 }
6359 }
6360 pad_ofpat(out, ofs);
6361 nan = ofpbuf_at(out, ofs, sizeof *nan);
6362 nan->range_present = htons(range_present);
6363}
6364
6365static enum ofperr
6366decode_NXAST_RAW_NAT(const struct nx_action_nat *nan,
6367 enum ofp_version ofp_version OVS_UNUSED,
6368 struct ofpbuf *out)
6369{
6370 struct ofpact_nat *nat;
6371 uint16_t range_present = ntohs(nan->range_present);
6372 const char *opts = (char *)(nan + 1);
6373 uint16_t len = ntohs(nan->len) - sizeof *nan;
6374
6375 nat = ofpact_put_NAT(out);
6376 nat->flags = ntohs(nan->flags);
6377
ae8b9260
JR
6378 /* Check for unknown or mutually exclusive flags. */
6379 if ((nat->flags & ~NX_NAT_F_MASK)
6380 || (nat->flags & NX_NAT_F_SRC && nat->flags & NX_NAT_F_DST)
6381 || (nat->flags & NX_NAT_F_PROTO_HASH
6382 && nat->flags & NX_NAT_F_PROTO_RANDOM)) {
6383 return OFPERR_OFPBAC_BAD_ARGUMENT;
6384 }
6385
9ac0aada
JR
6386#define NX_NAT_GET_OPT(DST, SRC, LEN, TYPE) \
6387 (LEN >= sizeof(TYPE) \
6388 ? (memcpy(DST, SRC, sizeof(TYPE)), LEN -= sizeof(TYPE), \
6389 SRC += sizeof(TYPE)) \
6390 : NULL)
6391
6392 nat->range_af = AF_UNSPEC;
6393 if (range_present & NX_NAT_RANGE_IPV4_MIN) {
6394 if (range_present & (NX_NAT_RANGE_IPV6_MIN | NX_NAT_RANGE_IPV6_MAX)) {
6395 return OFPERR_OFPBAC_BAD_ARGUMENT;
6396 }
6397
6398 if (!NX_NAT_GET_OPT(&nat->range.addr.ipv4.min, opts, len, ovs_be32)
6399 || !nat->range.addr.ipv4.min) {
6400 return OFPERR_OFPBAC_BAD_ARGUMENT;
6401 }
6402
6403 nat->range_af = AF_INET;
6404
6405 if (range_present & NX_NAT_RANGE_IPV4_MAX) {
6406 if (!NX_NAT_GET_OPT(&nat->range.addr.ipv4.max, opts, len,
6407 ovs_be32)) {
6408 return OFPERR_OFPBAC_BAD_ARGUMENT;
6409 }
6410 if (ntohl(nat->range.addr.ipv4.max)
6411 < ntohl(nat->range.addr.ipv4.min)) {
6412 return OFPERR_OFPBAC_BAD_ARGUMENT;
6413 }
6414 }
6415 } else if (range_present & NX_NAT_RANGE_IPV4_MAX) {
6416 return OFPERR_OFPBAC_BAD_ARGUMENT;
6417 } else if (range_present & NX_NAT_RANGE_IPV6_MIN) {
6418 if (!NX_NAT_GET_OPT(&nat->range.addr.ipv6.min, opts, len,
6419 struct in6_addr)
6420 || ipv6_mask_is_any(&nat->range.addr.ipv6.min)) {
6421 return OFPERR_OFPBAC_BAD_ARGUMENT;
6422 }
6423
6424 nat->range_af = AF_INET6;
6425
6426 if (range_present & NX_NAT_RANGE_IPV6_MAX) {
6427 if (!NX_NAT_GET_OPT(&nat->range.addr.ipv6.max, opts, len,
6428 struct in6_addr)) {
6429 return OFPERR_OFPBAC_BAD_ARGUMENT;
6430 }
6431 if (memcmp(&nat->range.addr.ipv6.max, &nat->range.addr.ipv6.min,
6432 sizeof(struct in6_addr)) < 0) {
6433 return OFPERR_OFPBAC_BAD_ARGUMENT;
6434 }
6435 }
6436 } else if (range_present & NX_NAT_RANGE_IPV6_MAX) {
6437 return OFPERR_OFPBAC_BAD_ARGUMENT;
6438 }
6439
6440 if (range_present & NX_NAT_RANGE_PROTO_MIN) {
6441 ovs_be16 proto;
6442
6443 if (nat->range_af == AF_UNSPEC) {
6444 return OFPERR_OFPBAC_BAD_ARGUMENT;
6445 }
6446 if (!NX_NAT_GET_OPT(&proto, opts, len, ovs_be16) || proto == 0) {
6447 return OFPERR_OFPBAC_BAD_ARGUMENT;
6448 }
6449 nat->range.proto.min = ntohs(proto);
6450 if (range_present & NX_NAT_RANGE_PROTO_MAX) {
6451 if (!NX_NAT_GET_OPT(&proto, opts, len, ovs_be16)) {
6452 return OFPERR_OFPBAC_BAD_ARGUMENT;
6453 }
6454 nat->range.proto.max = ntohs(proto);
6455 if (nat->range.proto.max < nat->range.proto.min) {
6456 return OFPERR_OFPBAC_BAD_ARGUMENT;
6457 }
6458 }
6459 } else if (range_present & NX_NAT_RANGE_PROTO_MAX) {
6460 return OFPERR_OFPBAC_BAD_ARGUMENT;
6461 }
6462
6463 return 0;
6464}
6465
6466static void
50f96b10
BP
6467format_NAT(const struct ofpact_nat *a,
6468 const struct ofputil_port_map *port_map OVS_UNUSED,
6469 struct ds *ds)
9ac0aada 6470{
b1c5bf1f 6471 ds_put_format(ds, "%snat%s", colors.paren, colors.end);
9ac0aada
JR
6472
6473 if (a->flags & (NX_NAT_F_SRC | NX_NAT_F_DST)) {
b1c5bf1f
QM
6474 ds_put_format(ds, "%s(%s", colors.paren, colors.end);
6475 ds_put_format(ds, a->flags & NX_NAT_F_SRC ? "%ssrc%s" : "%sdst%s",
6476 colors.param, colors.end);
9ac0aada
JR
6477
6478 if (a->range_af != AF_UNSPEC) {
b1c5bf1f 6479 ds_put_format(ds, "%s=%s", colors.param, colors.end);
9ac0aada
JR
6480
6481 if (a->range_af == AF_INET) {
6482 ds_put_format(ds, IP_FMT, IP_ARGS(a->range.addr.ipv4.min));
6483
6484 if (a->range.addr.ipv4.max
6485 && a->range.addr.ipv4.max != a->range.addr.ipv4.min) {
6486 ds_put_format(ds, "-"IP_FMT,
6487 IP_ARGS(a->range.addr.ipv4.max));
6488 }
6489 } else if (a->range_af == AF_INET6) {
6490 ipv6_format_addr_bracket(&a->range.addr.ipv6.min, ds,
6491 a->range.proto.min);
6492
6493 if (!ipv6_mask_is_any(&a->range.addr.ipv6.max)
6494 && memcmp(&a->range.addr.ipv6.max, &a->range.addr.ipv6.min,
6495 sizeof(struct in6_addr)) != 0) {
6496 ds_put_char(ds, '-');
6497 ipv6_format_addr_bracket(&a->range.addr.ipv6.max, ds,
6498 a->range.proto.min);
6499 }
6500 }
6501 if (a->range.proto.min) {
6502 ds_put_char(ds, ':');
6503 ds_put_format(ds, "%"PRIu16, a->range.proto.min);
6504
6505 if (a->range.proto.max
6506 && a->range.proto.max != a->range.proto.min) {
6507 ds_put_format(ds, "-%"PRIu16, a->range.proto.max);
6508 }
6509 }
6510 ds_put_char(ds, ',');
6511
6512 if (a->flags & NX_NAT_F_PERSISTENT) {
b1c5bf1f
QM
6513 ds_put_format(ds, "%spersistent%s,",
6514 colors.value, colors.end);
9ac0aada
JR
6515 }
6516 if (a->flags & NX_NAT_F_PROTO_HASH) {
b1c5bf1f 6517 ds_put_format(ds, "%shash%s,", colors.value, colors.end);
9ac0aada
JR
6518 }
6519 if (a->flags & NX_NAT_F_PROTO_RANDOM) {
b1c5bf1f 6520 ds_put_format(ds, "%srandom%s,", colors.value, colors.end);
9ac0aada
JR
6521 }
6522 }
6523 ds_chomp(ds, ',');
b1c5bf1f 6524 ds_put_format(ds, "%s)%s", colors.paren, colors.end);
9ac0aada
JR
6525 }
6526}
6527
6528static char * OVS_WARN_UNUSED_RESULT
6529str_to_nat_range(const char *s, struct ofpact_nat *on)
6530{
6531 char ipv6_s[IPV6_SCAN_LEN + 1];
6532 int n = 0;
6533
6534 on->range_af = AF_UNSPEC;
6535 if (ovs_scan_len(s, &n, IP_SCAN_FMT,
6536 IP_SCAN_ARGS(&on->range.addr.ipv4.min))) {
6537 on->range_af = AF_INET;
6538
6539 if (s[n] == '-') {
6540 n++;
6541 if (!ovs_scan_len(s, &n, IP_SCAN_FMT,
6542 IP_SCAN_ARGS(&on->range.addr.ipv4.max))
6543 || (ntohl(on->range.addr.ipv4.max)
6544 < ntohl(on->range.addr.ipv4.min))) {
6545 goto error;
6546 }
6547 }
6548 } else if ((ovs_scan_len(s, &n, IPV6_SCAN_FMT, ipv6_s)
6549 || ovs_scan_len(s, &n, "["IPV6_SCAN_FMT"]", ipv6_s))
6550 && inet_pton(AF_INET6, ipv6_s, &on->range.addr.ipv6.min) == 1) {
6551 on->range_af = AF_INET6;
6552
6553 if (s[n] == '-') {
6554 n++;
6555 if (!(ovs_scan_len(s, &n, IPV6_SCAN_FMT, ipv6_s)
6556 || ovs_scan_len(s, &n, "["IPV6_SCAN_FMT"]", ipv6_s))
6557 || inet_pton(AF_INET6, ipv6_s, &on->range.addr.ipv6.max) != 1
6558 || memcmp(&on->range.addr.ipv6.max, &on->range.addr.ipv6.min,
6559 sizeof on->range.addr.ipv6.max) < 0) {
6560 goto error;
6561 }
6562 }
6563 }
6564 if (on->range_af != AF_UNSPEC && s[n] == ':') {
6565 n++;
6566 if (!ovs_scan_len(s, &n, "%"SCNu16, &on->range.proto.min)) {
6567 goto error;
6568 }
6569 if (s[n] == '-') {
6570 n++;
6571 if (!ovs_scan_len(s, &n, "%"SCNu16, &on->range.proto.max)
6572 || on->range.proto.max < on->range.proto.min) {
6573 goto error;
6574 }
6575 }
6576 }
6577 if (strlen(s) != n) {
6578 return xasprintf("garbage (%s) after nat range \"%s\" (pos: %d)",
6579 &s[n], s, n);
6580 }
6581 return NULL;
6582error:
6583 return xasprintf("invalid nat range \"%s\"", s);
6584}
6585
6586
6587/* Parses 'arg' as the argument to a "nat" action, and appends such an
6588 * action to 'ofpacts'.
6589 *
6590 * Returns NULL if successful, otherwise a malloc()'d string describing the
6591 * error. The caller is responsible for freeing the returned string. */
6592static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6593parse_NAT(char *arg,
6594 const struct ofputil_port_map *port_map OVS_UNUSED,
6595 struct ofpbuf *ofpacts,
9ac0aada
JR
6596 enum ofputil_protocol *usable_protocols OVS_UNUSED)
6597{
6598 struct ofpact_nat *on = ofpact_put_NAT(ofpacts);
6599 char *key, *value;
6600
6601 on->flags = 0;
6602 on->range_af = AF_UNSPEC;
6603
6604 while (ofputil_parse_key_value(&arg, &key, &value)) {
6605 char *error = NULL;
6606
6607 if (!strcmp(key, "src")) {
6608 on->flags |= NX_NAT_F_SRC;
6609 error = str_to_nat_range(value, on);
6610 } else if (!strcmp(key, "dst")) {
6611 on->flags |= NX_NAT_F_DST;
6612 error = str_to_nat_range(value, on);
6613 } else if (!strcmp(key, "persistent")) {
6614 on->flags |= NX_NAT_F_PERSISTENT;
6615 } else if (!strcmp(key, "hash")) {
6616 on->flags |= NX_NAT_F_PROTO_HASH;
6617 } else if (!strcmp(key, "random")) {
6618 on->flags |= NX_NAT_F_PROTO_RANDOM;
6619 } else {
6620 error = xasprintf("invalid key \"%s\" in \"nat\" argument",
6621 key);
6622 }
6623 if (error) {
6624 return error;
6625 }
6626 }
6627 if (on->flags & NX_NAT_F_SRC && on->flags & NX_NAT_F_DST) {
ae8b9260 6628 return xasprintf("May only specify one of \"src\" or \"dst\".");
9ac0aada
JR
6629 }
6630 if (!(on->flags & NX_NAT_F_SRC || on->flags & NX_NAT_F_DST)) {
6631 if (on->flags) {
ae8b9260 6632 return xasprintf("Flags allowed only with \"src\" or \"dst\".");
9ac0aada
JR
6633 }
6634 if (on->range_af != AF_UNSPEC) {
ae8b9260 6635 return xasprintf("Range allowed only with \"src\" or \"dst\".");
9ac0aada
JR
6636 }
6637 }
ae8b9260
JR
6638 if (on->flags & NX_NAT_F_PROTO_HASH && on->flags & NX_NAT_F_PROTO_RANDOM) {
6639 return xasprintf("Both \"hash\" and \"random\" are not allowed.");
6640 }
6641
9ac0aada
JR
6642 return NULL;
6643}
6644
aaca4fe0
WT
6645/* Truncate output action. */
6646struct nx_action_output_trunc {
6647 ovs_be16 type; /* OFPAT_VENDOR. */
6648 ovs_be16 len; /* At least 16. */
6649 ovs_be32 vendor; /* NX_VENDOR_ID. */
6650 ovs_be16 subtype; /* NXAST_OUTPUT_TRUNC. */
6651 ovs_be16 port; /* Output port */
6652 ovs_be32 max_len; /* Truncate packet to size bytes */
6653};
6654OFP_ASSERT(sizeof(struct nx_action_output_trunc) == 16);
6655
6656static enum ofperr
6657decode_NXAST_RAW_OUTPUT_TRUNC(const struct nx_action_output_trunc *natrc,
6658 enum ofp_version ofp_version OVS_UNUSED,
6659 struct ofpbuf *out)
6660{
6661 struct ofpact_output_trunc *output_trunc;
6662
6663 output_trunc = ofpact_put_OUTPUT_TRUNC(out);
6664 output_trunc->max_len = ntohl(natrc->max_len);
6665 output_trunc->port = u16_to_ofp(ntohs(natrc->port));
6666
6667 if (output_trunc->max_len < ETH_HEADER_LEN) {
6668 return OFPERR_OFPBAC_BAD_ARGUMENT;
6669 }
6670 return 0;
6671}
6672
6673static void
6674encode_OUTPUT_TRUNC(const struct ofpact_output_trunc *output_trunc,
6675 enum ofp_version ofp_version OVS_UNUSED,
6676 struct ofpbuf *out)
6677{
6678 struct nx_action_output_trunc *natrc = put_NXAST_OUTPUT_TRUNC(out);
6679
6680 natrc->max_len = htonl(output_trunc->max_len);
6681 natrc->port = htons(ofp_to_u16(output_trunc->port));
6682}
6683
6684static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6685parse_OUTPUT_TRUNC(const char *arg,
6686 const struct ofputil_port_map *port_map OVS_UNUSED,
6687 struct ofpbuf *ofpacts OVS_UNUSED,
6688 enum ofputil_protocol *usable_protocols OVS_UNUSED)
aaca4fe0
WT
6689{
6690 /* Disable output_trunc parsing. Expose as output(port=N,max_len=M) and
6691 * reuse parse_OUTPUT to parse output_trunc action. */
6692 return xasprintf("unknown action %s", arg);
6693}
6694
6695static void
50f96b10
BP
6696format_OUTPUT_TRUNC(const struct ofpact_output_trunc *a,
6697 const struct ofputil_port_map *port_map, struct ds *s)
aaca4fe0 6698{
50f96b10
BP
6699 ds_put_format(s, "%soutput%s(port=", colors.special, colors.end);
6700 ofputil_format_port(a->port, port_map, s);
6701 ds_put_format(s, ",max_len=%"PRIu32")", a->max_len);
aaca4fe0
WT
6702}
6703
d4abaff5 6704\f
c2d936a4
BP
6705/* Meter instruction. */
6706
6707static void
6708encode_METER(const struct ofpact_meter *meter,
6709 enum ofp_version ofp_version, struct ofpbuf *out)
6710{
6711 if (ofp_version >= OFP13_VERSION) {
6712 instruction_put_OFPIT13_METER(out)->meter_id = htonl(meter->meter_id);
6713 }
6714}
6715
cab50449 6716static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6717parse_METER(char *arg,
6718 const struct ofputil_port_map *port_map OVS_UNUSED,
6719 struct ofpbuf *ofpacts,
c2d936a4
BP
6720 enum ofputil_protocol *usable_protocols)
6721{
6722 *usable_protocols &= OFPUTIL_P_OF13_UP;
6723 return str_to_u32(arg, &ofpact_put_METER(ofpacts)->meter_id);
6724}
6725
6726static void
50f96b10
BP
6727format_METER(const struct ofpact_meter *a,
6728 const struct ofputil_port_map *port_map OVS_UNUSED,
6729 struct ds *s)
c2d936a4 6730{
b1c5bf1f
QM
6731 ds_put_format(s, "%smeter:%s%"PRIu32,
6732 colors.param, colors.end, a->meter_id);
c2d936a4
BP
6733}
6734\f
6735/* Clear-Actions instruction. */
6736
6737static void
6738encode_CLEAR_ACTIONS(const struct ofpact_null *null OVS_UNUSED,
6739 enum ofp_version ofp_version OVS_UNUSED,
6740 struct ofpbuf *out OVS_UNUSED)
6741{
6742 if (ofp_version > OFP10_VERSION) {
6743 instruction_put_OFPIT11_CLEAR_ACTIONS(out);
6744 }
6745}
6746
cab50449 6747static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6748parse_CLEAR_ACTIONS(char *arg OVS_UNUSED,
6749 const struct ofputil_port_map *port_map OVS_UNUSED,
6750 struct ofpbuf *ofpacts,
c2d936a4
BP
6751 enum ofputil_protocol *usable_protocols OVS_UNUSED)
6752{
6753 ofpact_put_CLEAR_ACTIONS(ofpacts);
6754 return NULL;
6755}
6756
6757static void
50f96b10
BP
6758format_CLEAR_ACTIONS(const struct ofpact_null *a OVS_UNUSED,
6759 const struct ofputil_port_map *port_map OVS_UNUSED,
6760 struct ds *s)
c2d936a4 6761{
b1c5bf1f 6762 ds_put_format(s, "%sclear_actions%s", colors.value, colors.end);
c2d936a4
BP
6763}
6764\f
6765/* Write-Actions instruction. */
6766
6767static void
6768encode_WRITE_ACTIONS(const struct ofpact_nest *actions,
6769 enum ofp_version ofp_version, struct ofpbuf *out)
6770{
6771 if (ofp_version > OFP10_VERSION) {
6fd6ed71 6772 const size_t ofs = out->size;
c2d936a4
BP
6773
6774 instruction_put_OFPIT11_WRITE_ACTIONS(out);
6775 ofpacts_put_openflow_actions(actions->actions,
6776 ofpact_nest_get_action_len(actions),
6777 out, ofp_version);
6778 ofpacts_update_instruction_actions(out, ofs);
6779 }
6780}
6781
cab50449 6782static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6783parse_WRITE_ACTIONS(char *arg, const struct ofputil_port_map *port_map,
6784 struct ofpbuf *ofpacts,
c2d936a4
BP
6785 enum ofputil_protocol *usable_protocols)
6786{
d824b5b7 6787 size_t ofs = ofpacts_pull(ofpacts);
c2d936a4
BP
6788 struct ofpact_nest *on;
6789 char *error;
c2d936a4
BP
6790
6791 /* Add a Write-Actions instruction and then pull it off. */
6792 ofpact_put(ofpacts, OFPACT_WRITE_ACTIONS, sizeof *on);
6793 ofpbuf_pull(ofpacts, sizeof *on);
6794
6795 /* Parse nested actions.
6796 *
6797 * We pulled off "write-actions" and the previous actions because the
6798 * OFPACT_WRITE_ACTIONS is only partially constructed: its length is such
6799 * that it doesn't actually include the nested actions. That means that
6800 * ofpacts_parse() would reject them as being part of an Apply-Actions that
6801 * follows a Write-Actions, which is an invalid order. */
50f96b10 6802 error = ofpacts_parse(arg, port_map, ofpacts, usable_protocols, false,
d824b5b7 6803 OFPACT_WRITE_ACTIONS);
c2d936a4
BP
6804
6805 /* Put the Write-Actions back on and update its length. */
6806 on = ofpbuf_push_uninit(ofpacts, sizeof *on);
6fd6ed71 6807 on->ofpact.len = ofpacts->size;
c2d936a4
BP
6808
6809 /* Put any previous actions or instructions back on. */
6810 ofpbuf_push_uninit(ofpacts, ofs);
6811
6812 return error;
6813}
6814
6815static void
50f96b10
BP
6816format_WRITE_ACTIONS(const struct ofpact_nest *a,
6817 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4 6818{
b1c5bf1f 6819 ds_put_format(s, "%swrite_actions(%s", colors.paren, colors.end);
50f96b10 6820 ofpacts_format(a->actions, ofpact_nest_get_action_len(a), port_map, s);
b1c5bf1f 6821 ds_put_format(s, "%s)%s", colors.paren, colors.end);
c2d936a4
BP
6822}
6823\f
6824/* Action structure for NXAST_WRITE_METADATA.
6825 *
6826 * Modifies the 'mask' bits of the metadata value. */
6827struct nx_action_write_metadata {
6828 ovs_be16 type; /* OFPAT_VENDOR. */
6829 ovs_be16 len; /* Length is 32. */
6830 ovs_be32 vendor; /* NX_VENDOR_ID. */
6831 ovs_be16 subtype; /* NXAST_WRITE_METADATA. */
6832 uint8_t zeros[6]; /* Must be zero. */
6833 ovs_be64 metadata; /* Metadata register. */
6834 ovs_be64 mask; /* Metadata mask. */
6835};
6836OFP_ASSERT(sizeof(struct nx_action_write_metadata) == 32);
6837
6838static enum ofperr
6839decode_NXAST_RAW_WRITE_METADATA(const struct nx_action_write_metadata *nawm,
f3cd3ac7 6840 enum ofp_version ofp_version OVS_UNUSED,
c2d936a4
BP
6841 struct ofpbuf *out)
6842{
6843 struct ofpact_metadata *om;
6844
6845 if (!is_all_zeros(nawm->zeros, sizeof nawm->zeros)) {
6846 return OFPERR_NXBRC_MUST_BE_ZERO;
6847 }
6848
6849 om = ofpact_put_WRITE_METADATA(out);
6850 om->metadata = nawm->metadata;
6851 om->mask = nawm->mask;
6852
6853 return 0;
6854}
6855
6856static void
6857encode_WRITE_METADATA(const struct ofpact_metadata *metadata,
6858 enum ofp_version ofp_version, struct ofpbuf *out)
6859{
6860 if (ofp_version == OFP10_VERSION) {
6861 struct nx_action_write_metadata *nawm;
6862
6863 nawm = put_NXAST_WRITE_METADATA(out);
6864 nawm->metadata = metadata->metadata;
6865 nawm->mask = metadata->mask;
6866 } else {
6867 struct ofp11_instruction_write_metadata *oiwm;
6868
6869 oiwm = instruction_put_OFPIT11_WRITE_METADATA(out);
6870 oiwm->metadata = metadata->metadata;
6871 oiwm->metadata_mask = metadata->mask;
6872 }
6873}
6874
cab50449 6875static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6876parse_WRITE_METADATA(char *arg,
6877 const struct ofputil_port_map *port_map OVS_UNUSED,
6878 struct ofpbuf *ofpacts,
c2d936a4
BP
6879 enum ofputil_protocol *usable_protocols)
6880{
6881 struct ofpact_metadata *om;
6882 char *mask = strchr(arg, '/');
6883
6884 *usable_protocols &= OFPUTIL_P_NXM_OF11_UP;
6885
6886 om = ofpact_put_WRITE_METADATA(ofpacts);
6887 if (mask) {
6888 char *error;
6889
6890 *mask = '\0';
6891 error = str_to_be64(mask + 1, &om->mask);
6892 if (error) {
6893 return error;
6894 }
6895 } else {
6896 om->mask = OVS_BE64_MAX;
6897 }
6898
6899 return str_to_be64(arg, &om->metadata);
6900}
6901
6902static void
50f96b10
BP
6903format_WRITE_METADATA(const struct ofpact_metadata *a,
6904 const struct ofputil_port_map *port_map OVS_UNUSED,
6905 struct ds *s)
c2d936a4 6906{
b1c5bf1f
QM
6907 ds_put_format(s, "%swrite_metadata:%s%#"PRIx64,
6908 colors.param, colors.end, ntohll(a->metadata));
c2d936a4
BP
6909 if (a->mask != OVS_BE64_MAX) {
6910 ds_put_format(s, "/%#"PRIx64, ntohll(a->mask));
6911 }
4cceacb9 6912}
f25d0cf3 6913\f
c2d936a4 6914/* Goto-Table instruction. */
f25d0cf3
BP
6915
6916static void
c2d936a4
BP
6917encode_GOTO_TABLE(const struct ofpact_goto_table *goto_table,
6918 enum ofp_version ofp_version, struct ofpbuf *out)
f25d0cf3 6919{
c2d936a4
BP
6920 if (ofp_version == OFP10_VERSION) {
6921 struct nx_action_resubmit *nar;
f25d0cf3 6922
c2d936a4
BP
6923 nar = put_NXAST_RESUBMIT_TABLE(out);
6924 nar->table = goto_table->table_id;
6925 nar->in_port = htons(ofp_to_u16(OFPP_IN_PORT));
6926 } else {
6927 struct ofp11_instruction_goto_table *oigt;
6928
6929 oigt = instruction_put_OFPIT11_GOTO_TABLE(out);
6930 oigt->table_id = goto_table->table_id;
6931 memset(oigt->pad, 0, sizeof oigt->pad);
6932 }
6933}
6934
cab50449 6935static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
6936parse_GOTO_TABLE(char *arg,
6937 const struct ofputil_port_map *port_map OVS_UNUSED,
6938 struct ofpbuf *ofpacts,
c2d936a4
BP
6939 enum ofputil_protocol *usable_protocols OVS_UNUSED)
6940{
6941 struct ofpact_goto_table *ogt = ofpact_put_GOTO_TABLE(ofpacts);
6942 char *table_s = strsep(&arg, ",");
6943 if (!table_s || !table_s[0]) {
6944 return xstrdup("instruction goto-table needs table id");
6945 }
6946 return str_to_u8(table_s, "table", &ogt->table_id);
6947}
6948
6949static void
50f96b10
BP
6950format_GOTO_TABLE(const struct ofpact_goto_table *a,
6951 const struct ofputil_port_map *port_map OVS_UNUSED,
6952 struct ds *s)
c2d936a4 6953{
b1c5bf1f
QM
6954 ds_put_format(s, "%sgoto_table:%s%"PRIu8,
6955 colors.param, colors.end, a->table_id);
c2d936a4
BP
6956}
6957\f
6958static void
5ad4b3f8 6959log_bad_action(const struct ofp_action_header *actions, size_t actions_len,
c2d936a4
BP
6960 const struct ofp_action_header *bad_action, enum ofperr error)
6961{
6962 if (!VLOG_DROP_WARN(&rl)) {
6963 struct ds s;
6964
6965 ds_init(&s);
5ad4b3f8 6966 ds_put_hex_dump(&s, actions, actions_len, 0, false);
c2d936a4
BP
6967 VLOG_WARN("bad action at offset %#"PRIxPTR" (%s):\n%s",
6968 (char *)bad_action - (char *)actions,
6969 ofperr_get_name(error), ds_cstr(&s));
6970 ds_destroy(&s);
6971 }
6972}
6973
6974static enum ofperr
6975ofpacts_decode(const void *actions, size_t actions_len,
04f48a68 6976 enum ofp_version ofp_version,
5c7c16d8
YHW
6977 const struct vl_mff_map *vl_mff_map,
6978 uint64_t *ofpacts_tlv_bitmap, struct ofpbuf *ofpacts)
c2d936a4 6979{
0a2869d5 6980 struct ofpbuf openflow = ofpbuf_const_initializer(actions, actions_len);
6fd6ed71
PS
6981 while (openflow.size) {
6982 const struct ofp_action_header *action = openflow.data;
c2d936a4
BP
6983 enum ofp_raw_action_type raw;
6984 enum ofperr error;
6985 uint64_t arg;
6986
6987 error = ofpact_pull_raw(&openflow, ofp_version, &raw, &arg);
6988 if (!error) {
04f48a68 6989 error = ofpact_decode(action, raw, ofp_version, arg, vl_mff_map,
5c7c16d8 6990 ofpacts_tlv_bitmap, ofpacts);
c2d936a4
BP
6991 }
6992
6993 if (error) {
5ad4b3f8 6994 log_bad_action(actions, actions_len, action, error);
c2d936a4
BP
6995 return error;
6996 }
6997 }
c2d936a4
BP
6998 return 0;
6999}
7000
7001static enum ofperr
7002ofpacts_pull_openflow_actions__(struct ofpbuf *openflow,
7003 unsigned int actions_len,
7004 enum ofp_version version,
7005 uint32_t allowed_ovsinsts,
d824b5b7 7006 struct ofpbuf *ofpacts,
04f48a68 7007 enum ofpact_type outer_action,
5c7c16d8
YHW
7008 const struct vl_mff_map *vl_mff_map,
7009 uint64_t *ofpacts_tlv_bitmap)
c2d936a4
BP
7010{
7011 const struct ofp_action_header *actions;
9abca1e5 7012 size_t orig_size = ofpacts->size;
c2d936a4
BP
7013 enum ofperr error;
7014
c2d936a4
BP
7015 if (actions_len % OFP_ACTION_ALIGN != 0) {
7016 VLOG_WARN_RL(&rl, "OpenFlow message actions length %u is not a "
7017 "multiple of %d", actions_len, OFP_ACTION_ALIGN);
7018 return OFPERR_OFPBRC_BAD_LEN;
7019 }
7020
7021 actions = ofpbuf_try_pull(openflow, actions_len);
7022 if (actions == NULL) {
7023 VLOG_WARN_RL(&rl, "OpenFlow message actions length %u exceeds "
7024 "remaining message length (%"PRIu32")",
6fd6ed71 7025 actions_len, openflow->size);
c2d936a4
BP
7026 return OFPERR_OFPBRC_BAD_LEN;
7027 }
7028
5c7c16d8
YHW
7029 error = ofpacts_decode(actions, actions_len, version, vl_mff_map,
7030 ofpacts_tlv_bitmap, ofpacts);
c2d936a4 7031 if (error) {
9abca1e5 7032 ofpacts->size = orig_size;
c2d936a4
BP
7033 return error;
7034 }
7035
d824b5b7
JS
7036 error = ofpacts_verify(ofpacts->data, ofpacts->size, allowed_ovsinsts,
7037 outer_action);
c2d936a4 7038 if (error) {
9abca1e5 7039 ofpacts->size = orig_size;
c2d936a4
BP
7040 }
7041 return error;
7042}
7043
9abca1e5
BP
7044/* Attempts to convert 'actions_len' bytes of OpenFlow actions from the front
7045 * of 'openflow' into ofpacts. On success, appends the converted actions to
7046 * 'ofpacts'; on failure, 'ofpacts' is unchanged (but might be reallocated) .
c2d936a4
BP
7047 * Returns 0 if successful, otherwise an OpenFlow error.
7048 *
7049 * Actions are processed according to their OpenFlow version which
7050 * is provided in the 'version' parameter.
7051 *
7052 * In most places in OpenFlow, actions appear encapsulated in instructions, so
7053 * you should call ofpacts_pull_openflow_instructions() instead of this
7054 * function.
7055 *
5c7c16d8
YHW
7056 * 'vl_mff_map' and 'ofpacts_tlv_bitmap' are optional. If 'vl_mff_map' is
7057 * provided, it is used to get variable length mf_fields with configured
7058 * length in the actions. If an action uses a variable length mf_field,
7059 * 'ofpacts_tlv_bitmap' is updated accordingly for ref counting. If
7060 * 'vl_mff_map' is not provided, the default mf_fields with maximum length
7061 * will be used.
7062 *
c2d936a4
BP
7063 * The parsed actions are valid generically, but they may not be valid in a
7064 * specific context. For example, port numbers up to OFPP_MAX are valid
7065 * generically, but specific datapaths may only support port numbers in a
7066 * smaller range. Use ofpacts_check() to additional check whether actions are
7067 * valid in a specific context. */
7068enum ofperr
7069ofpacts_pull_openflow_actions(struct ofpbuf *openflow,
7070 unsigned int actions_len,
7071 enum ofp_version version,
04f48a68 7072 const struct vl_mff_map *vl_mff_map,
5c7c16d8 7073 uint64_t *ofpacts_tlv_bitmap,
c2d936a4
BP
7074 struct ofpbuf *ofpacts)
7075{
7076 return ofpacts_pull_openflow_actions__(openflow, actions_len, version,
7077 1u << OVSINST_OFPIT11_APPLY_ACTIONS,
5c7c16d8
YHW
7078 ofpacts, 0, vl_mff_map,
7079 ofpacts_tlv_bitmap);
c2d936a4
BP
7080}
7081\f
7082/* OpenFlow 1.1 actions. */
7083
7084
7085/* True if an action sets the value of a field
7086 * in a way that is compatibile with the action set.
1b0ee636 7087 * The field can be set via either a set or a move action.
c2d936a4
BP
7088 * False otherwise. */
7089static bool
1b0ee636 7090ofpact_is_set_or_move_action(const struct ofpact *a)
c2d936a4
BP
7091{
7092 switch (a->type) {
7093 case OFPACT_SET_FIELD:
1b0ee636 7094 case OFPACT_REG_MOVE:
c2d936a4
BP
7095 case OFPACT_SET_ETH_DST:
7096 case OFPACT_SET_ETH_SRC:
7097 case OFPACT_SET_IP_DSCP:
7098 case OFPACT_SET_IP_ECN:
7099 case OFPACT_SET_IP_TTL:
7100 case OFPACT_SET_IPV4_DST:
7101 case OFPACT_SET_IPV4_SRC:
7102 case OFPACT_SET_L4_DST_PORT:
7103 case OFPACT_SET_L4_SRC_PORT:
7104 case OFPACT_SET_MPLS_LABEL:
7105 case OFPACT_SET_MPLS_TC:
7106 case OFPACT_SET_MPLS_TTL:
7107 case OFPACT_SET_QUEUE:
7108 case OFPACT_SET_TUNNEL:
7109 case OFPACT_SET_VLAN_PCP:
7110 case OFPACT_SET_VLAN_VID:
f839892a
JS
7111 case OFPACT_ENCAP:
7112 case OFPACT_DECAP:
c2d936a4
BP
7113 return true;
7114 case OFPACT_BUNDLE:
7115 case OFPACT_CLEAR_ACTIONS:
07659514 7116 case OFPACT_CT:
72fe7578 7117 case OFPACT_CT_CLEAR:
7ae62a67 7118 case OFPACT_CLONE:
9ac0aada 7119 case OFPACT_NAT:
c2d936a4
BP
7120 case OFPACT_CONTROLLER:
7121 case OFPACT_DEC_MPLS_TTL:
7122 case OFPACT_DEC_TTL:
7123 case OFPACT_ENQUEUE:
7124 case OFPACT_EXIT:
e672ff9b 7125 case OFPACT_UNROLL_XLATE:
c2d936a4
BP
7126 case OFPACT_FIN_TIMEOUT:
7127 case OFPACT_GOTO_TABLE:
7128 case OFPACT_GROUP:
7129 case OFPACT_LEARN:
18080541 7130 case OFPACT_CONJUNCTION:
c2d936a4
BP
7131 case OFPACT_METER:
7132 case OFPACT_MULTIPATH:
7133 case OFPACT_NOTE:
7134 case OFPACT_OUTPUT:
7135 case OFPACT_OUTPUT_REG:
aaca4fe0 7136 case OFPACT_OUTPUT_TRUNC:
c2d936a4
BP
7137 case OFPACT_POP_MPLS:
7138 case OFPACT_POP_QUEUE:
7139 case OFPACT_PUSH_MPLS:
7140 case OFPACT_PUSH_VLAN:
c2d936a4
BP
7141 case OFPACT_RESUBMIT:
7142 case OFPACT_SAMPLE:
7143 case OFPACT_STACK_POP:
7144 case OFPACT_STACK_PUSH:
7145 case OFPACT_STRIP_VLAN:
7146 case OFPACT_WRITE_ACTIONS:
7147 case OFPACT_WRITE_METADATA:
d4abaff5 7148 case OFPACT_DEBUG_RECIRC:
c2d936a4
BP
7149 return false;
7150 default:
7151 OVS_NOT_REACHED();
7152 }
7153}
7154
7155/* True if an action is allowed in the action set.
7156 * False otherwise. */
7157static bool
7158ofpact_is_allowed_in_actions_set(const struct ofpact *a)
7159{
7160 switch (a->type) {
7161 case OFPACT_DEC_MPLS_TTL:
7162 case OFPACT_DEC_TTL:
7163 case OFPACT_GROUP:
7164 case OFPACT_OUTPUT:
aaca4fe0 7165 case OFPACT_OUTPUT_TRUNC:
c2d936a4
BP
7166 case OFPACT_POP_MPLS:
7167 case OFPACT_PUSH_MPLS:
7168 case OFPACT_PUSH_VLAN:
1b0ee636 7169 case OFPACT_REG_MOVE:
c2d936a4
BP
7170 case OFPACT_SET_FIELD:
7171 case OFPACT_SET_ETH_DST:
7172 case OFPACT_SET_ETH_SRC:
7173 case OFPACT_SET_IP_DSCP:
7174 case OFPACT_SET_IP_ECN:
7175 case OFPACT_SET_IP_TTL:
7176 case OFPACT_SET_IPV4_DST:
7177 case OFPACT_SET_IPV4_SRC:
7178 case OFPACT_SET_L4_DST_PORT:
7179 case OFPACT_SET_L4_SRC_PORT:
7180 case OFPACT_SET_MPLS_LABEL:
7181 case OFPACT_SET_MPLS_TC:
7182 case OFPACT_SET_MPLS_TTL:
7183 case OFPACT_SET_QUEUE:
7184 case OFPACT_SET_TUNNEL:
7185 case OFPACT_SET_VLAN_PCP:
7186 case OFPACT_SET_VLAN_VID:
7187 case OFPACT_STRIP_VLAN:
f839892a
JS
7188 case OFPACT_ENCAP:
7189 case OFPACT_DECAP:
c2d936a4
BP
7190 return true;
7191
7192 /* In general these actions are excluded because they are not part of
7193 * the OpenFlow specification nor map to actions that are defined in
7194 * the specification. Thus the order in which they should be applied
7195 * in the action set is undefined. */
7196 case OFPACT_BUNDLE:
7ae62a67 7197 case OFPACT_CLONE:
c2d936a4 7198 case OFPACT_CONTROLLER:
07659514 7199 case OFPACT_CT:
72fe7578 7200 case OFPACT_CT_CLEAR:
9ac0aada 7201 case OFPACT_NAT:
c2d936a4
BP
7202 case OFPACT_ENQUEUE:
7203 case OFPACT_EXIT:
e672ff9b 7204 case OFPACT_UNROLL_XLATE:
c2d936a4
BP
7205 case OFPACT_FIN_TIMEOUT:
7206 case OFPACT_LEARN:
18080541 7207 case OFPACT_CONJUNCTION:
c2d936a4
BP
7208 case OFPACT_MULTIPATH:
7209 case OFPACT_NOTE:
7210 case OFPACT_OUTPUT_REG:
7211 case OFPACT_POP_QUEUE:
c2d936a4
BP
7212 case OFPACT_RESUBMIT:
7213 case OFPACT_SAMPLE:
7214 case OFPACT_STACK_POP:
7215 case OFPACT_STACK_PUSH:
d4abaff5 7216 case OFPACT_DEBUG_RECIRC:
c2d936a4
BP
7217
7218 /* The action set may only include actions and thus
7219 * may not include any instructions */
7220 case OFPACT_CLEAR_ACTIONS:
7221 case OFPACT_GOTO_TABLE:
7222 case OFPACT_METER:
7223 case OFPACT_WRITE_ACTIONS:
7224 case OFPACT_WRITE_METADATA:
7225 return false;
7226 default:
7227 OVS_NOT_REACHED();
7228 }
f25d0cf3
BP
7229}
7230
c2d936a4 7231/* Append ofpact 'a' onto the tail of 'out' */
f25d0cf3 7232static void
c2d936a4 7233ofpact_copy(struct ofpbuf *out, const struct ofpact *a)
f25d0cf3 7234{
c2d936a4 7235 ofpbuf_put(out, a, OFPACT_ALIGN(a->len));
f25d0cf3
BP
7236}
7237
c2d936a4
BP
7238/* Copies the last ofpact whose type is 'filter' from 'in' to 'out'. */
7239static bool
7240ofpacts_copy_last(struct ofpbuf *out, const struct ofpbuf *in,
7241 enum ofpact_type filter)
f25d0cf3 7242{
c2d936a4
BP
7243 const struct ofpact *target;
7244 const struct ofpact *a;
f25d0cf3 7245
c2d936a4 7246 target = NULL;
6fd6ed71 7247 OFPACT_FOR_EACH (a, in->data, in->size) {
c2d936a4
BP
7248 if (a->type == filter) {
7249 target = a;
7250 }
7251 }
7252 if (target) {
7253 ofpact_copy(out, target);
f25d0cf3 7254 }
c2d936a4 7255 return target != NULL;
f25d0cf3
BP
7256}
7257
c2d936a4
BP
7258/* Append all ofpacts, for which 'filter' returns true, from 'in' to 'out'.
7259 * The order of appended ofpacts is preserved between 'in' and 'out' */
4cceacb9 7260static void
c2d936a4
BP
7261ofpacts_copy_all(struct ofpbuf *out, const struct ofpbuf *in,
7262 bool (*filter)(const struct ofpact *))
4cceacb9 7263{
c2d936a4 7264 const struct ofpact *a;
4cceacb9 7265
6fd6ed71 7266 OFPACT_FOR_EACH (a, in->data, in->size) {
c2d936a4
BP
7267 if (filter(a)) {
7268 ofpact_copy(out, a);
7269 }
7270 }
4cceacb9
JS
7271}
7272
c2d936a4
BP
7273/* Reads 'action_set', which contains ofpacts accumulated by
7274 * OFPACT_WRITE_ACTIONS instructions, and writes equivalent actions to be
7275 * executed directly into 'action_list'. (These names correspond to the
7276 * "Action Set" and "Action List" terms used in OpenFlow 1.1+.)
7277 *
7278 * In general this involves appending the last instance of each action that is
e672ff9b 7279 * admissible in the action set in the order described in the OpenFlow
c2d936a4
BP
7280 * specification.
7281 *
7282 * Exceptions:
7283 * + output action is only appended if no group action was present in 'in'.
7284 * + As a simplification all set actions are copied in the order the are
7285 * provided in 'in' as many set actions applied to a field has the same
7286 * affect as only applying the last action that sets a field and
7287 * duplicates are removed by do_xlate_actions().
7288 * This has an unwanted side-effect of compsoting multiple
7289 * LOAD_REG actions that touch different regions of the same field. */
7290void
7291ofpacts_execute_action_set(struct ofpbuf *action_list,
7292 const struct ofpbuf *action_set)
f25d0cf3 7293{
c2d936a4
BP
7294 /* The OpenFlow spec "Action Set" section specifies this order. */
7295 ofpacts_copy_last(action_list, action_set, OFPACT_STRIP_VLAN);
7296 ofpacts_copy_last(action_list, action_set, OFPACT_POP_MPLS);
f839892a
JS
7297 ofpacts_copy_last(action_list, action_set, OFPACT_DECAP);
7298 ofpacts_copy_last(action_list, action_set, OFPACT_ENCAP);
c2d936a4
BP
7299 ofpacts_copy_last(action_list, action_set, OFPACT_PUSH_MPLS);
7300 ofpacts_copy_last(action_list, action_set, OFPACT_PUSH_VLAN);
7301 ofpacts_copy_last(action_list, action_set, OFPACT_DEC_TTL);
7302 ofpacts_copy_last(action_list, action_set, OFPACT_DEC_MPLS_TTL);
1b0ee636 7303 ofpacts_copy_all(action_list, action_set, ofpact_is_set_or_move_action);
c2d936a4 7304 ofpacts_copy_last(action_list, action_set, OFPACT_SET_QUEUE);
f25d0cf3 7305
c2d936a4
BP
7306 /* If both OFPACT_GROUP and OFPACT_OUTPUT are present, OpenFlow says that
7307 * we should execute only OFPACT_GROUP.
7308 *
7309 * If neither OFPACT_GROUP nor OFPACT_OUTPUT is present, then we can drop
7310 * all the actions because there's no point in modifying a packet that will
7311 * not be sent anywhere. */
7312 if (!ofpacts_copy_last(action_list, action_set, OFPACT_GROUP) &&
2e34a6a3 7313 !ofpacts_copy_last(action_list, action_set, OFPACT_OUTPUT) &&
2c66ebe4
JR
7314 !ofpacts_copy_last(action_list, action_set, OFPACT_RESUBMIT) &&
7315 !ofpacts_copy_last(action_list, action_set, OFPACT_CT)) {
c2d936a4 7316 ofpbuf_clear(action_list);
f25d0cf3 7317 }
f25d0cf3
BP
7318}
7319
f25d0cf3 7320
c2d936a4
BP
7321static enum ofperr
7322ofpacts_decode_for_action_set(const struct ofp_action_header *in,
7323 size_t n_in, enum ofp_version version,
04f48a68 7324 const struct vl_mff_map *vl_mff_map,
5c7c16d8 7325 uint64_t *ofpacts_tlv_bitmap,
c2d936a4 7326 struct ofpbuf *out)
c2d967a5 7327{
c2d936a4
BP
7328 enum ofperr error;
7329 struct ofpact *a;
6fd6ed71 7330 size_t start = out->size;
c2d967a5 7331
5c7c16d8
YHW
7332 error = ofpacts_decode(in, n_in, version, vl_mff_map, ofpacts_tlv_bitmap,
7333 out);
c2d967a5 7334
c2d936a4
BP
7335 if (error) {
7336 return error;
7337 }
7338
6fd6ed71 7339 OFPACT_FOR_EACH (a, ofpact_end(out->data, start), out->size - start) {
c2d936a4
BP
7340 if (!ofpact_is_allowed_in_actions_set(a)) {
7341 VLOG_WARN_RL(&rl, "disallowed action in action set");
7342 return OFPERR_OFPBAC_BAD_TYPE;
c2d967a5
MM
7343 }
7344 }
c2d936a4
BP
7345
7346 return 0;
c2d967a5 7347}
c2d936a4
BP
7348\f
7349/* OpenFlow 1.1 instructions. */
c2d967a5 7350
c2d936a4
BP
7351struct instruction_type_info {
7352 enum ovs_instruction_type type;
7353 const char *name;
7354};
7355
7356static const struct instruction_type_info inst_info[] = {
7357#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) {OVSINST_##ENUM, NAME},
7358OVS_INSTRUCTIONS
7359#undef DEFINE_INST
7360};
7361
7362const char *
7363ovs_instruction_name_from_type(enum ovs_instruction_type type)
f25d0cf3 7364{
3b048d73 7365 return type < ARRAY_SIZE(inst_info) ? inst_info[type].name : NULL;
f25d0cf3
BP
7366}
7367
c2d936a4
BP
7368int
7369ovs_instruction_type_from_name(const char *name)
29089a54 7370{
c2d936a4
BP
7371 const struct instruction_type_info *p;
7372 for (p = inst_info; p < &inst_info[ARRAY_SIZE(inst_info)]; p++) {
7373 if (!strcasecmp(name, p->name)) {
7374 return p->type;
7375 }
7376 }
7377 return -1;
29089a54
RL
7378}
7379
c2d936a4
BP
7380enum ovs_instruction_type
7381ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
f25d0cf3 7382{
c2d936a4
BP
7383 switch (type) {
7384 case OFPACT_METER:
7385 return OVSINST_OFPIT13_METER;
7386 case OFPACT_CLEAR_ACTIONS:
7387 return OVSINST_OFPIT11_CLEAR_ACTIONS;
7388 case OFPACT_WRITE_ACTIONS:
7389 return OVSINST_OFPIT11_WRITE_ACTIONS;
7390 case OFPACT_WRITE_METADATA:
7391 return OVSINST_OFPIT11_WRITE_METADATA;
7392 case OFPACT_GOTO_TABLE:
7393 return OVSINST_OFPIT11_GOTO_TABLE;
7394 case OFPACT_OUTPUT:
7395 case OFPACT_GROUP:
7ae62a67 7396 case OFPACT_CLONE:
f25d0cf3 7397 case OFPACT_CONTROLLER:
c2d936a4 7398 case OFPACT_ENQUEUE:
f25d0cf3 7399 case OFPACT_OUTPUT_REG:
aaca4fe0 7400 case OFPACT_OUTPUT_TRUNC:
f25d0cf3 7401 case OFPACT_BUNDLE:
c2d936a4
BP
7402 case OFPACT_SET_VLAN_VID:
7403 case OFPACT_SET_VLAN_PCP:
7404 case OFPACT_STRIP_VLAN:
7405 case OFPACT_PUSH_VLAN:
7406 case OFPACT_SET_ETH_SRC:
7407 case OFPACT_SET_ETH_DST:
7408 case OFPACT_SET_IPV4_SRC:
7409 case OFPACT_SET_IPV4_DST:
7410 case OFPACT_SET_IP_DSCP:
7411 case OFPACT_SET_IP_ECN:
7412 case OFPACT_SET_IP_TTL:
7413 case OFPACT_SET_L4_SRC_PORT:
7414 case OFPACT_SET_L4_DST_PORT:
f25d0cf3 7415 case OFPACT_REG_MOVE:
c2d936a4 7416 case OFPACT_SET_FIELD:
bd85dac1 7417 case OFPACT_STACK_PUSH:
bd85dac1 7418 case OFPACT_STACK_POP:
f25d0cf3 7419 case OFPACT_DEC_TTL:
097d4939 7420 case OFPACT_SET_MPLS_LABEL:
097d4939 7421 case OFPACT_SET_MPLS_TC:
0f3f3c3d 7422 case OFPACT_SET_MPLS_TTL:
b676167a 7423 case OFPACT_DEC_MPLS_TTL:
c2d936a4
BP
7424 case OFPACT_PUSH_MPLS:
7425 case OFPACT_POP_MPLS:
f25d0cf3 7426 case OFPACT_SET_TUNNEL:
c2d936a4
BP
7427 case OFPACT_SET_QUEUE:
7428 case OFPACT_POP_QUEUE:
7429 case OFPACT_FIN_TIMEOUT:
7430 case OFPACT_RESUBMIT:
7431 case OFPACT_LEARN:
18080541 7432 case OFPACT_CONJUNCTION:
c2d936a4
BP
7433 case OFPACT_MULTIPATH:
7434 case OFPACT_NOTE:
7435 case OFPACT_EXIT:
e672ff9b 7436 case OFPACT_UNROLL_XLATE:
c2d936a4 7437 case OFPACT_SAMPLE:
d4abaff5 7438 case OFPACT_DEBUG_RECIRC:
07659514 7439 case OFPACT_CT:
72fe7578 7440 case OFPACT_CT_CLEAR:
9ac0aada 7441 case OFPACT_NAT:
f839892a
JS
7442 case OFPACT_ENCAP:
7443 case OFPACT_DECAP:
c2d936a4
BP
7444 default:
7445 return OVSINST_OFPIT11_APPLY_ACTIONS;
7446 }
7447}
7448
7449enum ofperr
7450ovs_instruction_type_from_inst_type(enum ovs_instruction_type *instruction_type,
7451 const uint16_t inst_type)
7452{
7453 switch (inst_type) {
7454
7455#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) \
7456 case ENUM: \
7457 *instruction_type = OVSINST_##ENUM; \
7458 return 0;
7459OVS_INSTRUCTIONS
7460#undef DEFINE_INST
7461
7462 default:
7463 return OFPERR_OFPBIC_UNKNOWN_INST;
7464 }
7465}
7466
7467/* Two-way translation between OVS's internal "OVSINST_*" representation of
7468 * instructions and the "OFPIT_*" representation used in OpenFlow. */
7469struct ovsinst_map {
7470 enum ovs_instruction_type ovsinst; /* Internal name for instruction. */
7471 int ofpit; /* OFPIT_* number from OpenFlow spec. */
7472};
7473
7474static const struct ovsinst_map *
7475get_ovsinst_map(enum ofp_version version)
7476{
7477 /* OpenFlow 1.1 and 1.2 instructions. */
7478 static const struct ovsinst_map of11[] = {
7479 { OVSINST_OFPIT11_GOTO_TABLE, 1 },
7480 { OVSINST_OFPIT11_WRITE_METADATA, 2 },
7481 { OVSINST_OFPIT11_WRITE_ACTIONS, 3 },
7482 { OVSINST_OFPIT11_APPLY_ACTIONS, 4 },
7483 { OVSINST_OFPIT11_CLEAR_ACTIONS, 5 },
7484 { 0, -1 },
7485 };
f25d0cf3 7486
c2d936a4
BP
7487 /* OpenFlow 1.3+ instructions. */
7488 static const struct ovsinst_map of13[] = {
7489 { OVSINST_OFPIT11_GOTO_TABLE, 1 },
7490 { OVSINST_OFPIT11_WRITE_METADATA, 2 },
7491 { OVSINST_OFPIT11_WRITE_ACTIONS, 3 },
7492 { OVSINST_OFPIT11_APPLY_ACTIONS, 4 },
7493 { OVSINST_OFPIT11_CLEAR_ACTIONS, 5 },
7494 { OVSINST_OFPIT13_METER, 6 },
7495 { 0, -1 },
7496 };
4cceacb9 7497
c2d936a4
BP
7498 return version < OFP13_VERSION ? of11 : of13;
7499}
f25d0cf3 7500
c2d936a4
BP
7501/* Converts 'ovsinst_bitmap', a bitmap whose bits correspond to OVSINST_*
7502 * values, into a bitmap of instructions suitable for OpenFlow 'version'
7503 * (OFP11_VERSION or later), and returns the result. */
7504ovs_be32
7505ovsinst_bitmap_to_openflow(uint32_t ovsinst_bitmap, enum ofp_version version)
7506{
7507 uint32_t ofpit_bitmap = 0;
7508 const struct ovsinst_map *x;
f25d0cf3 7509
c2d936a4
BP
7510 for (x = get_ovsinst_map(version); x->ofpit >= 0; x++) {
7511 if (ovsinst_bitmap & (1u << x->ovsinst)) {
7512 ofpit_bitmap |= 1u << x->ofpit;
7513 }
7514 }
7515 return htonl(ofpit_bitmap);
7516}
f25d0cf3 7517
c2d936a4
BP
7518/* Converts 'ofpit_bitmap', a bitmap of instructions from an OpenFlow message
7519 * with the given 'version' (OFP11_VERSION or later) into a bitmap whose bits
7520 * correspond to OVSINST_* values, and returns the result. */
7521uint32_t
7522ovsinst_bitmap_from_openflow(ovs_be32 ofpit_bitmap, enum ofp_version version)
7523{
7524 uint32_t ovsinst_bitmap = 0;
7525 const struct ovsinst_map *x;
f25d0cf3 7526
c2d936a4
BP
7527 for (x = get_ovsinst_map(version); x->ofpit >= 0; x++) {
7528 if (ofpit_bitmap & htonl(1u << x->ofpit)) {
7529 ovsinst_bitmap |= 1u << x->ovsinst;
7530 }
7531 }
7532 return ovsinst_bitmap;
7533}
f25d0cf3 7534
c2d936a4
BP
7535static inline struct ofp11_instruction *
7536instruction_next(const struct ofp11_instruction *inst)
7537{
7538 return ((struct ofp11_instruction *) (void *)
7539 ((uint8_t *) inst + ntohs(inst->len)));
7540}
f25d0cf3 7541
c2d936a4
BP
7542static inline bool
7543instruction_is_valid(const struct ofp11_instruction *inst,
7544 size_t n_instructions)
7545{
7546 uint16_t len = ntohs(inst->len);
7547 return (!(len % OFP11_INSTRUCTION_ALIGN)
7548 && len >= sizeof *inst
7549 && len / sizeof *inst <= n_instructions);
7550}
f25d0cf3 7551
c2d936a4
BP
7552/* This macro is careful to check for instructions with bad lengths. */
7553#define INSTRUCTION_FOR_EACH(ITER, LEFT, INSTRUCTIONS, N_INSTRUCTIONS) \
7554 for ((ITER) = (INSTRUCTIONS), (LEFT) = (N_INSTRUCTIONS); \
7555 (LEFT) > 0 && instruction_is_valid(ITER, LEFT); \
7556 ((LEFT) -= (ntohs((ITER)->len) \
7557 / sizeof(struct ofp11_instruction)), \
7558 (ITER) = instruction_next(ITER)))
f25d0cf3 7559
c2d936a4
BP
7560static enum ofperr
7561decode_openflow11_instruction(const struct ofp11_instruction *inst,
7562 enum ovs_instruction_type *type)
7563{
7564 uint16_t len = ntohs(inst->len);
b02475c5 7565
c2d936a4
BP
7566 switch (inst->type) {
7567 case CONSTANT_HTONS(OFPIT11_EXPERIMENTER):
7568 return OFPERR_OFPBIC_BAD_EXPERIMENTER;
b02475c5 7569
c2d936a4
BP
7570#define DEFINE_INST(ENUM, STRUCT, EXTENSIBLE, NAME) \
7571 case CONSTANT_HTONS(ENUM): \
7572 if (EXTENSIBLE \
7573 ? len >= sizeof(struct STRUCT) \
7574 : len == sizeof(struct STRUCT)) { \
7575 *type = OVSINST_##ENUM; \
7576 return 0; \
7577 } else { \
7578 return OFPERR_OFPBIC_BAD_LEN; \
7579 }
7580OVS_INSTRUCTIONS
7581#undef DEFINE_INST
29089a54 7582
c2d936a4
BP
7583 default:
7584 return OFPERR_OFPBIC_UNKNOWN_INST;
f25d0cf3
BP
7585 }
7586}
f25d0cf3 7587
c2d936a4
BP
7588static enum ofperr
7589decode_openflow11_instructions(const struct ofp11_instruction insts[],
7590 size_t n_insts,
7591 const struct ofp11_instruction *out[])
f25d0cf3 7592{
c2d936a4
BP
7593 const struct ofp11_instruction *inst;
7594 size_t left;
f25d0cf3 7595
c2d936a4
BP
7596 memset(out, 0, N_OVS_INSTRUCTIONS * sizeof *out);
7597 INSTRUCTION_FOR_EACH (inst, left, insts, n_insts) {
7598 enum ovs_instruction_type type;
7599 enum ofperr error;
f25d0cf3 7600
c2d936a4
BP
7601 error = decode_openflow11_instruction(inst, &type);
7602 if (error) {
7603 return error;
7604 }
f25d0cf3 7605
c2d936a4
BP
7606 if (out[type]) {
7607 return OFPERR_OFPBIC_DUP_INST;
7608 }
7609 out[type] = inst;
7610 }
7611
7612 if (left) {
7613 VLOG_WARN_RL(&rl, "bad instruction format at offset %"PRIuSIZE,
7614 (n_insts - left) * sizeof *inst);
7615 return OFPERR_OFPBIC_BAD_LEN;
7616 }
7617 return 0;
f25d0cf3
BP
7618}
7619
7620static void
c2d936a4
BP
7621get_actions_from_instruction(const struct ofp11_instruction *inst,
7622 const struct ofp_action_header **actions,
7623 size_t *actions_len)
f25d0cf3 7624{
c2d936a4
BP
7625 *actions = ALIGNED_CAST(const struct ofp_action_header *, inst + 1);
7626 *actions_len = ntohs(inst->len) - sizeof *inst;
7627}
f25d0cf3 7628
c2d936a4
BP
7629enum ofperr
7630ofpacts_pull_openflow_instructions(struct ofpbuf *openflow,
7631 unsigned int instructions_len,
7632 enum ofp_version version,
04f48a68 7633 const struct vl_mff_map *vl_mff_map,
5c7c16d8 7634 uint64_t *ofpacts_tlv_bitmap,
c2d936a4
BP
7635 struct ofpbuf *ofpacts)
7636{
7637 const struct ofp11_instruction *instructions;
7638 const struct ofp11_instruction *insts[N_OVS_INSTRUCTIONS];
7639 enum ofperr error;
f25d0cf3 7640
9abca1e5 7641 ofpbuf_clear(ofpacts);
c2d936a4
BP
7642 if (version == OFP10_VERSION) {
7643 return ofpacts_pull_openflow_actions__(openflow, instructions_len,
7644 version,
7645 (1u << N_OVS_INSTRUCTIONS) - 1,
5c7c16d8
YHW
7646 ofpacts, 0, vl_mff_map,
7647 ofpacts_tlv_bitmap);
c2d936a4 7648 }
f25d0cf3 7649
c2d936a4
BP
7650 if (instructions_len % OFP11_INSTRUCTION_ALIGN != 0) {
7651 VLOG_WARN_RL(&rl, "OpenFlow message instructions length %u is not a "
7652 "multiple of %d",
7653 instructions_len, OFP11_INSTRUCTION_ALIGN);
7654 error = OFPERR_OFPBIC_BAD_LEN;
7655 goto exit;
7656 }
f25d0cf3 7657
c2d936a4
BP
7658 instructions = ofpbuf_try_pull(openflow, instructions_len);
7659 if (instructions == NULL) {
7660 VLOG_WARN_RL(&rl, "OpenFlow message instructions length %u exceeds "
7661 "remaining message length (%"PRIu32")",
6fd6ed71 7662 instructions_len, openflow->size);
c2d936a4
BP
7663 error = OFPERR_OFPBIC_BAD_LEN;
7664 goto exit;
7665 }
f25d0cf3 7666
c2d936a4
BP
7667 error = decode_openflow11_instructions(
7668 instructions, instructions_len / OFP11_INSTRUCTION_ALIGN,
7669 insts);
7670 if (error) {
7671 goto exit;
7672 }
f25d0cf3 7673
c2d936a4
BP
7674 if (insts[OVSINST_OFPIT13_METER]) {
7675 const struct ofp13_instruction_meter *oim;
7676 struct ofpact_meter *om;
f25d0cf3 7677
c2d936a4
BP
7678 oim = ALIGNED_CAST(const struct ofp13_instruction_meter *,
7679 insts[OVSINST_OFPIT13_METER]);
f25d0cf3 7680
c2d936a4
BP
7681 om = ofpact_put_METER(ofpacts);
7682 om->meter_id = ntohl(oim->meter_id);
076caa2f 7683 om->provider_meter_id = UINT32_MAX; /* No provider meter ID. */
c2d936a4
BP
7684 }
7685 if (insts[OVSINST_OFPIT11_APPLY_ACTIONS]) {
7686 const struct ofp_action_header *actions;
7687 size_t actions_len;
f25d0cf3 7688
c2d936a4
BP
7689 get_actions_from_instruction(insts[OVSINST_OFPIT11_APPLY_ACTIONS],
7690 &actions, &actions_len);
04f48a68 7691 error = ofpacts_decode(actions, actions_len, version, vl_mff_map,
5c7c16d8 7692 ofpacts_tlv_bitmap, ofpacts);
c2d936a4
BP
7693 if (error) {
7694 goto exit;
7695 }
7696 }
7697 if (insts[OVSINST_OFPIT11_CLEAR_ACTIONS]) {
7698 instruction_get_OFPIT11_CLEAR_ACTIONS(
7699 insts[OVSINST_OFPIT11_CLEAR_ACTIONS]);
7700 ofpact_put_CLEAR_ACTIONS(ofpacts);
7701 }
7702 if (insts[OVSINST_OFPIT11_WRITE_ACTIONS]) {
7703 struct ofpact_nest *on;
7704 const struct ofp_action_header *actions;
7705 size_t actions_len;
2bd318de 7706 size_t start = ofpacts->size;
255a54ea
BP
7707 ofpact_put(ofpacts, OFPACT_WRITE_ACTIONS,
7708 offsetof(struct ofpact_nest, actions));
c2d936a4
BP
7709 get_actions_from_instruction(insts[OVSINST_OFPIT11_WRITE_ACTIONS],
7710 &actions, &actions_len);
7711 error = ofpacts_decode_for_action_set(actions, actions_len,
5c7c16d8
YHW
7712 version, vl_mff_map,
7713 ofpacts_tlv_bitmap, ofpacts);
c2d936a4
BP
7714 if (error) {
7715 goto exit;
7716 }
7717 on = ofpbuf_at_assert(ofpacts, start, sizeof *on);
6fd6ed71 7718 on->ofpact.len = ofpacts->size - start;
c2d936a4
BP
7719 }
7720 if (insts[OVSINST_OFPIT11_WRITE_METADATA]) {
7721 const struct ofp11_instruction_write_metadata *oiwm;
7722 struct ofpact_metadata *om;
ca287d20 7723
c2d936a4
BP
7724 oiwm = ALIGNED_CAST(const struct ofp11_instruction_write_metadata *,
7725 insts[OVSINST_OFPIT11_WRITE_METADATA]);
8dd54666 7726
c2d936a4
BP
7727 om = ofpact_put_WRITE_METADATA(ofpacts);
7728 om->metadata = oiwm->metadata;
7729 om->mask = oiwm->metadata_mask;
7730 }
7731 if (insts[OVSINST_OFPIT11_GOTO_TABLE]) {
7732 const struct ofp11_instruction_goto_table *oigt;
7733 struct ofpact_goto_table *ogt;
7395c052 7734
c2d936a4
BP
7735 oigt = instruction_get_OFPIT11_GOTO_TABLE(
7736 insts[OVSINST_OFPIT11_GOTO_TABLE]);
7737 ogt = ofpact_put_GOTO_TABLE(ofpacts);
7738 ogt->table_id = oigt->table_id;
7739 }
e3f8f887 7740
6fd6ed71 7741 error = ofpacts_verify(ofpacts->data, ofpacts->size,
d824b5b7 7742 (1u << N_OVS_INSTRUCTIONS) - 1, 0);
c2d936a4
BP
7743exit:
7744 if (error) {
7745 ofpbuf_clear(ofpacts);
f25d0cf3 7746 }
c2d936a4 7747 return error;
f25d0cf3 7748}
d01c980f 7749
c2d936a4
BP
7750/* Update the length of the instruction that begins at offset 'ofs' within
7751 * 'openflow' and contains nested actions that extend to the end of 'openflow'.
7752 * If the instruction contains no nested actions, deletes it entirely. */
d01c980f 7753static void
c2d936a4 7754ofpacts_update_instruction_actions(struct ofpbuf *openflow, size_t ofs)
d01c980f 7755{
c2d936a4 7756 struct ofp11_instruction_actions *oia;
d01c980f 7757
c2d936a4 7758 oia = ofpbuf_at_assert(openflow, ofs, sizeof *oia);
6fd6ed71
PS
7759 if (openflow->size > ofs + sizeof *oia) {
7760 oia->len = htons(openflow->size - ofs);
c2d936a4 7761 } else {
6fd6ed71 7762 openflow->size = ofs;
c2d936a4 7763 }
d01c980f 7764}
c2d936a4
BP
7765\f
7766/* Checks that 'port' is a valid output port for OFPACT_OUTPUT, given that the
7767 * switch will never have more than 'max_ports' ports. Returns 0 if 'port' is
7768 * valid, otherwise an OpenFlow error code. */
7769enum ofperr
7770ofpact_check_output_port(ofp_port_t port, ofp_port_t max_ports)
99086062 7771{
c2d936a4
BP
7772 switch (port) {
7773 case OFPP_IN_PORT:
7774 case OFPP_TABLE:
7775 case OFPP_NORMAL:
7776 case OFPP_FLOOD:
7777 case OFPP_ALL:
7778 case OFPP_CONTROLLER:
c2d936a4
BP
7779 case OFPP_LOCAL:
7780 return 0;
7781
13d2c689
BP
7782 case OFPP_NONE:
7783 return OFPERR_OFPBAC_BAD_OUT_PORT;
7784
c2d936a4
BP
7785 default:
7786 if (ofp_to_u16(port) < ofp_to_u16(max_ports)) {
7787 return 0;
7788 }
7789 return OFPERR_OFPBAC_BAD_OUT_PORT;
99086062
BP
7790 }
7791}
7792
c2d936a4
BP
7793/* Removes the protocols that require consistency between match and actions
7794 * (that's everything but OpenFlow 1.0) from '*usable_protocols'.
7795 *
7796 * (An example of an inconsistency between match and actions is a flow that
7797 * does not match on an MPLS Ethertype but has an action that pops an MPLS
7798 * label.) */
d01c980f 7799static void
c2d936a4
BP
7800inconsistent_match(enum ofputil_protocol *usable_protocols)
7801{
7802 *usable_protocols &= OFPUTIL_P_OF10_ANY;
7803}
7804
f839892a
JS
7805/* May modify flow->packet_type, flow->dl_type, flow->nw_proto and
7806 * flow->vlan_tci, caller must restore them.
c2d936a4
BP
7807 *
7808 * Modifies some actions, filling in fields that could not be properly set
7809 * without context. */
7810static enum ofperr
7811ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a,
67210a55 7812 struct match *match, ofp_port_t max_ports,
c2d936a4 7813 uint8_t table_id, uint8_t n_tables)
d01c980f 7814{
67210a55 7815 struct flow *flow = &match->flow;
c2d936a4
BP
7816 const struct ofpact_enqueue *enqueue;
7817 const struct mf_field *mf;
f839892a 7818 ovs_be16 dl_type = get_dl_type(flow);
c2d936a4 7819
d01c980f
BP
7820 switch (a->type) {
7821 case OFPACT_OUTPUT:
c2d936a4
BP
7822 return ofpact_check_output_port(ofpact_get_OUTPUT(a)->port,
7823 max_ports);
7824
7825 case OFPACT_CONTROLLER:
7826 return 0;
d01c980f
BP
7827
7828 case OFPACT_ENQUEUE:
c2d936a4
BP
7829 enqueue = ofpact_get_ENQUEUE(a);
7830 if (ofp_to_u16(enqueue->port) >= ofp_to_u16(max_ports)
7831 && enqueue->port != OFPP_IN_PORT
7832 && enqueue->port != OFPP_LOCAL) {
7833 return OFPERR_OFPBAC_BAD_OUT_PORT;
7834 }
7835 return 0;
7836
7837 case OFPACT_OUTPUT_REG:
67210a55 7838 return mf_check_src(&ofpact_get_OUTPUT_REG(a)->src, match);
c2d936a4 7839
aaca4fe0
WT
7840 case OFPACT_OUTPUT_TRUNC:
7841 return ofpact_check_output_port(ofpact_get_OUTPUT_TRUNC(a)->port,
7842 max_ports);
7843
c2d936a4 7844 case OFPACT_BUNDLE:
67210a55 7845 return bundle_check(ofpact_get_BUNDLE(a), max_ports, match);
d01c980f
BP
7846
7847 case OFPACT_SET_VLAN_VID:
c2d936a4
BP
7848 /* Remember if we saw a vlan tag in the flow to aid translating to
7849 * OpenFlow 1.1+ if need be. */
7850 ofpact_get_SET_VLAN_VID(a)->flow_has_vlan =
f0fb825a
EG
7851 (flow->vlans[0].tci & htons(VLAN_CFI)) == htons(VLAN_CFI);
7852 if (!(flow->vlans[0].tci & htons(VLAN_CFI)) &&
c2d936a4
BP
7853 !ofpact_get_SET_VLAN_VID(a)->push_vlan_if_needed) {
7854 inconsistent_match(usable_protocols);
7855 }
7856 /* Temporary mark that we have a vlan tag. */
f0fb825a 7857 flow->vlans[0].tci |= htons(VLAN_CFI);
c2d936a4 7858 return 0;
d01c980f
BP
7859
7860 case OFPACT_SET_VLAN_PCP:
c2d936a4
BP
7861 /* Remember if we saw a vlan tag in the flow to aid translating to
7862 * OpenFlow 1.1+ if need be. */
7863 ofpact_get_SET_VLAN_PCP(a)->flow_has_vlan =
f0fb825a
EG
7864 (flow->vlans[0].tci & htons(VLAN_CFI)) == htons(VLAN_CFI);
7865 if (!(flow->vlans[0].tci & htons(VLAN_CFI)) &&
c2d936a4
BP
7866 !ofpact_get_SET_VLAN_PCP(a)->push_vlan_if_needed) {
7867 inconsistent_match(usable_protocols);
7868 }
7869 /* Temporary mark that we have a vlan tag. */
f0fb825a 7870 flow->vlans[0].tci |= htons(VLAN_CFI);
c2d936a4 7871 return 0;
d01c980f
BP
7872
7873 case OFPACT_STRIP_VLAN:
f0fb825a 7874 if (!(flow->vlans[0].tci & htons(VLAN_CFI))) {
c2d936a4
BP
7875 inconsistent_match(usable_protocols);
7876 }
f0fb825a 7877 flow_pop_vlan(flow, NULL);
c2d936a4 7878 return 0;
d01c980f 7879
3e34fbdd 7880 case OFPACT_PUSH_VLAN:
f0fb825a
EG
7881 if (flow->vlans[FLOW_MAX_VLAN_HEADERS - 1].tci & htons(VLAN_CFI)) {
7882 /* Support maximum (FLOW_MAX_VLAN_HEADERS) VLAN headers. */
c2d936a4
BP
7883 return OFPERR_OFPBAC_BAD_TAG;
7884 }
7885 /* Temporary mark that we have a vlan tag. */
f0fb825a
EG
7886 flow_push_vlan_uninit(flow, NULL);
7887 flow->vlans[0].tci |= htons(VLAN_CFI);
c2d936a4 7888 return 0;
276c4e7a 7889
d01c980f 7890 case OFPACT_SET_ETH_SRC:
d01c980f 7891 case OFPACT_SET_ETH_DST:
c2d936a4 7892 return 0;
d01c980f
BP
7893
7894 case OFPACT_SET_IPV4_SRC:
d01c980f 7895 case OFPACT_SET_IPV4_DST:
f839892a 7896 if (dl_type != htons(ETH_TYPE_IP)) {
c2d936a4
BP
7897 inconsistent_match(usable_protocols);
7898 }
7899 return 0;
d01c980f 7900
04f01c24 7901 case OFPACT_SET_IP_DSCP:
ff14eb7a 7902 case OFPACT_SET_IP_ECN:
0c20dbe4 7903 case OFPACT_SET_IP_TTL:
7bcb1506 7904 case OFPACT_DEC_TTL:
c2d936a4
BP
7905 if (!is_ip_any(flow)) {
7906 inconsistent_match(usable_protocols);
7907 }
7908 return 0;
b02475c5 7909
c2d936a4 7910 case OFPACT_SET_L4_SRC_PORT:
c2d936a4 7911 case OFPACT_SET_L4_DST_PORT:
b8778a0d 7912 if (!is_ip_any(flow) || (flow->nw_frag & FLOW_NW_FRAG_LATER) ||
c2d936a4
BP
7913 (flow->nw_proto != IPPROTO_TCP && flow->nw_proto != IPPROTO_UDP
7914 && flow->nw_proto != IPPROTO_SCTP)) {
7915 inconsistent_match(usable_protocols);
7916 }
7917 /* Note on which transport protocol the port numbers are set.
7918 * This allows this set action to be converted to an OF1.2 set field
7919 * action. */
b8778a0d
JR
7920 if (a->type == OFPACT_SET_L4_SRC_PORT) {
7921 ofpact_get_SET_L4_SRC_PORT(a)->flow_ip_proto = flow->nw_proto;
7922 } else {
7923 ofpact_get_SET_L4_DST_PORT(a)->flow_ip_proto = flow->nw_proto;
7924 }
c2d936a4 7925 return 0;
b02475c5 7926
c2d936a4 7927 case OFPACT_REG_MOVE:
67210a55 7928 return nxm_reg_move_check(ofpact_get_REG_MOVE(a), match);
8dd54666 7929
e3f8f887 7930 case OFPACT_SET_FIELD:
c2d936a4
BP
7931 mf = ofpact_get_SET_FIELD(a)->field;
7932 /* Require OXM_OF_VLAN_VID to have an existing VLAN header. */
aff49b8c 7933 if (!mf_are_prereqs_ok(mf, flow, NULL) ||
f0fb825a
EG
7934 (mf->id == MFF_VLAN_VID &&
7935 !(flow->vlans[0].tci & htons(VLAN_CFI)))) {
5bcd4754 7936 VLOG_WARN_RL(&rl, "set_field %s lacks correct prerequisites",
c2d936a4
BP
7937 mf->name);
7938 return OFPERR_OFPBAC_MATCH_INCONSISTENT;
7939 }
7940 /* Remember if we saw a vlan tag in the flow to aid translating to
7941 * OpenFlow 1.1 if need be. */
7942 ofpact_get_SET_FIELD(a)->flow_has_vlan =
f0fb825a 7943 (flow->vlans[0].tci & htons(VLAN_CFI)) == htons(VLAN_CFI);
c2d936a4
BP
7944 if (mf->id == MFF_VLAN_TCI) {
7945 /* The set field may add or remove the vlan tag,
7946 * Mark the status temporarily. */
f0fb825a 7947 flow->vlans[0].tci = ofpact_get_SET_FIELD(a)->value->be16;
c2d936a4
BP
7948 }
7949 return 0;
e3f8f887 7950
bd85dac1 7951 case OFPACT_STACK_PUSH:
67210a55 7952 return nxm_stack_push_check(ofpact_get_STACK_PUSH(a), match);
c2d936a4 7953
bd85dac1 7954 case OFPACT_STACK_POP:
67210a55 7955 return nxm_stack_pop_check(ofpact_get_STACK_POP(a), match);
c2d936a4
BP
7956
7957 case OFPACT_SET_MPLS_LABEL:
7958 case OFPACT_SET_MPLS_TC:
7959 case OFPACT_SET_MPLS_TTL:
7960 case OFPACT_DEC_MPLS_TTL:
f839892a 7961 if (!eth_type_mpls(dl_type)) {
c2d936a4
BP
7962 inconsistent_match(usable_protocols);
7963 }
7964 return 0;
7965
d01c980f 7966 case OFPACT_SET_TUNNEL:
c2d936a4 7967 case OFPACT_SET_QUEUE:
d01c980f 7968 case OFPACT_POP_QUEUE:
c2d936a4
BP
7969 return 0;
7970
2cd20955
JR
7971 case OFPACT_RESUBMIT: {
7972 struct ofpact_resubmit *resubmit = ofpact_get_RESUBMIT(a);
7973
7974 if (resubmit->with_ct_orig && !is_ct_valid(flow, &match->wc, NULL)) {
7975 return OFPERR_OFPBAC_MATCH_INCONSISTENT;
7976 }
7977 return 0;
7978 }
c2d936a4
BP
7979 case OFPACT_FIN_TIMEOUT:
7980 if (flow->nw_proto != IPPROTO_TCP) {
7981 inconsistent_match(usable_protocols);
7982 }
7983 return 0;
7984
d01c980f 7985 case OFPACT_LEARN:
67210a55 7986 return learn_check(ofpact_get_LEARN(a), match);
c2d936a4 7987
18080541
BP
7988 case OFPACT_CONJUNCTION:
7989 return 0;
7990
d01c980f 7991 case OFPACT_MULTIPATH:
67210a55 7992 return multipath_check(ofpact_get_MULTIPATH(a), match);
c2d936a4 7993
d01c980f
BP
7994 case OFPACT_NOTE:
7995 case OFPACT_EXIT:
c2d936a4 7996 return 0;
d01c980f 7997
c2d936a4 7998 case OFPACT_PUSH_MPLS:
f839892a
JS
7999 if (flow->packet_type != htonl(PT_ETH)) {
8000 inconsistent_match(usable_protocols);
8001 }
c2d936a4
BP
8002 flow->dl_type = ofpact_get_PUSH_MPLS(a)->ethertype;
8003 /* The packet is now MPLS and the MPLS payload is opaque.
8004 * Thus nothing can be assumed about the network protocol.
8005 * Temporarily mark that we have no nw_proto. */
8006 flow->nw_proto = 0;
8007 return 0;
1e7db674 8008
c2d936a4 8009 case OFPACT_POP_MPLS:
f839892a
JS
8010 if (flow->packet_type != htonl(PT_ETH)
8011 || !eth_type_mpls(dl_type)) {
c2d936a4
BP
8012 inconsistent_match(usable_protocols);
8013 }
8014 flow->dl_type = ofpact_get_POP_MPLS(a)->ethertype;
8015 return 0;
1e7db674 8016
c2d936a4
BP
8017 case OFPACT_SAMPLE:
8018 return 0;
1e7db674 8019
7ae62a67
WT
8020 case OFPACT_CLONE: {
8021 struct ofpact_nest *on = ofpact_get_CLONE(a);
8022 return ofpacts_check(on->actions, ofpact_nest_get_action_len(on),
67210a55 8023 match, max_ports, table_id, n_tables,
7ae62a67
WT
8024 usable_protocols);
8025 }
8026
07659514
JS
8027 case OFPACT_CT: {
8028 struct ofpact_conntrack *oc = ofpact_get_CT(a);
8029
f839892a 8030 if (!dl_type_is_ip_any(dl_type)
8b6d097c 8031 || (flow->ct_state & CS_INVALID && oc->flags & NX_CT_F_COMMIT)
40c7b2fc
JS
8032 || (oc->alg == IPPORT_FTP && flow->nw_proto != IPPROTO_TCP)
8033 || (oc->alg == IPPORT_TFTP && flow->nw_proto != IPPROTO_UDP)) {
ed26e3ea
JR
8034 /* We can't downgrade to OF1.0 and expect inconsistent CT actions
8035 * be silently discarded. Instead, datapath flow install fails, so
8036 * it is better to flag inconsistent CT actions as hard errors. */
8037 return OFPERR_OFPBAC_MATCH_INCONSISTENT;
07659514
JS
8038 }
8039
8040 if (oc->zone_src.field) {
67210a55 8041 return mf_check_src(&oc->zone_src, match);
07659514 8042 }
8e53fe8c 8043
9f02d70c 8044 return ofpacts_check(oc->actions, ofpact_ct_get_action_len(oc),
67210a55 8045 match, max_ports, table_id, n_tables,
9f02d70c 8046 usable_protocols);
07659514
JS
8047 }
8048
72fe7578
BP
8049 case OFPACT_CT_CLEAR:
8050 return 0;
8051
9ac0aada
JR
8052 case OFPACT_NAT: {
8053 struct ofpact_nat *on = ofpact_get_NAT(a);
8054
f839892a
JS
8055 if (!dl_type_is_ip_any(dl_type) ||
8056 (on->range_af == AF_INET && dl_type != htons(ETH_TYPE_IP)) ||
9ac0aada 8057 (on->range_af == AF_INET6
f839892a 8058 && dl_type != htons(ETH_TYPE_IPV6))) {
ed26e3ea 8059 return OFPERR_OFPBAC_MATCH_INCONSISTENT;
9ac0aada
JR
8060 }
8061 return 0;
8062 }
8063
c2d936a4
BP
8064 case OFPACT_CLEAR_ACTIONS:
8065 return 0;
1e7db674 8066
c2d936a4
BP
8067 case OFPACT_WRITE_ACTIONS: {
8068 /* Use a temporary copy of 'usable_protocols' because we can't check
8069 * consistency of an action set. */
8070 struct ofpact_nest *on = ofpact_get_WRITE_ACTIONS(a);
8071 enum ofputil_protocol p = *usable_protocols;
8072 return ofpacts_check(on->actions, ofpact_nest_get_action_len(on),
67210a55 8073 match, max_ports, table_id, n_tables, &p);
c2d936a4 8074 }
1e7db674 8075
c2d936a4
BP
8076 case OFPACT_WRITE_METADATA:
8077 return 0;
1e7db674 8078
c2d936a4
BP
8079 case OFPACT_METER: {
8080 uint32_t mid = ofpact_get_METER(a)->meter_id;
8081 if (mid == 0 || mid > OFPM13_MAX) {
8082 return OFPERR_OFPMMFC_INVALID_METER;
8083 }
8084 return 0;
8085 }
1e7db674 8086
c2d936a4
BP
8087 case OFPACT_GOTO_TABLE: {
8088 uint8_t goto_table = ofpact_get_GOTO_TABLE(a)->table_id;
8089 if ((table_id != 255 && goto_table <= table_id)
8090 || (n_tables != 255 && goto_table >= n_tables)) {
8c87971e 8091 return OFPERR_OFPBIC_BAD_TABLE_ID;
c2d936a4
BP
8092 }
8093 return 0;
8094 }
1e7db674 8095
c2d936a4
BP
8096 case OFPACT_GROUP:
8097 return 0;
1e7db674 8098
e672ff9b
JR
8099 case OFPACT_UNROLL_XLATE:
8100 /* UNROLL is an internal action that should never be seen via
8101 * OpenFlow. */
8102 return OFPERR_OFPBAC_BAD_TYPE;
8103
d4abaff5
BP
8104 case OFPACT_DEBUG_RECIRC:
8105 return 0;
8106
f839892a
JS
8107 case OFPACT_ENCAP:
8108 flow->packet_type = ofpact_get_ENCAP(a)->new_pkt_type;
8109 if (pt_ns(flow->packet_type) == OFPHTN_ETHERTYPE) {
8110 flow->dl_type = htons(pt_ns_type(flow->packet_type));
8111 }
8112 if (!is_ip_any(flow)) {
8113 flow->nw_proto = 0;
8114 }
8115 return 0;
8116
8117 case OFPACT_DECAP:
8118 if (flow->packet_type == htonl(PT_ETH)) {
8119 /* Adjust the packet_type to allow subsequent actions. */
8120 flow->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE,
8121 ntohs(flow->dl_type));
8122 } else {
8123 /* The actual packet_type is only known after decapsulation.
8124 * Do not allow subsequent actions that depend on packet headers. */
8125 flow->packet_type = htonl(PT_UNKNOWN);
8126 flow->dl_type = OVS_BE16_MAX;
8127 }
8128 return 0;
8129
c2d936a4
BP
8130 default:
8131 OVS_NOT_REACHED();
8132 }
8133}
1e7db674 8134
c2d936a4
BP
8135/* Checks that the 'ofpacts_len' bytes of actions in 'ofpacts' are
8136 * appropriate for a packet with the prerequisites satisfied by 'flow' in a
8137 * switch with no more than 'max_ports' ports.
8138 *
8139 * If 'ofpacts' and 'flow' are inconsistent with one another, un-sets in
8140 * '*usable_protocols' the protocols that forbid the inconsistency. (An
8141 * example of an inconsistency between match and actions is a flow that does
8142 * not match on an MPLS Ethertype but has an action that pops an MPLS label.)
8143 *
67210a55 8144 * May annotate ofpacts with information gathered from the 'match'.
c2d936a4 8145 *
67210a55
JR
8146 * May temporarily modify 'match', but restores the changes before
8147 * returning. */
c2d936a4
BP
8148enum ofperr
8149ofpacts_check(struct ofpact ofpacts[], size_t ofpacts_len,
67210a55 8150 struct match *match, ofp_port_t max_ports,
c2d936a4
BP
8151 uint8_t table_id, uint8_t n_tables,
8152 enum ofputil_protocol *usable_protocols)
8153{
8154 struct ofpact *a;
f839892a 8155 ovs_be32 packet_type = match->flow.packet_type;
67210a55 8156 ovs_be16 dl_type = match->flow.dl_type;
67210a55 8157 uint8_t nw_proto = match->flow.nw_proto;
c2d936a4 8158 enum ofperr error = 0;
f0fb825a
EG
8159 union flow_vlan_hdr vlans[FLOW_MAX_VLAN_HEADERS];
8160
8161 memcpy(&vlans, &match->flow.vlans, sizeof(vlans));
1e7db674 8162
c2d936a4 8163 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
67210a55 8164 error = ofpact_check__(usable_protocols, a, match,
c2d936a4
BP
8165 max_ports, table_id, n_tables);
8166 if (error) {
1e7db674 8167 break;
c2d936a4
BP
8168 }
8169 }
8170 /* Restore fields that may have been modified. */
f839892a 8171 match->flow.packet_type = packet_type;
67210a55 8172 match->flow.dl_type = dl_type;
f0fb825a 8173 memcpy(&match->flow.vlans, &vlans, sizeof(vlans));
67210a55 8174 match->flow.nw_proto = nw_proto;
c2d936a4
BP
8175 return error;
8176}
1e7db674 8177
c2d936a4
BP
8178/* Like ofpacts_check(), but reports inconsistencies as
8179 * OFPERR_OFPBAC_MATCH_INCONSISTENT rather than clearing bits. */
8180enum ofperr
8181ofpacts_check_consistency(struct ofpact ofpacts[], size_t ofpacts_len,
67210a55 8182 struct match *match, ofp_port_t max_ports,
c2d936a4
BP
8183 uint8_t table_id, uint8_t n_tables,
8184 enum ofputil_protocol usable_protocols)
8185{
8186 enum ofputil_protocol p = usable_protocols;
8187 enum ofperr error;
1e7db674 8188
67210a55 8189 error = ofpacts_check(ofpacts, ofpacts_len, match, max_ports,
c2d936a4
BP
8190 table_id, n_tables, &p);
8191 return (error ? error
8192 : p != usable_protocols ? OFPERR_OFPBAC_MATCH_INCONSISTENT
8193 : 0);
8194}
097d4939 8195
28f5311f
JS
8196/* Returns the destination field that 'ofpact' would write to, or NULL
8197 * if the action would not write to an mf_field. */
8198const struct mf_field *
8199ofpact_get_mf_dst(const struct ofpact *ofpact)
8e53fe8c 8200{
28f5311f
JS
8201 if (ofpact->type == OFPACT_SET_FIELD) {
8202 const struct ofpact_set_field *orl;
8e53fe8c 8203
28f5311f 8204 orl = CONTAINER_OF(ofpact, struct ofpact_set_field, ofpact);
8e53fe8c 8205 return orl->field;
28f5311f
JS
8206 } else if (ofpact->type == OFPACT_REG_MOVE) {
8207 const struct ofpact_reg_move *orm;
8e53fe8c 8208
28f5311f 8209 orm = CONTAINER_OF(ofpact, struct ofpact_reg_move, ofpact);
8e53fe8c
JS
8210 return orm->dst.field;
8211 }
8212
8213 return NULL;
8214}
8215
8216static enum ofperr
8217unsupported_nesting(enum ofpact_type action, enum ofpact_type outer_action)
8218{
8219 VLOG_WARN("%s action doesn't support nested action %s",
8220 ofpact_name(outer_action), ofpact_name(action));
8221 return OFPERR_OFPBAC_BAD_ARGUMENT;
8222}
8223
8224static bool
8225field_requires_ct(enum mf_field_id field)
8226{
9daf2348 8227 return field == MFF_CT_MARK || field == MFF_CT_LABEL;
8e53fe8c
JS
8228}
8229
8230/* Apply nesting constraints for actions */
d824b5b7
JS
8231static enum ofperr
8232ofpacts_verify_nested(const struct ofpact *a, enum ofpact_type outer_action)
8233{
28f5311f 8234 const struct mf_field *field = ofpact_get_mf_dst(a);
8e53fe8c
JS
8235
8236 if (field && field_requires_ct(field->id) && outer_action != OFPACT_CT) {
8237 VLOG_WARN("cannot set CT fields outside of ct action");
8238 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
8239 }
9ac0aada
JR
8240 if (a->type == OFPACT_NAT) {
8241 if (outer_action != OFPACT_CT) {
8242 VLOG_WARN("Cannot have NAT action outside of \"ct\" action");
8243 return OFPERR_OFPBAC_BAD_SET_ARGUMENT;
8244 }
8245 return 0;
8246 }
8e53fe8c
JS
8247
8248 if (outer_action) {
8249 ovs_assert(outer_action == OFPACT_WRITE_ACTIONS
8250 || outer_action == OFPACT_CT);
8251
8252 if (outer_action == OFPACT_CT) {
8253 if (!field) {
8254 return unsupported_nesting(a->type, outer_action);
8255 } else if (!field_requires_ct(field->id)) {
8256 VLOG_WARN("%s action doesn't support nested modification "
8257 "of %s", ofpact_name(outer_action), field->name);
8258 return OFPERR_OFPBAC_BAD_ARGUMENT;
8259 }
8260 }
d824b5b7
JS
8261 }
8262
8263 return 0;
8264}
8265
18080541
BP
8266/* Verifies that the 'ofpacts_len' bytes of actions in 'ofpacts' are in the
8267 * appropriate order as defined by the OpenFlow spec and as required by Open
8268 * vSwitch.
8269 *
8270 * 'allowed_ovsinsts' is a bitmap of OVSINST_* values, in which 1-bits indicate
d824b5b7
JS
8271 * instructions that are allowed within 'ofpacts[]'.
8272 *
8273 * If 'outer_action' is not zero, it specifies that the actions are nested
8274 * within another action of type 'outer_action'. */
c2d936a4
BP
8275static enum ofperr
8276ofpacts_verify(const struct ofpact ofpacts[], size_t ofpacts_len,
d824b5b7 8277 uint32_t allowed_ovsinsts, enum ofpact_type outer_action)
c2d936a4
BP
8278{
8279 const struct ofpact *a;
8280 enum ovs_instruction_type inst;
097d4939 8281
c2d936a4
BP
8282 inst = OVSINST_OFPIT13_METER;
8283 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
8284 enum ovs_instruction_type next;
8e53fe8c 8285 enum ofperr error;
1e7db674 8286
18080541
BP
8287 if (a->type == OFPACT_CONJUNCTION) {
8288 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
f08e39dd
BP
8289 if (a->type != OFPACT_CONJUNCTION && a->type != OFPACT_NOTE) {
8290 VLOG_WARN("\"conjunction\" actions may be used along with "
8291 "\"note\" but not any other kind of action "
8292 "(such as the \"%s\" action used here)",
96775a1c 8293 ofpact_name(a->type));
18080541
BP
8294 return OFPERR_NXBAC_BAD_CONJUNCTION;
8295 }
8296 }
8297 return 0;
8298 }
8299
8e53fe8c
JS
8300 error = ofpacts_verify_nested(a, outer_action);
8301 if (error) {
8302 return error;
d824b5b7
JS
8303 }
8304
c2d936a4
BP
8305 next = ovs_instruction_type_from_ofpact_type(a->type);
8306 if (a > ofpacts
8307 && (inst == OVSINST_OFPIT11_APPLY_ACTIONS
8308 ? next < inst
8309 : next <= inst)) {
8310 const char *name = ovs_instruction_name_from_type(inst);
8311 const char *next_name = ovs_instruction_name_from_type(next);
1e7db674 8312
c2d936a4
BP
8313 if (next == inst) {
8314 VLOG_WARN("duplicate %s instruction not allowed, for OpenFlow "
8315 "1.1+ compatibility", name);
8316 } else {
8317 VLOG_WARN("invalid instruction ordering: %s must appear "
8318 "before %s, for OpenFlow 1.1+ compatibility",
8319 next_name, name);
8320 }
8321 return OFPERR_OFPBAC_UNSUPPORTED_ORDER;
8322 }
8323 if (!((1u << next) & allowed_ovsinsts)) {
8324 const char *name = ovs_instruction_name_from_type(next);
1e7db674 8325
c2d936a4
BP
8326 VLOG_WARN("%s instruction not allowed here", name);
8327 return OFPERR_OFPBIC_UNSUP_INST;
1e7db674 8328 }
c2d936a4
BP
8329
8330 inst = next;
8331 }
8332
8333 return 0;
8334}
8335\f
8336/* Converting ofpacts to OpenFlow. */
8337
8338static void
8339encode_ofpact(const struct ofpact *a, enum ofp_version ofp_version,
8340 struct ofpbuf *out)
8341{
8342 switch (a->type) {
8343#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \
8344 case OFPACT_##ENUM: \
355ead69
GS
8345 encode_##ENUM(ofpact_get_##ENUM(a), ofp_version, out); \
8346 return;
c2d936a4
BP
8347 OFPACTS
8348#undef OFPACT
8349 default:
8350 OVS_NOT_REACHED();
1e7db674 8351 }
e3f8f887
JR
8352}
8353
8354/* Converts the 'ofpacts_len' bytes of ofpacts in 'ofpacts' into OpenFlow
8355 * actions in 'openflow', appending the actions to any existing data in
d01c980f 8356 * 'openflow'. */
a07c15bc 8357size_t
e3f8f887
JR
8358ofpacts_put_openflow_actions(const struct ofpact ofpacts[], size_t ofpacts_len,
8359 struct ofpbuf *openflow,
8360 enum ofp_version ofp_version)
d01c980f
BP
8361{
8362 const struct ofpact *a;
6fd6ed71 8363 size_t start_size = openflow->size;
d01c980f
BP
8364
8365 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
c2d936a4 8366 encode_ofpact(a, ofp_version, openflow);
d01c980f 8367 }
6fd6ed71 8368 return openflow->size - start_size;
d01c980f
BP
8369}
8370
c2d936a4
BP
8371static enum ovs_instruction_type
8372ofpact_is_apply_actions(const struct ofpact *a)
d01c980f 8373{
c2d936a4
BP
8374 return (ovs_instruction_type_from_ofpact_type(a->type)
8375 == OVSINST_OFPIT11_APPLY_ACTIONS);
d01c980f 8376}
8dd54666
IY
8377
8378void
e3f8f887
JR
8379ofpacts_put_openflow_instructions(const struct ofpact ofpacts[],
8380 size_t ofpacts_len,
8381 struct ofpbuf *openflow,
8382 enum ofp_version ofp_version)
8dd54666 8383{
c2d936a4 8384 const struct ofpact *end = ofpact_end(ofpacts, ofpacts_len);
8dd54666
IY
8385 const struct ofpact *a;
8386
8f2cded4
BP
8387 if (ofp_version == OFP10_VERSION) {
8388 ofpacts_put_openflow_actions(ofpacts, ofpacts_len, openflow,
8389 ofp_version);
8390 return;
8391 }
e3f8f887 8392
c2d936a4
BP
8393 a = ofpacts;
8394 while (a < end) {
8395 if (ofpact_is_apply_actions(a)) {
6fd6ed71 8396 size_t ofs = openflow->size;
8dd54666
IY
8397
8398 instruction_put_OFPIT11_APPLY_ACTIONS(openflow);
c2d936a4
BP
8399 do {
8400 encode_ofpact(a, ofp_version, openflow);
8401 a = ofpact_next(a);
8402 } while (a < end && ofpact_is_apply_actions(a));
7fdb60a7 8403 ofpacts_update_instruction_actions(openflow, ofs);
c2d936a4
BP
8404 } else {
8405 encode_ofpact(a, ofp_version, openflow);
8406 a = ofpact_next(a);
8dd54666
IY
8407 }
8408 }
8409}
d01c980f 8410\f
08d1e234
BP
8411/* Sets of supported actions. */
8412
8413/* Two-way translation between OVS's internal "OFPACT_*" representation of
8414 * actions and the "OFPAT_*" representation used in some OpenFlow version.
8415 * (OFPAT_* numbering varies from one OpenFlow version to another, so a given
8416 * instance is specific to one OpenFlow version.) */
8417struct ofpact_map {
8418 enum ofpact_type ofpact; /* Internal name for action type. */
8419 int ofpat; /* OFPAT_* number from OpenFlow spec. */
8420};
8421
8422static const struct ofpact_map *
8423get_ofpact_map(enum ofp_version version)
8424{
8425 /* OpenFlow 1.0 actions. */
8426 static const struct ofpact_map of10[] = {
8427 { OFPACT_OUTPUT, 0 },
8428 { OFPACT_SET_VLAN_VID, 1 },
8429 { OFPACT_SET_VLAN_PCP, 2 },
8430 { OFPACT_STRIP_VLAN, 3 },
8431 { OFPACT_SET_ETH_SRC, 4 },
8432 { OFPACT_SET_ETH_DST, 5 },
8433 { OFPACT_SET_IPV4_SRC, 6 },
8434 { OFPACT_SET_IPV4_DST, 7 },
8435 { OFPACT_SET_IP_DSCP, 8 },
8436 { OFPACT_SET_L4_SRC_PORT, 9 },
8437 { OFPACT_SET_L4_DST_PORT, 10 },
8438 { OFPACT_ENQUEUE, 11 },
8439 { 0, -1 },
8440 };
8441
8442 /* OpenFlow 1.1 actions. */
8443 static const struct ofpact_map of11[] = {
8444 { OFPACT_OUTPUT, 0 },
8445 { OFPACT_SET_VLAN_VID, 1 },
8446 { OFPACT_SET_VLAN_PCP, 2 },
8447 { OFPACT_SET_ETH_SRC, 3 },
8448 { OFPACT_SET_ETH_DST, 4 },
8449 { OFPACT_SET_IPV4_SRC, 5 },
8450 { OFPACT_SET_IPV4_DST, 6 },
8451 { OFPACT_SET_IP_DSCP, 7 },
8452 { OFPACT_SET_IP_ECN, 8 },
8453 { OFPACT_SET_L4_SRC_PORT, 9 },
8454 { OFPACT_SET_L4_DST_PORT, 10 },
8455 /* OFPAT_COPY_TTL_OUT (11) not supported. */
8456 /* OFPAT_COPY_TTL_IN (12) not supported. */
8457 { OFPACT_SET_MPLS_LABEL, 13 },
8458 { OFPACT_SET_MPLS_TC, 14 },
8459 { OFPACT_SET_MPLS_TTL, 15 },
8460 { OFPACT_DEC_MPLS_TTL, 16 },
8461 { OFPACT_PUSH_VLAN, 17 },
8462 { OFPACT_STRIP_VLAN, 18 },
8463 { OFPACT_PUSH_MPLS, 19 },
8464 { OFPACT_POP_MPLS, 20 },
8465 { OFPACT_SET_QUEUE, 21 },
8466 { OFPACT_GROUP, 22 },
8467 { OFPACT_SET_IP_TTL, 23 },
8468 { OFPACT_DEC_TTL, 24 },
8469 { 0, -1 },
8470 };
8471
8472 /* OpenFlow 1.2, 1.3, and 1.4 actions. */
8473 static const struct ofpact_map of12[] = {
8474 { OFPACT_OUTPUT, 0 },
8475 /* OFPAT_COPY_TTL_OUT (11) not supported. */
8476 /* OFPAT_COPY_TTL_IN (12) not supported. */
8477 { OFPACT_SET_MPLS_TTL, 15 },
8478 { OFPACT_DEC_MPLS_TTL, 16 },
8479 { OFPACT_PUSH_VLAN, 17 },
8480 { OFPACT_STRIP_VLAN, 18 },
8481 { OFPACT_PUSH_MPLS, 19 },
8482 { OFPACT_POP_MPLS, 20 },
8483 { OFPACT_SET_QUEUE, 21 },
8484 { OFPACT_GROUP, 22 },
8485 { OFPACT_SET_IP_TTL, 23 },
8486 { OFPACT_DEC_TTL, 24 },
8487 { OFPACT_SET_FIELD, 25 },
8488 /* OF1.3+ OFPAT_PUSH_PBB (26) not supported. */
8489 /* OF1.3+ OFPAT_POP_PBB (27) not supported. */
8490 { 0, -1 },
8491 };
8492
8493 switch (version) {
8494 case OFP10_VERSION:
8495 return of10;
8496
8497 case OFP11_VERSION:
8498 return of11;
8499
8500 case OFP12_VERSION:
8501 case OFP13_VERSION:
8502 case OFP14_VERSION:
8503 case OFP15_VERSION:
b79d45a1 8504 case OFP16_VERSION:
08d1e234
BP
8505 default:
8506 return of12;
8507 }
8508}
8509
8510/* Converts 'ofpacts_bitmap', a bitmap whose bits correspond to OFPACT_*
8511 * values, into a bitmap of actions suitable for OpenFlow 'version', and
8512 * returns the result. */
8513ovs_be32
8514ofpact_bitmap_to_openflow(uint64_t ofpacts_bitmap, enum ofp_version version)
8515{
8516 uint32_t openflow_bitmap = 0;
8517 const struct ofpact_map *x;
8518
8519 for (x = get_ofpact_map(version); x->ofpat >= 0; x++) {
8520 if (ofpacts_bitmap & (UINT64_C(1) << x->ofpact)) {
8521 openflow_bitmap |= 1u << x->ofpat;
8522 }
8523 }
8524 return htonl(openflow_bitmap);
8525}
8526
8527/* Converts 'ofpat_bitmap', a bitmap of actions from an OpenFlow message with
8528 * the given 'version' into a bitmap whose bits correspond to OFPACT_* values,
8529 * and returns the result. */
8530uint64_t
8531ofpact_bitmap_from_openflow(ovs_be32 ofpat_bitmap, enum ofp_version version)
8532{
8533 uint64_t ofpact_bitmap = 0;
8534 const struct ofpact_map *x;
8535
8536 for (x = get_ofpact_map(version); x->ofpat >= 0; x++) {
8537 if (ofpat_bitmap & htonl(1u << x->ofpat)) {
8538 ofpact_bitmap |= UINT64_C(1) << x->ofpact;
8539 }
8540 }
8541 return ofpact_bitmap;
8542}
8543
8544/* Appends to 's' a string representation of the set of OFPACT_* represented
8545 * by 'ofpacts_bitmap'. */
8546void
8547ofpact_bitmap_format(uint64_t ofpacts_bitmap, struct ds *s)
8548{
8549 if (!ofpacts_bitmap) {
8550 ds_put_cstr(s, "<none>");
8551 } else {
8552 while (ofpacts_bitmap) {
8553 ds_put_format(s, "%s ",
8554 ofpact_name(rightmost_1bit_idx(ofpacts_bitmap)));
8555 ofpacts_bitmap = zero_rightmost_1bit(ofpacts_bitmap);
8556 }
8557 ds_chomp(s, ' ');
8558 }
8559}
8560\f
f25d0cf3
BP
8561/* Returns true if 'action' outputs to 'port', false otherwise. */
8562static bool
4e022ec0 8563ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
f25d0cf3
BP
8564{
8565 switch (ofpact->type) {
8566 case OFPACT_OUTPUT:
8567 return ofpact_get_OUTPUT(ofpact)->port == port;
8568 case OFPACT_ENQUEUE:
8569 return ofpact_get_ENQUEUE(ofpact)->port == port;
8570 case OFPACT_CONTROLLER:
8571 return port == OFPP_CONTROLLER;
8572
8573 case OFPACT_OUTPUT_REG:
aaca4fe0 8574 case OFPACT_OUTPUT_TRUNC:
f25d0cf3
BP
8575 case OFPACT_BUNDLE:
8576 case OFPACT_SET_VLAN_VID:
8577 case OFPACT_SET_VLAN_PCP:
8578 case OFPACT_STRIP_VLAN:
3e34fbdd 8579 case OFPACT_PUSH_VLAN:
f25d0cf3
BP
8580 case OFPACT_SET_ETH_SRC:
8581 case OFPACT_SET_ETH_DST:
8582 case OFPACT_SET_IPV4_SRC:
8583 case OFPACT_SET_IPV4_DST:
04f01c24 8584 case OFPACT_SET_IP_DSCP:
ff14eb7a 8585 case OFPACT_SET_IP_ECN:
0c20dbe4 8586 case OFPACT_SET_IP_TTL:
f25d0cf3
BP
8587 case OFPACT_SET_L4_SRC_PORT:
8588 case OFPACT_SET_L4_DST_PORT:
8589 case OFPACT_REG_MOVE:
b2dd70be 8590 case OFPACT_SET_FIELD:
bd85dac1
AZ
8591 case OFPACT_STACK_PUSH:
8592 case OFPACT_STACK_POP:
f25d0cf3 8593 case OFPACT_DEC_TTL:
097d4939
JR
8594 case OFPACT_SET_MPLS_LABEL:
8595 case OFPACT_SET_MPLS_TC:
0f3f3c3d 8596 case OFPACT_SET_MPLS_TTL:
b676167a 8597 case OFPACT_DEC_MPLS_TTL:
f25d0cf3 8598 case OFPACT_SET_TUNNEL:
4cceacb9 8599 case OFPACT_WRITE_METADATA:
f25d0cf3
BP
8600 case OFPACT_SET_QUEUE:
8601 case OFPACT_POP_QUEUE:
8602 case OFPACT_FIN_TIMEOUT:
8603 case OFPACT_RESUBMIT:
8604 case OFPACT_LEARN:
18080541 8605 case OFPACT_CONJUNCTION:
f25d0cf3 8606 case OFPACT_MULTIPATH:
f25d0cf3
BP
8607 case OFPACT_NOTE:
8608 case OFPACT_EXIT:
e672ff9b 8609 case OFPACT_UNROLL_XLATE:
b02475c5
SH
8610 case OFPACT_PUSH_MPLS:
8611 case OFPACT_POP_MPLS:
29089a54 8612 case OFPACT_SAMPLE:
b19e8793 8613 case OFPACT_CLEAR_ACTIONS:
7ae62a67 8614 case OFPACT_CLONE:
7fdb60a7 8615 case OFPACT_WRITE_ACTIONS:
8dd54666 8616 case OFPACT_GOTO_TABLE:
638a19b0 8617 case OFPACT_METER:
7395c052 8618 case OFPACT_GROUP:
d4abaff5 8619 case OFPACT_DEBUG_RECIRC:
07659514 8620 case OFPACT_CT:
72fe7578 8621 case OFPACT_CT_CLEAR:
9ac0aada 8622 case OFPACT_NAT:
f839892a
JS
8623 case OFPACT_ENCAP:
8624 case OFPACT_DECAP:
f25d0cf3
BP
8625 default:
8626 return false;
8627 }
8628}
8629
8630/* Returns true if any action in the 'ofpacts_len' bytes of 'ofpacts' outputs
8631 * to 'port', false otherwise. */
8632bool
8633ofpacts_output_to_port(const struct ofpact *ofpacts, size_t ofpacts_len,
4e022ec0 8634 ofp_port_t port)
c2d936a4
BP
8635{
8636 const struct ofpact *a;
f25d0cf3 8637
4f20179d 8638 OFPACT_FOR_EACH_FLATTENED (a, ofpacts, ofpacts_len) {
c2d936a4
BP
8639 if (ofpact_outputs_to_port(a, port)) {
8640 return true;
8641 }
8642 }
f25d0cf3 8643
c2d936a4
BP
8644 return false;
8645}
f25d0cf3 8646
c2d936a4
BP
8647/* Returns true if any action in the 'ofpacts_len' bytes of 'ofpacts' outputs
8648 * to 'group', false otherwise. */
8649bool
8650ofpacts_output_to_group(const struct ofpact *ofpacts, size_t ofpacts_len,
8651 uint32_t group_id)
8652{
8653 const struct ofpact *a;
b02475c5 8654
4f20179d 8655 OFPACT_FOR_EACH_FLATTENED (a, ofpacts, ofpacts_len) {
c2d936a4
BP
8656 if (a->type == OFPACT_GROUP
8657 && ofpact_get_GROUP(a)->group_id == group_id) {
8658 return true;
8659 }
8660 }
b02475c5 8661
c2d936a4
BP
8662 return false;
8663}
8dd54666 8664
c2d936a4
BP
8665bool
8666ofpacts_equal(const struct ofpact *a, size_t a_len,
8667 const struct ofpact *b, size_t b_len)
8668{
8669 return a_len == b_len && !memcmp(a, b, a_len);
8670}
29089a54 8671
c2d936a4
BP
8672/* Finds the OFPACT_METER action, if any, in the 'ofpacts_len' bytes of
8673 * 'ofpacts'. If found, returns its meter ID; if not, returns 0.
8674 *
8675 * This function relies on the order of 'ofpacts' being correct (as checked by
8676 * ofpacts_verify()). */
8677uint32_t
8678ofpacts_get_meter(const struct ofpact ofpacts[], size_t ofpacts_len)
8679{
8680 const struct ofpact *a;
7fdb60a7 8681
c2d936a4
BP
8682 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
8683 enum ovs_instruction_type inst;
b19e8793 8684
c2d936a4
BP
8685 inst = ovs_instruction_type_from_ofpact_type(a->type);
8686 if (a->type == OFPACT_METER) {
8687 return ofpact_get_METER(a)->meter_id;
8688 } else if (inst > OVSINST_OFPIT13_METER) {
8689 break;
4cceacb9 8690 }
c2d936a4 8691 }
638a19b0 8692
c2d936a4
BP
8693 return 0;
8694}
8695\f
8696/* Formatting ofpacts. */
7395c052 8697
c2d936a4 8698static void
50f96b10
BP
8699ofpact_format(const struct ofpact *a,
8700 const struct ofputil_port_map *port_map, struct ds *s)
c2d936a4
BP
8701{
8702 switch (a->type) {
8703#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \
8704 case OFPACT_##ENUM: \
50f96b10
BP
8705 format_##ENUM(ALIGNED_CAST(const struct STRUCT *, a), \
8706 port_map, s); \
c2d936a4
BP
8707 break;
8708 OFPACTS
8709#undef OFPACT
8710 default:
8711 OVS_NOT_REACHED();
f25d0cf3
BP
8712 }
8713}
8714
8715/* Appends a string representing the 'ofpacts_len' bytes of ofpacts in
50f96b10
BP
8716 * 'ofpacts' to 'string'. If 'port_map' is nonnull, uses it to translate
8717 * port numbers to names in output. */
f25d0cf3
BP
8718void
8719ofpacts_format(const struct ofpact *ofpacts, size_t ofpacts_len,
50f96b10 8720 const struct ofputil_port_map *port_map, struct ds *string)
f25d0cf3 8721{
f25d0cf3 8722 if (!ofpacts_len) {
b1c5bf1f 8723 ds_put_format(string, "%sdrop%s", colors.drop, colors.end);
f25d0cf3
BP
8724 } else {
8725 const struct ofpact *a;
8726
8727 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
8728 if (a != ofpacts) {
b1c5bf1f 8729 ds_put_char(string, ',');
f25d0cf3 8730 }
8dd54666 8731
50f96b10 8732 ofpact_format(a, port_map, string);
f25d0cf3
BP
8733 }
8734 }
8735}
8736\f
8737/* Internal use by helpers. */
8738
ce058104 8739/* Implementation of ofpact_put_<ENUM>(). */
f25d0cf3
BP
8740void *
8741ofpact_put(struct ofpbuf *ofpacts, enum ofpact_type type, size_t len)
8742{
8743 struct ofpact *ofpact;
8744
6fd6ed71
PS
8745 ofpacts->header = ofpbuf_put_uninit(ofpacts, len);
8746 ofpact = ofpacts->header;
f25d0cf3
BP
8747 ofpact_init(ofpact, type, len);
8748 return ofpact;
8749}
8750
ce058104 8751/* Implementation of ofpact_init_<ENUM>(). */
f25d0cf3
BP
8752void
8753ofpact_init(struct ofpact *ofpact, enum ofpact_type type, size_t len)
8754{
8755 memset(ofpact, 0, len);
8756 ofpact->type = type;
c2d936a4 8757 ofpact->raw = -1;
f25d0cf3
BP
8758 ofpact->len = len;
8759}
ce058104
BP
8760
8761/* Implementation of ofpact_finish_<ENUM>().
8762 *
8763 * Finishes composing a variable-length action (begun using
2bd318de
BP
8764 * ofpact_put_<NAME>()), by padding the action to a multiple of OFPACT_ALIGNTO
8765 * bytes and updating its embedded length field. See the large comment near
ebe12cd3
JS
8766 * the end of ofp-actions.h for more information.
8767 *
8768 * May reallocate 'ofpacts'. Callers should consider updating their 'ofpact'
8769 * pointer to the return value of this function. */
8770void *
34abaa3d 8771ofpact_finish(struct ofpbuf *ofpacts, struct ofpact *ofpact)
f25d0cf3 8772{
5308056f
JS
8773 ptrdiff_t len;
8774
6fd6ed71 8775 ovs_assert(ofpact == ofpacts->header);
5308056f 8776 len = (char *) ofpbuf_tail(ofpacts) - (char *) ofpact;
847b5649 8777 ovs_assert(len > 0 && len <= UINT16_MAX);
5308056f 8778 ofpact->len = len;
2bd318de 8779 ofpbuf_padto(ofpacts, OFPACT_ALIGN(ofpacts->size));
ebe12cd3
JS
8780
8781 return ofpacts->header;
f25d0cf3 8782}
c2d936a4 8783\f
cab50449 8784static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8785ofpact_parse(enum ofpact_type type, char *value,
8786 const struct ofputil_port_map *port_map, struct ofpbuf *ofpacts,
c2d936a4
BP
8787 enum ofputil_protocol *usable_protocols)
8788{
8789 switch (type) {
50f96b10 8790#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \
c2d936a4 8791 case OFPACT_##ENUM: \
50f96b10 8792 return parse_##ENUM(value, port_map, ofpacts, usable_protocols);
c2d936a4
BP
8793 OFPACTS
8794#undef OFPACT
8795 default:
8796 OVS_NOT_REACHED();
8797 }
8798}
8799
8800static bool
8801ofpact_type_from_name(const char *name, enum ofpact_type *type)
8802{
8803#define OFPACT(ENUM, STRUCT, MEMBER, NAME) \
8804 if (!strcasecmp(name, NAME)) { \
8805 *type = OFPACT_##ENUM; \
8806 return true; \
8807 }
8808 OFPACTS
8809#undef OFPACT
8810
8811 return false;
8812}
8813
8814/* Parses 'str' as a series of instructions, and appends them to 'ofpacts'.
8815 *
8816 * Returns NULL if successful, otherwise a malloc()'d string describing the
d824b5b7
JS
8817 * error. The caller is responsible for freeing the returned string.
8818 *
8819 * If 'outer_action' is specified, indicates that the actions being parsed
8820 * are nested within another action of the type specified in 'outer_action'. */
cab50449 8821static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8822ofpacts_parse__(char *str, const struct ofputil_port_map *port_map,
8823 struct ofpbuf *ofpacts,
c2d936a4 8824 enum ofputil_protocol *usable_protocols,
d824b5b7 8825 bool allow_instructions, enum ofpact_type outer_action)
c2d936a4
BP
8826{
8827 int prev_inst = -1;
8828 enum ofperr retval;
8829 char *key, *value;
8830 bool drop = false;
8831 char *pos;
8832
8833 pos = str;
8834 while (ofputil_parse_key_value(&pos, &key, &value)) {
8835 enum ovs_instruction_type inst = OVSINST_OFPIT11_APPLY_ACTIONS;
8836 enum ofpact_type type;
8837 char *error = NULL;
8838 ofp_port_t port;
8839
8840 if (ofpact_type_from_name(key, &type)) {
50f96b10
BP
8841 error = ofpact_parse(type, value, port_map,
8842 ofpacts, usable_protocols);
c2d936a4
BP
8843 inst = ovs_instruction_type_from_ofpact_type(type);
8844 } else if (!strcasecmp(key, "mod_vlan_vid")) {
8845 error = parse_set_vlan_vid(value, ofpacts, true);
8846 } else if (!strcasecmp(key, "mod_vlan_pcp")) {
8847 error = parse_set_vlan_pcp(value, ofpacts, true);
8848 } else if (!strcasecmp(key, "set_nw_ttl")) {
50f96b10
BP
8849 error = parse_SET_IP_TTL(value, port_map,
8850 ofpacts, usable_protocols);
c2d936a4
BP
8851 } else if (!strcasecmp(key, "pop_vlan")) {
8852 error = parse_pop_vlan(ofpacts);
8853 } else if (!strcasecmp(key, "set_tunnel64")) {
8854 error = parse_set_tunnel(value, ofpacts,
8855 NXAST_RAW_SET_TUNNEL64);
7eb4b1f1
BP
8856 } else if (!strcasecmp(key, "load")) {
8857 error = parse_reg_load(value, ofpacts);
c2d936a4 8858 } else if (!strcasecmp(key, "bundle_load")) {
50f96b10 8859 error = parse_bundle_load(value, port_map, ofpacts);
c2d936a4
BP
8860 } else if (!strcasecmp(key, "drop")) {
8861 drop = true;
8862 } else if (!strcasecmp(key, "apply_actions")) {
8863 return xstrdup("apply_actions is the default instruction");
50f96b10 8864 } else if (ofputil_port_from_string(key, port_map, &port)) {
c2d936a4
BP
8865 ofpact_put_OUTPUT(ofpacts)->port = port;
8866 } else {
8867 return xasprintf("unknown action %s", key);
8868 }
8869 if (error) {
8870 return error;
8871 }
8872
8873 if (inst != OVSINST_OFPIT11_APPLY_ACTIONS) {
8874 if (!allow_instructions) {
8875 return xasprintf("only actions are allowed here (not "
8876 "instruction %s)",
8877 ovs_instruction_name_from_type(inst));
8878 }
8879 if (inst == prev_inst) {
8880 return xasprintf("instruction %s may be specified only once",
8881 ovs_instruction_name_from_type(inst));
8882 }
8883 }
8884 if (prev_inst != -1 && inst < prev_inst) {
8885 return xasprintf("instruction %s must be specified before %s",
8886 ovs_instruction_name_from_type(inst),
8887 ovs_instruction_name_from_type(prev_inst));
8888 }
8889 prev_inst = inst;
8890 }
c2d936a4 8891
6fd6ed71 8892 if (drop && ofpacts->size) {
c2d936a4
BP
8893 return xstrdup("\"drop\" must not be accompanied by any other action "
8894 "or instruction");
8895 }
8896
6fd6ed71 8897 retval = ofpacts_verify(ofpacts->data, ofpacts->size,
c2d936a4
BP
8898 (allow_instructions
8899 ? (1u << N_OVS_INSTRUCTIONS) - 1
d824b5b7
JS
8900 : 1u << OVSINST_OFPIT11_APPLY_ACTIONS),
8901 outer_action);
c2d936a4
BP
8902 if (retval) {
8903 return xstrdup("Incorrect instruction ordering");
8904 }
8905
8906 return NULL;
8907}
8908
cab50449 8909static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8910ofpacts_parse(char *str, const struct ofputil_port_map *port_map,
8911 struct ofpbuf *ofpacts, enum ofputil_protocol *usable_protocols,
8912 bool allow_instructions, enum ofpact_type outer_action)
c2d936a4 8913{
6fd6ed71 8914 uint32_t orig_size = ofpacts->size;
50f96b10 8915 char *error = ofpacts_parse__(str, port_map, ofpacts, usable_protocols,
d824b5b7 8916 allow_instructions, outer_action);
c2d936a4 8917 if (error) {
6fd6ed71 8918 ofpacts->size = orig_size;
c2d936a4
BP
8919 }
8920 return error;
8921}
8922
cab50449 8923static char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8924ofpacts_parse_copy(const char *s_, const struct ofputil_port_map *port_map,
8925 struct ofpbuf *ofpacts,
c2d936a4 8926 enum ofputil_protocol *usable_protocols,
d824b5b7 8927 bool allow_instructions, enum ofpact_type outer_action)
c2d936a4
BP
8928{
8929 char *error, *s;
8930
8931 *usable_protocols = OFPUTIL_P_ANY;
8932
8933 s = xstrdup(s_);
50f96b10
BP
8934 error = ofpacts_parse(s, port_map, ofpacts, usable_protocols,
8935 allow_instructions, outer_action);
c2d936a4
BP
8936 free(s);
8937
8938 return error;
8939}
8940
8941/* Parses 's' as a set of OpenFlow actions and appends the actions to
d824b5b7
JS
8942 * 'ofpacts'. 'outer_action', if nonzero, specifies that 's' contains actions
8943 * that are nested within the action of type 'outer_action'.
c2d936a4
BP
8944 *
8945 * Returns NULL if successful, otherwise a malloc()'d string describing the
8946 * error. The caller is responsible for freeing the returned string. */
cab50449 8947char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8948ofpacts_parse_actions(const char *s, const struct ofputil_port_map *port_map,
8949 struct ofpbuf *ofpacts,
c2d936a4
BP
8950 enum ofputil_protocol *usable_protocols)
8951{
50f96b10
BP
8952 return ofpacts_parse_copy(s, port_map, ofpacts, usable_protocols,
8953 false, 0);
c2d936a4
BP
8954}
8955
8956/* Parses 's' as a set of OpenFlow instructions and appends the instructions to
8957 * 'ofpacts'.
8958 *
8959 * Returns NULL if successful, otherwise a malloc()'d string describing the
8960 * error. The caller is responsible for freeing the returned string. */
cab50449 8961char * OVS_WARN_UNUSED_RESULT
50f96b10
BP
8962ofpacts_parse_instructions(const char *s,
8963 const struct ofputil_port_map *port_map,
8964 struct ofpbuf *ofpacts,
c2d936a4
BP
8965 enum ofputil_protocol *usable_protocols)
8966{
50f96b10 8967 return ofpacts_parse_copy(s, port_map, ofpacts, usable_protocols, true, 0);
c2d936a4 8968}
08d1e234
BP
8969
8970const char *
8971ofpact_name(enum ofpact_type type)
8972{
8973 switch (type) {
8974#define OFPACT(ENUM, STRUCT, MEMBER, NAME) case OFPACT_##ENUM: return NAME;
8975 OFPACTS
8976#undef OFPACT
8977 }
8978 return "<unknown>";
8979}
c2d936a4
BP
8980\f
8981/* Low-level action decoding and encoding functions. */
8982
8983/* Everything needed to identify a particular OpenFlow action. */
8984struct ofpact_hdrs {
8985 uint32_t vendor; /* 0 if standard, otherwise a vendor code. */
8986 uint16_t type; /* Type if standard, otherwise subtype. */
8987 uint8_t ofp_version; /* From ofp_header. */
8988};
8989
8990/* Information about a particular OpenFlow action. */
8991struct ofpact_raw_instance {
8992 /* The action's identity. */
8993 struct ofpact_hdrs hdrs;
8994 enum ofp_raw_action_type raw;
8995
8996 /* Looking up the action. */
8997 struct hmap_node decode_node; /* Based on 'hdrs'. */
8998 struct hmap_node encode_node; /* Based on 'raw' + 'hdrs.ofp_version'. */
8999
9000 /* The action's encoded size.
9001 *
9002 * If this action is fixed-length, 'min_length' == 'max_length'.
9003 * If it is variable length, then 'max_length' is ROUND_DOWN(UINT16_MAX,
9004 * OFP_ACTION_ALIGN) == 65528. */
9005 unsigned short int min_length;
9006 unsigned short int max_length;
9007
9008 /* For actions with a simple integer numeric argument, 'arg_ofs' is the
9009 * offset of that argument from the beginning of the action and 'arg_len'
9010 * its length, both in bytes.
9011 *
9012 * For actions that take other forms, these are both zero. */
9013 unsigned short int arg_ofs;
9014 unsigned short int arg_len;
9015
9016 /* The name of the action, e.g. "OFPAT_OUTPUT" or "NXAST_RESUBMIT". */
9017 const char *name;
9018
9019 /* If this action is deprecated, a human-readable string with a brief
9020 * explanation. */
9021 const char *deprecation;
9022};
9023
9024/* Action header. */
9025struct ofp_action_header {
9026 /* The meaning of other values of 'type' generally depends on the OpenFlow
9027 * version (see enum ofp_raw_action_type).
9028 *
9029 * Across all OpenFlow versions, OFPAT_VENDOR indicates that 'vendor'
9030 * designates an OpenFlow vendor ID and that the remainder of the action
9031 * structure has a vendor-defined meaning.
9032 */
9033#define OFPAT_VENDOR 0xffff
9034 ovs_be16 type;
9035
9036 /* Always a multiple of 8. */
9037 ovs_be16 len;
9038
9039 /* For type == OFPAT_VENDOR only, this is a vendor ID, e.g. NX_VENDOR_ID or
9040 * ONF_VENDOR_ID. Other 'type's use this space for some other purpose. */
9041 ovs_be32 vendor;
9042};
9043OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
9044
c2d936a4
BP
9045static bool
9046ofpact_hdrs_equal(const struct ofpact_hdrs *a,
9047 const struct ofpact_hdrs *b)
9048{
9049 return (a->vendor == b->vendor
9050 && a->type == b->type
9051 && a->ofp_version == b->ofp_version);
9052}
9053
9054static uint32_t
9055ofpact_hdrs_hash(const struct ofpact_hdrs *hdrs)
9056{
9057 return hash_2words(hdrs->vendor, (hdrs->type << 16) | hdrs->ofp_version);
9058}
9059
9060#include "ofp-actions.inc2"
9061
9062static struct hmap *
9063ofpact_decode_hmap(void)
9064{
9065 static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
9066 static struct hmap hmap;
9067
9068 if (ovsthread_once_start(&once)) {
9069 struct ofpact_raw_instance *inst;
9070
9071 hmap_init(&hmap);
9072 for (inst = all_raw_instances;
9073 inst < &all_raw_instances[ARRAY_SIZE(all_raw_instances)];
9074 inst++) {
9075 hmap_insert(&hmap, &inst->decode_node,
9076 ofpact_hdrs_hash(&inst->hdrs));
9077 }
9078 ovsthread_once_done(&once);
9079 }
9080 return &hmap;
9081}
9082
9083static struct hmap *
9084ofpact_encode_hmap(void)
9085{
9086 static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
9087 static struct hmap hmap;
9088
9089 if (ovsthread_once_start(&once)) {
9090 struct ofpact_raw_instance *inst;
9091
9092 hmap_init(&hmap);
9093 for (inst = all_raw_instances;
9094 inst < &all_raw_instances[ARRAY_SIZE(all_raw_instances)];
9095 inst++) {
9096 hmap_insert(&hmap, &inst->encode_node,
9097 hash_2words(inst->raw, inst->hdrs.ofp_version));
9098 }
9099 ovsthread_once_done(&once);
9100 }
9101 return &hmap;
9102}
9103
9104static enum ofperr
9105ofpact_decode_raw(enum ofp_version ofp_version,
9106 const struct ofp_action_header *oah, size_t length,
9107 const struct ofpact_raw_instance **instp)
9108{
9109 const struct ofpact_raw_instance *inst;
9110 struct ofpact_hdrs hdrs;
9111
9112 *instp = NULL;
9113 if (length < sizeof *oah) {
9114 return OFPERR_OFPBAC_BAD_LEN;
9115 }
9116
9117 /* Get base action type. */
9118 if (oah->type == htons(OFPAT_VENDOR)) {
9119 /* Get vendor. */
9120 hdrs.vendor = ntohl(oah->vendor);
232c1e12
BP
9121 if (hdrs.vendor == NX_VENDOR_ID || hdrs.vendor == ONF_VENDOR_ID) {
9122 /* Get extension subtype. */
9123 const struct ext_action_header *nah;
c2d936a4 9124
232c1e12 9125 nah = ALIGNED_CAST(const struct ext_action_header *, oah);
c2d936a4
BP
9126 if (length < sizeof *nah) {
9127 return OFPERR_OFPBAC_BAD_LEN;
9128 }
9129 hdrs.type = ntohs(nah->subtype);
9130 } else {
9131 VLOG_WARN_RL(&rl, "OpenFlow action has unknown vendor %#"PRIx32,
9132 hdrs.vendor);
9133 return OFPERR_OFPBAC_BAD_VENDOR;
9134 }
9135 } else {
9136 hdrs.vendor = 0;
9137 hdrs.type = ntohs(oah->type);
9138 }
9139
9140 hdrs.ofp_version = ofp_version;
9141 HMAP_FOR_EACH_WITH_HASH (inst, decode_node, ofpact_hdrs_hash(&hdrs),
9142 ofpact_decode_hmap()) {
9143 if (ofpact_hdrs_equal(&hdrs, &inst->hdrs)) {
9144 *instp = inst;
9145 return 0;
9146 }
9147 }
9148
9149 return (hdrs.vendor
9150 ? OFPERR_OFPBAC_BAD_VENDOR_TYPE
9151 : OFPERR_OFPBAC_BAD_TYPE);
9152}
9153
9154static enum ofperr
9155ofpact_pull_raw(struct ofpbuf *buf, enum ofp_version ofp_version,
9156 enum ofp_raw_action_type *raw, uint64_t *arg)
9157{
6fd6ed71 9158 const struct ofp_action_header *oah = buf->data;
c2d936a4
BP
9159 const struct ofpact_raw_instance *action;
9160 unsigned int length;
9161 enum ofperr error;
9162
9163 *raw = *arg = 0;
6fd6ed71 9164 error = ofpact_decode_raw(ofp_version, oah, buf->size, &action);
c2d936a4
BP
9165 if (error) {
9166 return error;
9167 }
9168
9169 if (action->deprecation) {
9170 VLOG_INFO_RL(&rl, "%s is deprecated in %s (%s)",
9171 action->name, ofputil_version_to_string(ofp_version),
9172 action->deprecation);
9173 }
9174
9175 length = ntohs(oah->len);
6fd6ed71 9176 if (length > buf->size) {
b153b990 9177 VLOG_WARN_RL(&rl, "OpenFlow action %s length %u exceeds action buffer "
6fd6ed71 9178 "length %"PRIu32, action->name, length, buf->size);
b153b990
BP
9179 return OFPERR_OFPBAC_BAD_LEN;
9180 }
c2d936a4
BP
9181 if (length < action->min_length || length > action->max_length) {
9182 VLOG_WARN_RL(&rl, "OpenFlow action %s length %u not in valid range "
9183 "[%hu,%hu]", action->name, length,
9184 action->min_length, action->max_length);
9185 return OFPERR_OFPBAC_BAD_LEN;
9186 }
9187 if (length % 8) {
9188 VLOG_WARN_RL(&rl, "OpenFlow action %s length %u is not a multiple "
9189 "of 8", action->name, length);
9190 return OFPERR_OFPBAC_BAD_LEN;
9191 }
9192
9193 *raw = action->raw;
9194 *arg = 0;
9195 if (action->arg_len) {
9196 const uint8_t *p;
9197 int i;
9198
9199 p = ofpbuf_at_assert(buf, action->arg_ofs, action->arg_len);
9200 for (i = 0; i < action->arg_len; i++) {
9201 *arg = (*arg << 8) | p[i];
9202 }
9203 }
9204
9205 ofpbuf_pull(buf, length);
9206
9207 return 0;
9208}
9209
9210static const struct ofpact_raw_instance *
9211ofpact_raw_lookup(enum ofp_version ofp_version, enum ofp_raw_action_type raw)
9212{
9213 const struct ofpact_raw_instance *inst;
9214
9215 HMAP_FOR_EACH_WITH_HASH (inst, encode_node, hash_2words(raw, ofp_version),
9216 ofpact_encode_hmap()) {
9217 if (inst->raw == raw && inst->hdrs.ofp_version == ofp_version) {
9218 return inst;
9219 }
9220 }
9221 OVS_NOT_REACHED();
9222}
9223
9224static void *
9225ofpact_put_raw(struct ofpbuf *buf, enum ofp_version ofp_version,
9226 enum ofp_raw_action_type raw, uint64_t arg)
9227{
9228 const struct ofpact_raw_instance *inst;
9229 struct ofp_action_header *oah;
9230 const struct ofpact_hdrs *hdrs;
9231
9232 inst = ofpact_raw_lookup(ofp_version, raw);
9233 hdrs = &inst->hdrs;
9234
9235 oah = ofpbuf_put_zeros(buf, inst->min_length);
9236 oah->type = htons(hdrs->vendor ? OFPAT_VENDOR : hdrs->type);
9237 oah->len = htons(inst->min_length);
9238 oah->vendor = htonl(hdrs->vendor);
9239
9240 switch (hdrs->vendor) {
9241 case 0:
9242 break;
9243
232c1e12
BP
9244 case NX_VENDOR_ID:
9245 case ONF_VENDOR_ID: {
9246 struct ext_action_header *nah = (struct ext_action_header *) oah;
c2d936a4
BP
9247 nah->subtype = htons(hdrs->type);
9248 break;
9249 }
9250
9251 default:
9252 OVS_NOT_REACHED();
9253 }
9254
9255 if (inst->arg_len) {
9256 uint8_t *p = (uint8_t *) oah + inst->arg_ofs + inst->arg_len;
9257 int i;
9258
9259 for (i = 0; i < inst->arg_len; i++) {
9260 *--p = arg;
9261 arg >>= 8;
9262 }
9263 } else {
9264 ovs_assert(!arg);
9265 }
9266
9267 return oah;
9268}
178742f9
BP
9269
9270static void
9271pad_ofpat(struct ofpbuf *openflow, size_t start_ofs)
9272{
9273 struct ofp_action_header *oah;
9274
9ac0aada
JR
9275 ofpbuf_put_zeros(openflow, PAD_SIZE(openflow->size - start_ofs,
9276 OFP_ACTION_ALIGN));
178742f9
BP
9277
9278 oah = ofpbuf_at_assert(openflow, start_ofs, sizeof *oah);
6fd6ed71 9279 oah->len = htons(openflow->size - start_ofs);
178742f9
BP
9280}
9281