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