Remove unused variables and functions.
[sliver-openvswitch.git] / lib / ofp-parse.c
1 /*
2  * Copyright (c) 2010, 2011, 2012, 2013 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
19 #include "ofp-parse.h"
20
21 #include <ctype.h>
22 #include <errno.h>
23 #include <stdlib.h>
24
25 #include "bundle.h"
26 #include "byte-order.h"
27 #include "dynamic-string.h"
28 #include "learn.h"
29 #include "meta-flow.h"
30 #include "multipath.h"
31 #include "netdev.h"
32 #include "nx-match.h"
33 #include "ofp-actions.h"
34 #include "ofp-util.h"
35 #include "ofpbuf.h"
36 #include "openflow/openflow.h"
37 #include "ovs-thread.h"
38 #include "packets.h"
39 #include "socket-util.h"
40 #include "vconn.h"
41
42 /* Parses 'str' as an 8-bit unsigned integer into '*valuep'.
43  *
44  * 'name' describes the value parsed in an error message, if any.
45  *
46  * Returns NULL if successful, otherwise a malloc()'d string describing the
47  * error.  The caller is responsible for freeing the returned string. */
48 static char * WARN_UNUSED_RESULT
49 str_to_u8(const char *str, const char *name, uint8_t *valuep)
50 {
51     int value;
52
53     if (!str_to_int(str, 0, &value) || value < 0 || value > 255) {
54         return xasprintf("invalid %s \"%s\"", name, str);
55     }
56     *valuep = value;
57     return NULL;
58 }
59
60 /* Parses 'str' as a 16-bit unsigned integer into '*valuep'.
61  *
62  * 'name' describes the value parsed in an error message, if any.
63  *
64  * Returns NULL if successful, otherwise a malloc()'d string describing the
65  * error.  The caller is responsible for freeing the returned string. */
66 static char * WARN_UNUSED_RESULT
67 str_to_u16(const char *str, const char *name, uint16_t *valuep)
68 {
69     int value;
70
71     if (!str_to_int(str, 0, &value) || value < 0 || value > 65535) {
72         return xasprintf("invalid %s \"%s\"", name, str);
73     }
74     *valuep = value;
75     return NULL;
76 }
77
78 /* Parses 'str' as a 32-bit unsigned integer into '*valuep'.
79  *
80  * Returns NULL if successful, otherwise a malloc()'d string describing the
81  * error.  The caller is responsible for freeing the returned string. */
82 static char * WARN_UNUSED_RESULT
83 str_to_u32(const char *str, uint32_t *valuep)
84 {
85     char *tail;
86     uint32_t value;
87
88     if (!str[0]) {
89         return xstrdup("missing required numeric argument");
90     }
91
92     errno = 0;
93     value = strtoul(str, &tail, 0);
94     if (errno == EINVAL || errno == ERANGE || *tail) {
95         return xasprintf("invalid numeric format %s", str);
96     }
97     *valuep = value;
98     return NULL;
99 }
100
101 /* Parses 'str' as an 64-bit unsigned integer into '*valuep'.
102  *
103  * Returns NULL if successful, otherwise a malloc()'d string describing the
104  * error.  The caller is responsible for freeing the returned string. */
105 static char * WARN_UNUSED_RESULT
106 str_to_u64(const char *str, uint64_t *valuep)
107 {
108     char *tail;
109     uint64_t value;
110
111     if (!str[0]) {
112         return xstrdup("missing required numeric argument");
113     }
114
115     errno = 0;
116     value = strtoull(str, &tail, 0);
117     if (errno == EINVAL || errno == ERANGE || *tail) {
118         return xasprintf("invalid numeric format %s", str);
119     }
120     *valuep = value;
121     return NULL;
122 }
123
124 /* Parses 'str' as an 64-bit unsigned integer in network byte order into
125  * '*valuep'.
126  *
127  * Returns NULL if successful, otherwise a malloc()'d string describing the
128  * error.  The caller is responsible for freeing the returned string. */
129 static char * WARN_UNUSED_RESULT
130 str_to_be64(const char *str, ovs_be64 *valuep)
131 {
132     uint64_t value = 0;
133     char *error;
134
135     error = str_to_u64(str, &value);
136     if (!error) {
137         *valuep = htonll(value);
138     }
139     return error;
140 }
141
142 /* Parses 'str' as an Ethernet address into 'mac'.
143  *
144  * Returns NULL if successful, otherwise a malloc()'d string describing the
145  * error.  The caller is responsible for freeing the returned string. */
146 static char * WARN_UNUSED_RESULT
147 str_to_mac(const char *str, uint8_t mac[6])
148 {
149     if (sscanf(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac))
150         != ETH_ADDR_SCAN_COUNT) {
151         return xasprintf("invalid mac address %s", str);
152     }
153     return NULL;
154 }
155
156 /* Parses 'str' as an IP address into '*ip'.
157  *
158  * Returns NULL if successful, otherwise a malloc()'d string describing the
159  * error.  The caller is responsible for freeing the returned string. */
160 static char * WARN_UNUSED_RESULT
161 str_to_ip(const char *str, ovs_be32 *ip)
162 {
163     struct in_addr in_addr;
164
165     if (lookup_ip(str, &in_addr)) {
166         return xasprintf("%s: could not convert to IP address", str);
167     }
168     *ip = in_addr.s_addr;
169     return NULL;
170 }
171
172 /* Parses 'arg' as the argument to an "enqueue" action, and appends such an
173  * action to 'ofpacts'.
174  *
175  * Returns NULL if successful, otherwise a malloc()'d string describing the
176  * error.  The caller is responsible for freeing the returned string. */
177 static char * WARN_UNUSED_RESULT
178 parse_enqueue(char *arg, struct ofpbuf *ofpacts)
179 {
180     char *sp = NULL;
181     char *port = strtok_r(arg, ":q", &sp);
182     char *queue = strtok_r(NULL, "", &sp);
183     struct ofpact_enqueue *enqueue;
184
185     if (port == NULL || queue == NULL) {
186         return xstrdup("\"enqueue\" syntax is \"enqueue:PORT:QUEUE\"");
187     }
188
189     enqueue = ofpact_put_ENQUEUE(ofpacts);
190     if (!ofputil_port_from_string(port, &enqueue->port)) {
191         return xasprintf("%s: enqueue to unknown port", port);
192     }
193     return str_to_u32(queue, &enqueue->queue);
194 }
195
196 /* Parses 'arg' as the argument to an "output" action, and appends such an
197  * action to 'ofpacts'.
198  *
199  * Returns NULL if successful, otherwise a malloc()'d string describing the
200  * error.  The caller is responsible for freeing the returned string. */
201 static char * WARN_UNUSED_RESULT
202 parse_output(const char *arg, struct ofpbuf *ofpacts)
203 {
204     if (strchr(arg, '[')) {
205         struct ofpact_output_reg *output_reg;
206
207         output_reg = ofpact_put_OUTPUT_REG(ofpacts);
208         output_reg->max_len = UINT16_MAX;
209         return mf_parse_subfield(&output_reg->src, arg);
210     } else {
211         struct ofpact_output *output;
212
213         output = ofpact_put_OUTPUT(ofpacts);
214         output->max_len = output->port == OFPP_CONTROLLER ? UINT16_MAX : 0;
215         if (!ofputil_port_from_string(arg, &output->port)) {
216             return xasprintf("%s: output to unknown port", arg);
217         }
218         return NULL;
219     }
220 }
221
222 /* Parses 'arg' as the argument to an "resubmit" action, and appends such an
223  * action to 'ofpacts'.
224  *
225  * Returns NULL if successful, otherwise a malloc()'d string describing the
226  * error.  The caller is responsible for freeing the returned string. */
227 static char * WARN_UNUSED_RESULT
228 parse_resubmit(char *arg, struct ofpbuf *ofpacts)
229 {
230     struct ofpact_resubmit *resubmit;
231     char *in_port_s, *table_s;
232
233     resubmit = ofpact_put_RESUBMIT(ofpacts);
234
235     in_port_s = strsep(&arg, ",");
236     if (in_port_s && in_port_s[0]) {
237         if (!ofputil_port_from_string(in_port_s, &resubmit->in_port)) {
238             return xasprintf("%s: resubmit to unknown port", in_port_s);
239         }
240     } else {
241         resubmit->in_port = OFPP_IN_PORT;
242     }
243
244     table_s = strsep(&arg, ",");
245     if (table_s && table_s[0]) {
246         uint32_t table_id = 0;
247         char *error;
248
249         error = str_to_u32(table_s, &table_id);
250         if (error) {
251             return error;
252         }
253         resubmit->table_id = table_id;
254     } else {
255         resubmit->table_id = 255;
256     }
257
258     if (resubmit->in_port == OFPP_IN_PORT && resubmit->table_id == 255) {
259         return xstrdup("at least one \"in_port\" or \"table\" must be "
260                        "specified  on resubmit");
261     }
262     return NULL;
263 }
264
265 /* Parses 'arg' as the argument to a "note" action, and appends such an action
266  * to 'ofpacts'.
267  *
268  * Returns NULL if successful, otherwise a malloc()'d string describing the
269  * error.  The caller is responsible for freeing the returned string. */
270 static char * WARN_UNUSED_RESULT
271 parse_note(const char *arg, struct ofpbuf *ofpacts)
272 {
273     struct ofpact_note *note;
274
275     note = ofpact_put_NOTE(ofpacts);
276     while (*arg != '\0') {
277         uint8_t byte;
278         bool ok;
279
280         if (*arg == '.') {
281             arg++;
282         }
283         if (*arg == '\0') {
284             break;
285         }
286
287         byte = hexits_value(arg, 2, &ok);
288         if (!ok) {
289             return xstrdup("bad hex digit in `note' argument");
290         }
291         ofpbuf_put(ofpacts, &byte, 1);
292
293         note = ofpacts->l2;
294         note->length++;
295
296         arg += 2;
297     }
298     ofpact_update_len(ofpacts, &note->ofpact);
299     return NULL;
300 }
301
302 /* Parses 'arg' as the argument to a "fin_timeout" action, and appends such an
303  * action to 'ofpacts'.
304  *
305  * Returns NULL if successful, otherwise a malloc()'d string describing the
306  * error.  The caller is responsible for freeing the returned string. */
307 static char * WARN_UNUSED_RESULT
308 parse_fin_timeout(struct ofpbuf *b, char *arg)
309 {
310     struct ofpact_fin_timeout *oft = ofpact_put_FIN_TIMEOUT(b);
311     char *key, *value;
312
313     while (ofputil_parse_key_value(&arg, &key, &value)) {
314         char *error;
315
316         if (!strcmp(key, "idle_timeout")) {
317             error =  str_to_u16(value, key, &oft->fin_idle_timeout);
318         } else if (!strcmp(key, "hard_timeout")) {
319             error = str_to_u16(value, key, &oft->fin_hard_timeout);
320         } else {
321             error = xasprintf("invalid key '%s' in 'fin_timeout' argument",
322                               key);
323         }
324
325         if (error) {
326             return error;
327         }
328     }
329     return NULL;
330 }
331
332 /* Parses 'arg' as the argument to a "controller" action, and appends such an
333  * action to 'ofpacts'.
334  *
335  * Returns NULL if successful, otherwise a malloc()'d string describing the
336  * error.  The caller is responsible for freeing the returned string. */
337 static char * WARN_UNUSED_RESULT
338 parse_controller(struct ofpbuf *b, char *arg)
339 {
340     enum ofp_packet_in_reason reason = OFPR_ACTION;
341     uint16_t controller_id = 0;
342     uint16_t max_len = UINT16_MAX;
343
344     if (!arg[0]) {
345         /* Use defaults. */
346     } else if (strspn(arg, "0123456789") == strlen(arg)) {
347         char *error = str_to_u16(arg, "max_len", &max_len);
348         if (error) {
349             return error;
350         }
351     } else {
352         char *name, *value;
353
354         while (ofputil_parse_key_value(&arg, &name, &value)) {
355             if (!strcmp(name, "reason")) {
356                 if (!ofputil_packet_in_reason_from_string(value, &reason)) {
357                     return xasprintf("unknown reason \"%s\"", value);
358                 }
359             } else if (!strcmp(name, "max_len")) {
360                 char *error = str_to_u16(value, "max_len", &max_len);
361                 if (error) {
362                     return error;
363                 }
364             } else if (!strcmp(name, "id")) {
365                 char *error = str_to_u16(value, "id", &controller_id);
366                 if (error) {
367                     return error;
368                 }
369             } else {
370                 return xasprintf("unknown key \"%s\" parsing controller "
371                                  "action", name);
372             }
373         }
374     }
375
376     if (reason == OFPR_ACTION && controller_id == 0) {
377         struct ofpact_output *output;
378
379         output = ofpact_put_OUTPUT(b);
380         output->port = OFPP_CONTROLLER;
381         output->max_len = max_len;
382     } else {
383         struct ofpact_controller *controller;
384
385         controller = ofpact_put_CONTROLLER(b);
386         controller->max_len = max_len;
387         controller->reason = reason;
388         controller->controller_id = controller_id;
389     }
390
391     return NULL;
392 }
393
394 static void
395 parse_noargs_dec_ttl(struct ofpbuf *b)
396 {
397     struct ofpact_cnt_ids *ids;
398     uint16_t id = 0;
399
400     ids = ofpact_put_DEC_TTL(b);
401     ofpbuf_put(b, &id, sizeof id);
402     ids = b->l2;
403     ids->n_controllers++;
404     ofpact_update_len(b, &ids->ofpact);
405 }
406
407 /* Parses 'arg' as the argument to a "dec_ttl" action, and appends such an
408  * action to 'ofpacts'.
409  *
410  * Returns NULL if successful, otherwise a malloc()'d string describing the
411  * error.  The caller is responsible for freeing the returned string. */
412 static char * WARN_UNUSED_RESULT
413 parse_dec_ttl(struct ofpbuf *b, char *arg)
414 {
415     if (*arg == '\0') {
416         parse_noargs_dec_ttl(b);
417     } else {
418         struct ofpact_cnt_ids *ids;
419         char *cntr;
420
421         ids = ofpact_put_DEC_TTL(b);
422         ids->ofpact.compat = OFPUTIL_NXAST_DEC_TTL_CNT_IDS;
423         for (cntr = strtok_r(arg, ", ", &arg); cntr != NULL;
424              cntr = strtok_r(NULL, ", ", &arg)) {
425             uint16_t id = atoi(cntr);
426
427             ofpbuf_put(b, &id, sizeof id);
428             ids = b->l2;
429             ids->n_controllers++;
430         }
431         if (!ids->n_controllers) {
432             return xstrdup("dec_ttl_cnt_ids: expected at least one controller "
433                            "id.");
434         }
435         ofpact_update_len(b, &ids->ofpact);
436     }
437     return NULL;
438 }
439
440 /* Parses 'arg' as the argument to a "set_mpls_ttl" action, and appends such an
441  * action to 'ofpacts'.
442  *
443  * Returns NULL if successful, otherwise a malloc()'d string describing the
444  * error.  The caller is responsible for freeing the returned string. */
445 static char * WARN_UNUSED_RESULT
446 parse_set_mpls_ttl(struct ofpbuf *b, const char *arg)
447 {
448     struct ofpact_mpls_ttl *mpls_ttl = ofpact_put_SET_MPLS_TTL(b);
449
450     if (*arg == '\0') {
451         return xstrdup("parse_set_mpls_ttl: expected ttl.");
452     }
453
454     mpls_ttl->ttl = atoi(arg);
455     return NULL;
456 }
457
458 /* Parses a "set_field" action with argument 'arg', appending the parsed
459  * action to 'ofpacts'.
460  *
461  * Returns NULL if successful, otherwise a malloc()'d string describing the
462  * error.  The caller is responsible for freeing the returned string. */
463 static char * WARN_UNUSED_RESULT
464 set_field_parse__(char *arg, struct ofpbuf *ofpacts,
465                   enum ofputil_protocol *usable_protocols)
466 {
467     struct ofpact_reg_load *load = ofpact_put_REG_LOAD(ofpacts);
468     char *value;
469     char *delim;
470     char *key;
471     const struct mf_field *mf;
472     char *error;
473     union mf_value mf_value;
474
475     value = arg;
476     delim = strstr(arg, "->");
477     if (!delim) {
478         return xasprintf("%s: missing `->'", arg);
479     }
480     if (strlen(delim) <= strlen("->")) {
481         return xasprintf("%s: missing field name following `->'", arg);
482     }
483
484     key = delim + strlen("->");
485     mf = mf_from_name(key);
486     if (!mf) {
487         return xasprintf("%s is not a valid OXM field name", key);
488     }
489     if (!mf->writable) {
490         return xasprintf("%s is read-only", key);
491     }
492
493     delim[0] = '\0';
494     error = mf_parse_value(mf, value, &mf_value);
495     if (error) {
496         return error;
497     }
498     if (!mf_is_value_valid(mf, &mf_value)) {
499         return xasprintf("%s is not a valid value for field %s", value, key);
500     }
501     ofpact_set_field_init(load, mf, &mf_value);
502
503     *usable_protocols &= mf->usable_protocols;
504     return NULL;
505 }
506
507 /* Parses 'arg' as the argument to a "set_field" action, and appends such an
508  * action to 'ofpacts'.
509  *
510  * Returns NULL if successful, otherwise a malloc()'d string describing the
511  * error.  The caller is responsible for freeing the returned string. */
512 static char * WARN_UNUSED_RESULT
513 set_field_parse(const char *arg, struct ofpbuf *ofpacts,
514                 enum ofputil_protocol *usable_protocols)
515 {
516     char *copy = xstrdup(arg);
517     char *error = set_field_parse__(copy, ofpacts, usable_protocols);
518     free(copy);
519     return error;
520 }
521
522 /* Parses 'arg' as the argument to a "write_metadata" instruction, and appends
523  * such an action to 'ofpacts'.
524  *
525  * Returns NULL if successful, otherwise a malloc()'d string describing the
526  * error.  The caller is responsible for freeing the returned string. */
527 static char * WARN_UNUSED_RESULT
528 parse_metadata(struct ofpbuf *b, char *arg)
529 {
530     struct ofpact_metadata *om;
531     char *mask = strchr(arg, '/');
532
533     om = ofpact_put_WRITE_METADATA(b);
534
535     if (mask) {
536         char *error;
537
538         *mask = '\0';
539         error = str_to_be64(mask + 1, &om->mask);
540         if (error) {
541             return error;
542         }
543     } else {
544         om->mask = OVS_BE64_MAX;
545     }
546
547     return str_to_be64(arg, &om->metadata);
548 }
549
550 /* Parses 'arg' as the argument to a "sample" action, and appends such an
551  * action to 'ofpacts'.
552  *
553  * Returns NULL if successful, otherwise a malloc()'d string describing the
554  * error.  The caller is responsible for freeing the returned string. */
555 static char * WARN_UNUSED_RESULT
556 parse_sample(struct ofpbuf *b, char *arg)
557 {
558     struct ofpact_sample *os = ofpact_put_SAMPLE(b);
559     char *key, *value;
560
561     while (ofputil_parse_key_value(&arg, &key, &value)) {
562         char *error = NULL;
563
564         if (!strcmp(key, "probability")) {
565             error = str_to_u16(value, "probability", &os->probability);
566             if (!error && os->probability == 0) {
567                 error = xasprintf("invalid probability value \"%s\"", value);
568             }
569         } else if (!strcmp(key, "collector_set_id")) {
570             error = str_to_u32(value, &os->collector_set_id);
571         } else if (!strcmp(key, "obs_domain_id")) {
572             error = str_to_u32(value, &os->obs_domain_id);
573         } else if (!strcmp(key, "obs_point_id")) {
574             error = str_to_u32(value, &os->obs_point_id);
575         } else {
576             error = xasprintf("invalid key \"%s\" in \"sample\" argument",
577                               key);
578         }
579         if (error) {
580             return error;
581         }
582     }
583     if (os->probability == 0) {
584         return xstrdup("non-zero \"probability\" must be specified on sample");
585     }
586     return NULL;
587 }
588
589 /* Parses 'arg' as the argument to action 'code', and appends such an action to
590  * 'ofpacts'.
591  *
592  * Returns NULL if successful, otherwise a malloc()'d string describing the
593  * error.  The caller is responsible for freeing the returned string. */
594 static char * WARN_UNUSED_RESULT
595 parse_named_action(enum ofputil_action_code code,
596                    char *arg, struct ofpbuf *ofpacts,
597                    enum ofputil_protocol *usable_protocols)
598 {
599     size_t orig_size = ofpacts->size;
600     struct ofpact_tunnel *tunnel;
601     char *error = NULL;
602     uint16_t ethertype = 0;
603     uint16_t vid = 0;
604     uint8_t tos = 0;
605     uint8_t pcp = 0;
606
607     switch (code) {
608     case OFPUTIL_ACTION_INVALID:
609         NOT_REACHED();
610
611     case OFPUTIL_OFPAT10_OUTPUT:
612     case OFPUTIL_OFPAT11_OUTPUT:
613         error = parse_output(arg, ofpacts);
614         break;
615
616     case OFPUTIL_OFPAT10_SET_VLAN_VID:
617     case OFPUTIL_OFPAT11_SET_VLAN_VID:
618         error = str_to_u16(arg, "VLAN VID", &vid);
619         if (error) {
620             return error;
621         }
622
623         if (vid & ~VLAN_VID_MASK) {
624             return xasprintf("%s: not a valid VLAN VID", arg);
625         }
626         ofpact_put_SET_VLAN_VID(ofpacts)->vlan_vid = vid;
627         break;
628
629     case OFPUTIL_OFPAT10_SET_VLAN_PCP:
630     case OFPUTIL_OFPAT11_SET_VLAN_PCP:
631         error = str_to_u8(arg, "VLAN PCP", &pcp);
632         if (error) {
633             return error;
634         }
635
636         if (pcp & ~7) {
637             return xasprintf("%s: not a valid VLAN PCP", arg);
638         }
639         ofpact_put_SET_VLAN_PCP(ofpacts)->vlan_pcp = pcp;
640         break;
641
642     case OFPUTIL_OFPAT12_SET_FIELD:
643         return set_field_parse(arg, ofpacts, usable_protocols);
644
645     case OFPUTIL_OFPAT10_STRIP_VLAN:
646     case OFPUTIL_OFPAT11_POP_VLAN:
647         ofpact_put_STRIP_VLAN(ofpacts);
648         break;
649
650     case OFPUTIL_OFPAT11_PUSH_VLAN:
651         *usable_protocols &= OFPUTIL_P_OF11_UP;
652         error = str_to_u16(arg, "ethertype", &ethertype);
653         if (error) {
654             return error;
655         }
656
657         if (ethertype != ETH_TYPE_VLAN_8021Q) {
658             /* XXX ETH_TYPE_VLAN_8021AD case isn't supported */
659             return xasprintf("%s: not a valid VLAN ethertype", arg);
660         }
661
662         ofpact_put_PUSH_VLAN(ofpacts);
663         break;
664
665     case OFPUTIL_OFPAT11_SET_QUEUE:
666         error = str_to_u32(arg, &ofpact_put_SET_QUEUE(ofpacts)->queue_id);
667         break;
668
669     case OFPUTIL_OFPAT10_SET_DL_SRC:
670     case OFPUTIL_OFPAT11_SET_DL_SRC:
671         error = str_to_mac(arg, ofpact_put_SET_ETH_SRC(ofpacts)->mac);
672         break;
673
674     case OFPUTIL_OFPAT10_SET_DL_DST:
675     case OFPUTIL_OFPAT11_SET_DL_DST:
676         error = str_to_mac(arg, ofpact_put_SET_ETH_DST(ofpacts)->mac);
677         break;
678
679     case OFPUTIL_OFPAT10_SET_NW_SRC:
680     case OFPUTIL_OFPAT11_SET_NW_SRC:
681         error = str_to_ip(arg, &ofpact_put_SET_IPV4_SRC(ofpacts)->ipv4);
682         break;
683
684     case OFPUTIL_OFPAT10_SET_NW_DST:
685     case OFPUTIL_OFPAT11_SET_NW_DST:
686         error = str_to_ip(arg, &ofpact_put_SET_IPV4_DST(ofpacts)->ipv4);
687         break;
688
689     case OFPUTIL_OFPAT10_SET_NW_TOS:
690     case OFPUTIL_OFPAT11_SET_NW_TOS:
691         error = str_to_u8(arg, "TOS", &tos);
692         if (error) {
693             return error;
694         }
695
696         if (tos & ~IP_DSCP_MASK) {
697             return xasprintf("%s: not a valid TOS", arg);
698         }
699         ofpact_put_SET_IPV4_DSCP(ofpacts)->dscp = tos;
700         break;
701
702     case OFPUTIL_OFPAT11_DEC_NW_TTL:
703         NOT_REACHED();
704
705     case OFPUTIL_OFPAT10_SET_TP_SRC:
706     case OFPUTIL_OFPAT11_SET_TP_SRC:
707         error = str_to_u16(arg, "source port",
708                            &ofpact_put_SET_L4_SRC_PORT(ofpacts)->port);
709         break;
710
711     case OFPUTIL_OFPAT10_SET_TP_DST:
712     case OFPUTIL_OFPAT11_SET_TP_DST:
713         error = str_to_u16(arg, "destination port",
714                            &ofpact_put_SET_L4_DST_PORT(ofpacts)->port);
715         break;
716
717     case OFPUTIL_OFPAT10_ENQUEUE:
718         error = parse_enqueue(arg, ofpacts);
719         break;
720
721     case OFPUTIL_NXAST_RESUBMIT:
722         error = parse_resubmit(arg, ofpacts);
723         break;
724
725     case OFPUTIL_NXAST_SET_TUNNEL:
726     case OFPUTIL_NXAST_SET_TUNNEL64:
727         tunnel = ofpact_put_SET_TUNNEL(ofpacts);
728         tunnel->ofpact.compat = code;
729         error = str_to_u64(arg, &tunnel->tun_id);
730         break;
731
732     case OFPUTIL_NXAST_WRITE_METADATA:
733         error = parse_metadata(ofpacts, arg);
734         break;
735
736     case OFPUTIL_NXAST_SET_QUEUE:
737         error = str_to_u32(arg, &ofpact_put_SET_QUEUE(ofpacts)->queue_id);
738         break;
739
740     case OFPUTIL_NXAST_POP_QUEUE:
741         ofpact_put_POP_QUEUE(ofpacts);
742         break;
743
744     case OFPUTIL_NXAST_REG_MOVE:
745         error = nxm_parse_reg_move(ofpact_put_REG_MOVE(ofpacts), arg);
746         break;
747
748     case OFPUTIL_NXAST_REG_LOAD:
749         error = nxm_parse_reg_load(ofpact_put_REG_LOAD(ofpacts), arg);
750         break;
751
752     case OFPUTIL_NXAST_NOTE:
753         error = parse_note(arg, ofpacts);
754         break;
755
756     case OFPUTIL_NXAST_MULTIPATH:
757         error = multipath_parse(ofpact_put_MULTIPATH(ofpacts), arg);
758         break;
759
760     case OFPUTIL_NXAST_BUNDLE:
761         error = bundle_parse(arg, ofpacts);
762         break;
763
764     case OFPUTIL_NXAST_BUNDLE_LOAD:
765         error = bundle_parse_load(arg, ofpacts);
766         break;
767
768     case OFPUTIL_NXAST_RESUBMIT_TABLE:
769     case OFPUTIL_NXAST_OUTPUT_REG:
770     case OFPUTIL_NXAST_DEC_TTL_CNT_IDS:
771         NOT_REACHED();
772
773     case OFPUTIL_NXAST_LEARN:
774         error = learn_parse(arg, ofpacts);
775         break;
776
777     case OFPUTIL_NXAST_EXIT:
778         ofpact_put_EXIT(ofpacts);
779         break;
780
781     case OFPUTIL_NXAST_DEC_TTL:
782         error = parse_dec_ttl(ofpacts, arg);
783         break;
784
785     case OFPUTIL_NXAST_SET_MPLS_TTL:
786     case OFPUTIL_OFPAT11_SET_MPLS_TTL:
787         error = parse_set_mpls_ttl(ofpacts, arg);
788         break;
789
790     case OFPUTIL_OFPAT11_DEC_MPLS_TTL:
791     case OFPUTIL_NXAST_DEC_MPLS_TTL:
792         ofpact_put_DEC_MPLS_TTL(ofpacts);
793         break;
794
795     case OFPUTIL_NXAST_FIN_TIMEOUT:
796         error = parse_fin_timeout(ofpacts, arg);
797         break;
798
799     case OFPUTIL_NXAST_CONTROLLER:
800         error = parse_controller(ofpacts, arg);
801         break;
802
803     case OFPUTIL_OFPAT11_PUSH_MPLS:
804     case OFPUTIL_NXAST_PUSH_MPLS:
805         error = str_to_u16(arg, "push_mpls", &ethertype);
806         if (!error) {
807             ofpact_put_PUSH_MPLS(ofpacts)->ethertype = htons(ethertype);
808         }
809         break;
810
811     case OFPUTIL_OFPAT11_POP_MPLS:
812     case OFPUTIL_NXAST_POP_MPLS:
813         error = str_to_u16(arg, "pop_mpls", &ethertype);
814         if (!error) {
815             ofpact_put_POP_MPLS(ofpacts)->ethertype = htons(ethertype);
816         }
817         break;
818
819     case OFPUTIL_OFPAT11_GROUP:
820         error = str_to_u32(arg, &ofpact_put_GROUP(ofpacts)->group_id);
821         break;
822
823     case OFPUTIL_NXAST_STACK_PUSH:
824         error = nxm_parse_stack_action(ofpact_put_STACK_PUSH(ofpacts), arg);
825         break;
826     case OFPUTIL_NXAST_STACK_POP:
827         error = nxm_parse_stack_action(ofpact_put_STACK_POP(ofpacts), arg);
828         break;
829
830     case OFPUTIL_NXAST_SAMPLE:
831         error = parse_sample(ofpacts, arg);
832         break;
833     }
834
835     if (error) {
836         ofpacts->size = orig_size;
837     }
838     return error;
839 }
840
841 /* Parses action 'act', with argument 'arg', and appends a parsed version to
842  * 'ofpacts'.
843  *
844  * 'n_actions' specifies the number of actions already parsed (for proper
845  * handling of "drop" actions).
846  *
847  * Returns NULL if successful, otherwise a malloc()'d string describing the
848  * error.  The caller is responsible for freeing the returned string. */
849 static char * WARN_UNUSED_RESULT
850 str_to_ofpact__(char *pos, char *act, char *arg,
851                 struct ofpbuf *ofpacts, int n_actions,
852                 enum ofputil_protocol *usable_protocols)
853 {
854     int code = ofputil_action_code_from_name(act);
855     if (code >= 0) {
856         return parse_named_action(code, arg, ofpacts, usable_protocols);
857     } else if (!strcasecmp(act, "drop")) {
858         if (n_actions) {
859             return xstrdup("Drop actions must not be preceded by other "
860                            "actions");
861         } else if (ofputil_parse_key_value(&pos, &act, &arg)) {
862             return xstrdup("Drop actions must not be followed by other "
863                            "actions");
864         }
865     } else {
866         ofp_port_t port;
867         if (ofputil_port_from_string(act, &port)) {
868             ofpact_put_OUTPUT(ofpacts)->port = port;
869         } else {
870             return xasprintf("Unknown action: %s", act);
871         }
872     }
873
874     return NULL;
875 }
876
877 /* Parses 'str' as a series of actions, and appends them to 'ofpacts'.
878  *
879  * Returns NULL if successful, otherwise a malloc()'d string describing the
880  * error.  The caller is responsible for freeing the returned string. */
881 static char * WARN_UNUSED_RESULT
882 str_to_ofpacts(char *str, struct ofpbuf *ofpacts,
883                enum ofputil_protocol *usable_protocols)
884 {
885     size_t orig_size = ofpacts->size;
886     char *pos, *act, *arg;
887     enum ofperr error;
888     int n_actions;
889
890     pos = str;
891     n_actions = 0;
892     while (ofputil_parse_key_value(&pos, &act, &arg)) {
893         char *error = str_to_ofpact__(pos, act, arg, ofpacts, n_actions,
894                                       usable_protocols);
895         if (error) {
896             ofpacts->size = orig_size;
897             return error;
898         }
899         n_actions++;
900     }
901
902     error = ofpacts_verify(ofpacts->data, ofpacts->size);
903     if (error) {
904         ofpacts->size = orig_size;
905         return xstrdup("Incorrect action ordering");
906     }
907
908     ofpact_pad(ofpacts);
909     return NULL;
910 }
911
912 /* Parses 'arg' as the argument to instruction 'type', and appends such an
913  * instruction to 'ofpacts'.
914  *
915  * Returns NULL if successful, otherwise a malloc()'d string describing the
916  * error.  The caller is responsible for freeing the returned string. */
917 static char * WARN_UNUSED_RESULT
918 parse_named_instruction(enum ovs_instruction_type type,
919                         char *arg, struct ofpbuf *ofpacts,
920                         enum ofputil_protocol *usable_protocols)
921 {
922     char *error_s = NULL;
923     enum ofperr error;
924
925     *usable_protocols &= OFPUTIL_P_OF11_UP;
926
927     switch (type) {
928     case OVSINST_OFPIT11_APPLY_ACTIONS:
929         NOT_REACHED();  /* This case is handled by str_to_inst_ofpacts() */
930         break;
931
932     case OVSINST_OFPIT11_WRITE_ACTIONS:
933         /* XXX */
934         error_s = xstrdup("instruction write-actions is not supported yet");
935         break;
936
937     case OVSINST_OFPIT11_CLEAR_ACTIONS:
938         ofpact_put_CLEAR_ACTIONS(ofpacts);
939         break;
940
941     case OVSINST_OFPIT13_METER:
942         *usable_protocols &= OFPUTIL_P_OF13_UP;
943         error_s = str_to_u32(arg, &ofpact_put_METER(ofpacts)->meter_id);
944         break;
945
946     case OVSINST_OFPIT11_WRITE_METADATA:
947         *usable_protocols &= OFPUTIL_P_NXM_OF11_UP;
948         error_s = parse_metadata(ofpacts, arg);
949         break;
950
951     case OVSINST_OFPIT11_GOTO_TABLE: {
952         struct ofpact_goto_table *ogt = ofpact_put_GOTO_TABLE(ofpacts);
953         char *table_s = strsep(&arg, ",");
954         if (!table_s || !table_s[0]) {
955             return xstrdup("instruction goto-table needs table id");
956         }
957         error_s = str_to_u8(table_s, "table", &ogt->table_id);
958         break;
959     }
960     }
961
962     if (error_s) {
963         return error_s;
964     }
965
966     /* If write_metadata is specified as an action AND an instruction, ofpacts
967        could be invalid. */
968     error = ofpacts_verify(ofpacts->data, ofpacts->size);
969     if (error) {
970         return xstrdup("Incorrect instruction ordering");
971     }
972     return NULL;
973 }
974
975 /* Parses 'str' as a series of instructions, and appends them to 'ofpacts'.
976  *
977  * Returns NULL if successful, otherwise a malloc()'d string describing the
978  * error.  The caller is responsible for freeing the returned string. */
979 static char * WARN_UNUSED_RESULT
980 str_to_inst_ofpacts(char *str, struct ofpbuf *ofpacts,
981                     enum ofputil_protocol *usable_protocols)
982 {
983     size_t orig_size = ofpacts->size;
984     char *pos, *inst, *arg;
985     int type;
986     const char *prev_inst = NULL;
987     int prev_type = -1;
988     int n_actions = 0;
989
990     pos = str;
991     while (ofputil_parse_key_value(&pos, &inst, &arg)) {
992         type = ovs_instruction_type_from_name(inst);
993         if (type < 0) {
994             char *error = str_to_ofpact__(pos, inst, arg, ofpacts, n_actions,
995                                           usable_protocols);
996             if (error) {
997                 ofpacts->size = orig_size;
998                 return error;
999             }
1000
1001             type = OVSINST_OFPIT11_APPLY_ACTIONS;
1002             if (prev_type == type) {
1003                 n_actions++;
1004                 continue;
1005             }
1006         } else if (type == OVSINST_OFPIT11_APPLY_ACTIONS) {
1007             ofpacts->size = orig_size;
1008             return xasprintf("%s isn't supported. Just write actions then "
1009                              "it is interpreted as apply_actions", inst);
1010         } else {
1011             char *error = parse_named_instruction(type, arg, ofpacts,
1012                                                   usable_protocols);
1013             if (error) {
1014                 ofpacts->size = orig_size;
1015                 return error;
1016             }
1017         }
1018
1019         if (type <= prev_type) {
1020             ofpacts->size = orig_size;
1021             if (type == prev_type) {
1022                 return xasprintf("instruction %s may be specified only once",
1023                                  inst);
1024             } else {
1025                 return xasprintf("instruction %s must be specified before %s",
1026                                  inst, prev_inst);
1027             }
1028         }
1029
1030         prev_inst = inst;
1031         prev_type = type;
1032         n_actions++;
1033     }
1034     ofpact_pad(ofpacts);
1035
1036     return NULL;
1037 }
1038
1039 struct protocol {
1040     const char *name;
1041     uint16_t dl_type;
1042     uint8_t nw_proto;
1043 };
1044
1045 static bool
1046 parse_protocol(const char *name, const struct protocol **p_out)
1047 {
1048     static const struct protocol protocols[] = {
1049         { "ip", ETH_TYPE_IP, 0 },
1050         { "arp", ETH_TYPE_ARP, 0 },
1051         { "icmp", ETH_TYPE_IP, IPPROTO_ICMP },
1052         { "tcp", ETH_TYPE_IP, IPPROTO_TCP },
1053         { "udp", ETH_TYPE_IP, IPPROTO_UDP },
1054         { "sctp", ETH_TYPE_IP, IPPROTO_SCTP },
1055         { "ipv6", ETH_TYPE_IPV6, 0 },
1056         { "ip6", ETH_TYPE_IPV6, 0 },
1057         { "icmp6", ETH_TYPE_IPV6, IPPROTO_ICMPV6 },
1058         { "tcp6", ETH_TYPE_IPV6, IPPROTO_TCP },
1059         { "udp6", ETH_TYPE_IPV6, IPPROTO_UDP },
1060         { "sctp6", ETH_TYPE_IPV6, IPPROTO_SCTP },
1061         { "rarp", ETH_TYPE_RARP, 0},
1062         { "mpls", ETH_TYPE_MPLS, 0 },
1063         { "mplsm", ETH_TYPE_MPLS_MCAST, 0 },
1064     };
1065     const struct protocol *p;
1066
1067     for (p = protocols; p < &protocols[ARRAY_SIZE(protocols)]; p++) {
1068         if (!strcmp(p->name, name)) {
1069             *p_out = p;
1070             return true;
1071         }
1072     }
1073     *p_out = NULL;
1074     return false;
1075 }
1076
1077 /* Parses 's' as the (possibly masked) value of field 'mf', and updates
1078  * 'match' appropriately.  Restricts the set of usable protocols to ones
1079  * supporting the parsed field.
1080  *
1081  * Returns NULL if successful, otherwise a malloc()'d string describing the
1082  * error.  The caller is responsible for freeing the returned string. */
1083 static char * WARN_UNUSED_RESULT
1084 parse_field(const struct mf_field *mf, const char *s, struct match *match,
1085             enum ofputil_protocol *usable_protocols)
1086 {
1087     union mf_value value, mask;
1088     char *error;
1089
1090     error = mf_parse(mf, s, &value, &mask);
1091     if (!error) {
1092         *usable_protocols &= mf_set(mf, &value, &mask, match);
1093     }
1094     return error;
1095 }
1096
1097 static char * WARN_UNUSED_RESULT
1098 parse_ofp_str__(struct ofputil_flow_mod *fm, int command, char *string,
1099                 enum ofputil_protocol *usable_protocols)
1100 {
1101     enum {
1102         F_OUT_PORT = 1 << 0,
1103         F_ACTIONS = 1 << 1,
1104         F_TIMEOUT = 1 << 3,
1105         F_PRIORITY = 1 << 4,
1106         F_FLAGS = 1 << 5,
1107     } fields;
1108     char *save_ptr = NULL;
1109     char *act_str = NULL;
1110     char *name;
1111
1112     *usable_protocols = OFPUTIL_P_ANY;
1113
1114     switch (command) {
1115     case -1:
1116         fields = F_OUT_PORT;
1117         break;
1118
1119     case OFPFC_ADD:
1120         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
1121         break;
1122
1123     case OFPFC_DELETE:
1124         fields = F_OUT_PORT;
1125         break;
1126
1127     case OFPFC_DELETE_STRICT:
1128         fields = F_OUT_PORT | F_PRIORITY;
1129         break;
1130
1131     case OFPFC_MODIFY:
1132         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
1133         break;
1134
1135     case OFPFC_MODIFY_STRICT:
1136         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
1137         break;
1138
1139     default:
1140         NOT_REACHED();
1141     }
1142
1143     match_init_catchall(&fm->match);
1144     fm->priority = OFP_DEFAULT_PRIORITY;
1145     fm->cookie = htonll(0);
1146     fm->cookie_mask = htonll(0);
1147     if (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) {
1148         /* For modify, by default, don't update the cookie. */
1149         fm->new_cookie = OVS_BE64_MAX;
1150     } else{
1151         fm->new_cookie = htonll(0);
1152     }
1153     fm->modify_cookie = false;
1154     fm->table_id = 0xff;
1155     fm->command = command;
1156     fm->idle_timeout = OFP_FLOW_PERMANENT;
1157     fm->hard_timeout = OFP_FLOW_PERMANENT;
1158     fm->buffer_id = UINT32_MAX;
1159     fm->out_port = OFPP_ANY;
1160     fm->flags = 0;
1161     fm->out_group = OFPG11_ANY;
1162     if (fields & F_ACTIONS) {
1163         act_str = strstr(string, "action");
1164         if (!act_str) {
1165             return xstrdup("must specify an action");
1166         }
1167         *act_str = '\0';
1168
1169         act_str = strchr(act_str + 1, '=');
1170         if (!act_str) {
1171             return xstrdup("must specify an action");
1172         }
1173
1174         act_str++;
1175     }
1176     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
1177          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
1178         const struct protocol *p;
1179         char *error = NULL;
1180
1181         if (parse_protocol(name, &p)) {
1182             match_set_dl_type(&fm->match, htons(p->dl_type));
1183             if (p->nw_proto) {
1184                 match_set_nw_proto(&fm->match, p->nw_proto);
1185             }
1186         } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) {
1187             fm->flags |= OFPUTIL_FF_SEND_FLOW_REM;
1188         } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) {
1189             fm->flags |= OFPUTIL_FF_CHECK_OVERLAP;
1190         } else if (fields & F_FLAGS && !strcmp(name, "reset_counts")) {
1191             fm->flags |= OFPUTIL_FF_RESET_COUNTS;
1192             *usable_protocols &= OFPUTIL_P_OF12_UP;
1193         } else if (fields & F_FLAGS && !strcmp(name, "no_packet_counts")) {
1194             fm->flags |= OFPUTIL_FF_NO_PKT_COUNTS;
1195             *usable_protocols &= OFPUTIL_P_OF13_UP;
1196         } else if (fields & F_FLAGS && !strcmp(name, "no_byte_counts")) {
1197             fm->flags |= OFPUTIL_FF_NO_BYT_COUNTS;
1198             *usable_protocols &= OFPUTIL_P_OF13_UP;
1199         } else {
1200             char *value;
1201
1202             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
1203             if (!value) {
1204                 return xasprintf("field %s missing value", name);
1205             }
1206
1207             if (!strcmp(name, "table")) {
1208                 error = str_to_u8(value, "table", &fm->table_id);
1209                 if (fm->table_id != 0xff) {
1210                     *usable_protocols &= OFPUTIL_P_TID;
1211                 }
1212             } else if (!strcmp(name, "out_port")) {
1213                 if (!ofputil_port_from_string(value, &fm->out_port)) {
1214                     error = xasprintf("%s is not a valid OpenFlow port",
1215                                       value);
1216                 }
1217             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
1218                 uint16_t priority = 0;
1219
1220                 error = str_to_u16(value, name, &priority);
1221                 fm->priority = priority;
1222             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
1223                 error = str_to_u16(value, name, &fm->idle_timeout);
1224             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
1225                 error = str_to_u16(value, name, &fm->hard_timeout);
1226             } else if (!strcmp(name, "cookie")) {
1227                 char *mask = strchr(value, '/');
1228
1229                 if (mask) {
1230                     /* A mask means we're searching for a cookie. */
1231                     if (command == OFPFC_ADD) {
1232                         return xstrdup("flow additions cannot use "
1233                                        "a cookie mask");
1234                     }
1235                     *mask = '\0';
1236                     error = str_to_be64(value, &fm->cookie);
1237                     if (error) {
1238                         return error;
1239                     }
1240                     error = str_to_be64(mask + 1, &fm->cookie_mask);
1241
1242                     /* Matching of the cookie is only supported through NXM or
1243                      * OF1.1+. */
1244                     if (fm->cookie_mask != htonll(0)) {
1245                         *usable_protocols &= OFPUTIL_P_NXM_OF11_UP;
1246                     }
1247                 } else {
1248                     /* No mask means that the cookie is being set. */
1249                     if (command != OFPFC_ADD && command != OFPFC_MODIFY
1250                         && command != OFPFC_MODIFY_STRICT) {
1251                         return xstrdup("cannot set cookie");
1252                     }
1253                     error = str_to_be64(value, &fm->new_cookie);
1254                     fm->modify_cookie = true;
1255                 }
1256             } else if (mf_from_name(name)) {
1257                 error = parse_field(mf_from_name(name), value, &fm->match,
1258                                     usable_protocols);
1259             } else if (!strcmp(name, "duration")
1260                        || !strcmp(name, "n_packets")
1261                        || !strcmp(name, "n_bytes")
1262                        || !strcmp(name, "idle_age")
1263                        || !strcmp(name, "hard_age")) {
1264                 /* Ignore these, so that users can feed the output of
1265                  * "ovs-ofctl dump-flows" back into commands that parse
1266                  * flows. */
1267             } else {
1268                 error = xasprintf("unknown keyword %s", name);
1269             }
1270
1271             if (error) {
1272                 return error;
1273             }
1274         }
1275     }
1276     /* Check for usable protocol interdependencies between match fields. */
1277     if (fm->match.flow.dl_type == htons(ETH_TYPE_IPV6)) {
1278         const struct flow_wildcards *wc = &fm->match.wc;
1279         /* Only NXM and OXM support matching L3 and L4 fields within IPv6.
1280          *
1281          * (IPv6 specific fields as well as arp_sha, arp_tha, nw_frag, and
1282          *  nw_ttl are covered elsewhere so they don't need to be included in
1283          *  this test too.)
1284          */
1285         if (wc->masks.nw_proto || wc->masks.nw_tos
1286             || wc->masks.tp_src || wc->masks.tp_dst) {
1287             *usable_protocols &= OFPUTIL_P_NXM_OXM_ANY;
1288         }
1289     }
1290     if (!fm->cookie_mask && fm->new_cookie == OVS_BE64_MAX
1291         && (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT)) {
1292         /* On modifies without a mask, we are supposed to add a flow if
1293          * one does not exist.  If a cookie wasn't been specified, use a
1294          * default of zero. */
1295         fm->new_cookie = htonll(0);
1296     }
1297     if (fields & F_ACTIONS) {
1298         struct ofpbuf ofpacts;
1299         char *error;
1300
1301         ofpbuf_init(&ofpacts, 32);
1302         error = str_to_inst_ofpacts(act_str, &ofpacts, usable_protocols);
1303         if (!error) {
1304             enum ofperr err;
1305
1306             err = ofpacts_check(ofpacts.data, ofpacts.size, &fm->match.flow,
1307                                 OFPP_MAX, 0);
1308             if (err) {
1309                 error = xasprintf("actions are invalid with specified match "
1310                                   "(%s)", ofperr_to_string(err));
1311             }
1312         }
1313         if (error) {
1314             ofpbuf_uninit(&ofpacts);
1315             return error;
1316         }
1317
1318         fm->ofpacts_len = ofpacts.size;
1319         fm->ofpacts = ofpbuf_steal_data(&ofpacts);
1320     } else {
1321         fm->ofpacts_len = 0;
1322         fm->ofpacts = NULL;
1323     }
1324
1325     return NULL;
1326 }
1327
1328 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
1329  * page) into 'fm' for sending the specified flow_mod 'command' to a switch.
1330  * Returns the set of usable protocols in '*usable_protocols'.
1331  *
1332  * To parse syntax for an OFPT_FLOW_MOD (or NXT_FLOW_MOD), use an OFPFC_*
1333  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
1334  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'.
1335  *
1336  * Returns NULL if successful, otherwise a malloc()'d string describing the
1337  * error.  The caller is responsible for freeing the returned string. */
1338 char * WARN_UNUSED_RESULT
1339 parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
1340               enum ofputil_protocol *usable_protocols)
1341 {
1342     char *string = xstrdup(str_);
1343     char *error;
1344
1345     error = parse_ofp_str__(fm, command, string, usable_protocols);
1346     if (error) {
1347         fm->ofpacts = NULL;
1348         fm->ofpacts_len = 0;
1349     }
1350
1351     free(string);
1352     return error;
1353 }
1354
1355 static char * WARN_UNUSED_RESULT
1356 parse_ofp_meter_mod_str__(struct ofputil_meter_mod *mm, char *string,
1357                           struct ofpbuf *bands, int command,
1358                           enum ofputil_protocol *usable_protocols)
1359 {
1360     enum {
1361         F_METER = 1 << 0,
1362         F_FLAGS = 1 << 1,
1363         F_BANDS = 1 << 2,
1364     } fields;
1365     char *save_ptr = NULL;
1366     char *band_str = NULL;
1367     char *name;
1368
1369     /* Meters require at least OF 1.3. */
1370     *usable_protocols = OFPUTIL_P_OF13_UP;
1371
1372     switch (command) {
1373     case -1:
1374         fields = F_METER;
1375         break;
1376
1377     case OFPMC13_ADD:
1378         fields = F_METER | F_FLAGS | F_BANDS;
1379         break;
1380
1381     case OFPMC13_DELETE:
1382         fields = F_METER;
1383         break;
1384
1385     case OFPMC13_MODIFY:
1386         fields = F_METER | F_FLAGS | F_BANDS;
1387         break;
1388
1389     default:
1390         NOT_REACHED();
1391     }
1392
1393     mm->command = command;
1394     mm->meter.meter_id = 0;
1395     mm->meter.flags = 0;
1396     if (fields & F_BANDS) {
1397         band_str = strstr(string, "band");
1398         if (!band_str) {
1399             return xstrdup("must specify bands");
1400         }
1401         *band_str = '\0';
1402
1403         band_str = strchr(band_str + 1, '=');
1404         if (!band_str) {
1405             return xstrdup("must specify bands");
1406         }
1407
1408         band_str++;
1409     }
1410     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
1411          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
1412
1413         if (fields & F_FLAGS && !strcmp(name, "kbps")) {
1414             mm->meter.flags |= OFPMF13_KBPS;
1415         } else if (fields & F_FLAGS && !strcmp(name, "pktps")) {
1416             mm->meter.flags |= OFPMF13_PKTPS;
1417         } else if (fields & F_FLAGS && !strcmp(name, "burst")) {
1418             mm->meter.flags |= OFPMF13_BURST;
1419         } else if (fields & F_FLAGS && !strcmp(name, "stats")) {
1420             mm->meter.flags |= OFPMF13_STATS;
1421         } else {
1422             char *value;
1423
1424             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
1425             if (!value) {
1426                 return xasprintf("field %s missing value", name);
1427             }
1428
1429             if (!strcmp(name, "meter")) {
1430                 if (!strcmp(value, "all")) {
1431                     mm->meter.meter_id = OFPM13_ALL;
1432                 } else if (!strcmp(value, "controller")) {
1433                     mm->meter.meter_id = OFPM13_CONTROLLER;
1434                 } else if (!strcmp(value, "slowpath")) {
1435                     mm->meter.meter_id = OFPM13_SLOWPATH;
1436                 } else {
1437                     char *error = str_to_u32(value, &mm->meter.meter_id);
1438                     if (error) {
1439                         return error;
1440                     }
1441                     if (mm->meter.meter_id > OFPM13_MAX) {
1442                         return xasprintf("invalid value for %s", name);
1443                     }
1444                 }
1445             } else {
1446                 return xasprintf("unknown keyword %s", name);
1447             }
1448         }
1449     }
1450     if (fields & F_METER && !mm->meter.meter_id) {
1451         return xstrdup("must specify 'meter'");
1452     }
1453     if (fields & F_FLAGS && !mm->meter.flags) {
1454         return xstrdup("meter must specify either 'kbps' or 'pktps'");
1455     }
1456
1457     if (fields & F_BANDS) {
1458         uint16_t n_bands = 0;
1459         struct ofputil_meter_band *band = NULL;
1460         int i;
1461
1462         for (name = strtok_r(band_str, "=, \t\r\n", &save_ptr); name;
1463              name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
1464
1465             char *value;
1466
1467             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
1468             if (!value) {
1469                 return xasprintf("field %s missing value", name);
1470             }
1471
1472             if (!strcmp(name, "type")) {
1473                 /* Start a new band */
1474                 band = ofpbuf_put_zeros(bands, sizeof *band);
1475                 n_bands++;
1476
1477                 if (!strcmp(value, "drop")) {
1478                     band->type = OFPMBT13_DROP;
1479                 } else if (!strcmp(value, "dscp_remark")) {
1480                     band->type = OFPMBT13_DSCP_REMARK;
1481                 } else {
1482                     return xasprintf("field %s unknown value %s", name, value);
1483                 }
1484             } else if (!band || !band->type) {
1485                 return xstrdup("band must start with the 'type' keyword");
1486             } else if (!strcmp(name, "rate")) {
1487                 char *error = str_to_u32(value, &band->rate);
1488                 if (error) {
1489                     return error;
1490                 }
1491             } else if (!strcmp(name, "burst_size")) {
1492                 char *error = str_to_u32(value, &band->burst_size);
1493                 if (error) {
1494                     return error;
1495                 }
1496             } else if (!strcmp(name, "prec_level")) {
1497                 char *error = str_to_u8(value, name, &band->prec_level);
1498                 if (error) {
1499                     return error;
1500                 }
1501             } else {
1502                 return xasprintf("unknown keyword %s", name);
1503             }
1504         }
1505         /* validate bands */
1506         if (!n_bands) {
1507             return xstrdup("meter must have bands");
1508         }
1509
1510         mm->meter.n_bands = n_bands;
1511         mm->meter.bands = ofpbuf_steal_data(bands);
1512
1513         for (i = 0; i < n_bands; ++i) {
1514             band = &mm->meter.bands[i];
1515
1516             if (!band->type) {
1517                 return xstrdup("band must have 'type'");
1518             }
1519             if (band->type == OFPMBT13_DSCP_REMARK) {
1520                 if (!band->prec_level) {
1521                     return xstrdup("'dscp_remark' band must have"
1522                                    " 'prec_level'");
1523                 }
1524             } else {
1525                 if (band->prec_level) {
1526                     return xstrdup("Only 'dscp_remark' band may have"
1527                                    " 'prec_level'");
1528                 }
1529             }
1530             if (!band->rate) {
1531                 return xstrdup("band must have 'rate'");
1532             }
1533             if (mm->meter.flags & OFPMF13_BURST) {
1534                 if (!band->burst_size) {
1535                     return xstrdup("band must have 'burst_size' "
1536                                    "when 'burst' flag is set");
1537                 }
1538             } else {
1539                 if (band->burst_size) {
1540                     return xstrdup("band may have 'burst_size' only "
1541                                    "when 'burst' flag is set");
1542                 }
1543             }
1544         }
1545     } else {
1546         mm->meter.n_bands = 0;
1547         mm->meter.bands = NULL;
1548     }
1549
1550     return NULL;
1551 }
1552
1553 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
1554  * page) into 'mm' for sending the specified meter_mod 'command' to a switch.
1555  *
1556  * Returns NULL if successful, otherwise a malloc()'d string describing the
1557  * error.  The caller is responsible for freeing the returned string. */
1558 char * WARN_UNUSED_RESULT
1559 parse_ofp_meter_mod_str(struct ofputil_meter_mod *mm, const char *str_,
1560                         int command, enum ofputil_protocol *usable_protocols)
1561 {
1562     struct ofpbuf bands;
1563     char *string;
1564     char *error;
1565
1566     ofpbuf_init(&bands, 64);
1567     string = xstrdup(str_);
1568
1569     error = parse_ofp_meter_mod_str__(mm, string, &bands, command,
1570                                       usable_protocols);
1571
1572     free(string);
1573     ofpbuf_uninit(&bands);
1574
1575     return error;
1576 }
1577
1578 static char * WARN_UNUSED_RESULT
1579 parse_flow_monitor_request__(struct ofputil_flow_monitor_request *fmr,
1580                              const char *str_, char *string,
1581                              enum ofputil_protocol *usable_protocols)
1582 {
1583     static atomic_uint32_t id = ATOMIC_VAR_INIT(0);
1584     char *save_ptr = NULL;
1585     char *name;
1586
1587     atomic_add(&id, 1, &fmr->id);
1588
1589     fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
1590                   | NXFMF_OWN | NXFMF_ACTIONS);
1591     fmr->out_port = OFPP_NONE;
1592     fmr->table_id = 0xff;
1593     match_init_catchall(&fmr->match);
1594
1595     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
1596          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
1597         const struct protocol *p;
1598
1599         if (!strcmp(name, "!initial")) {
1600             fmr->flags &= ~NXFMF_INITIAL;
1601         } else if (!strcmp(name, "!add")) {
1602             fmr->flags &= ~NXFMF_ADD;
1603         } else if (!strcmp(name, "!delete")) {
1604             fmr->flags &= ~NXFMF_DELETE;
1605         } else if (!strcmp(name, "!modify")) {
1606             fmr->flags &= ~NXFMF_MODIFY;
1607         } else if (!strcmp(name, "!actions")) {
1608             fmr->flags &= ~NXFMF_ACTIONS;
1609         } else if (!strcmp(name, "!own")) {
1610             fmr->flags &= ~NXFMF_OWN;
1611         } else if (parse_protocol(name, &p)) {
1612             match_set_dl_type(&fmr->match, htons(p->dl_type));
1613             if (p->nw_proto) {
1614                 match_set_nw_proto(&fmr->match, p->nw_proto);
1615             }
1616         } else {
1617             char *value;
1618
1619             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
1620             if (!value) {
1621                 return xasprintf("%s: field %s missing value", str_, name);
1622             }
1623
1624             if (!strcmp(name, "table")) {
1625                 char *error = str_to_u8(value, "table", &fmr->table_id);
1626                 if (error) {
1627                     return error;
1628                 }
1629             } else if (!strcmp(name, "out_port")) {
1630                 fmr->out_port = u16_to_ofp(atoi(value));
1631             } else if (mf_from_name(name)) {
1632                 char *error;
1633
1634                 error = parse_field(mf_from_name(name), value, &fmr->match,
1635                                     usable_protocols);
1636                 if (error) {
1637                     return error;
1638                 }
1639             } else {
1640                 return xasprintf("%s: unknown keyword %s", str_, name);
1641             }
1642         }
1643     }
1644     return NULL;
1645 }
1646
1647 /* Convert 'str_' (as described in the documentation for the "monitor" command
1648  * in the ovs-ofctl man page) into 'fmr'.
1649  *
1650  * Returns NULL if successful, otherwise a malloc()'d string describing the
1651  * error.  The caller is responsible for freeing the returned string. */
1652 char * WARN_UNUSED_RESULT
1653 parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,
1654                            const char *str_,
1655                            enum ofputil_protocol *usable_protocols)
1656 {
1657     char *string = xstrdup(str_);
1658     char *error = parse_flow_monitor_request__(fmr, str_, string,
1659                                                usable_protocols);
1660     free(string);
1661     return error;
1662 }
1663
1664 /* Parses 's' as a set of OpenFlow actions and appends the actions to
1665  * 'actions'.
1666  *
1667  * Returns NULL if successful, otherwise a malloc()'d string describing the
1668  * error.  The caller is responsible for freeing the returned string. */
1669 char * WARN_UNUSED_RESULT
1670 parse_ofpacts(const char *s_, struct ofpbuf *ofpacts,
1671               enum ofputil_protocol *usable_protocols)
1672 {
1673     char *s = xstrdup(s_);
1674     char *error;
1675
1676     *usable_protocols = OFPUTIL_P_ANY;
1677
1678     error = str_to_ofpacts(s, ofpacts, usable_protocols);
1679     free(s);
1680
1681     return error;
1682 }
1683
1684 /* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
1685  * (one of OFPFC_*) into 'fm'.
1686  *
1687  * Returns NULL if successful, otherwise a malloc()'d string describing the
1688  * error.  The caller is responsible for freeing the returned string. */
1689 char * WARN_UNUSED_RESULT
1690 parse_ofp_flow_mod_str(struct ofputil_flow_mod *fm, const char *string,
1691                        uint16_t command,
1692                        enum ofputil_protocol *usable_protocols)
1693 {
1694     char *error = parse_ofp_str(fm, command, string, usable_protocols);
1695     if (!error) {
1696         /* Normalize a copy of the match.  This ensures that non-normalized
1697          * flows get logged but doesn't affect what gets sent to the switch, so
1698          * that the switch can do whatever it likes with the flow. */
1699         struct match match_copy = fm->match;
1700         ofputil_normalize_match(&match_copy);
1701     }
1702
1703     return error;
1704 }
1705
1706 /* Convert 'table_id' and 'flow_miss_handling' (as described for the
1707  * "mod-table" command in the ovs-ofctl man page) into 'tm' for sending the
1708  * specified table_mod 'command' to a switch.
1709  *
1710  * Returns NULL if successful, otherwise a malloc()'d string describing the
1711  * error.  The caller is responsible for freeing the returned string. */
1712 char * WARN_UNUSED_RESULT
1713 parse_ofp_table_mod(struct ofputil_table_mod *tm, const char *table_id,
1714                     const char *flow_miss_handling,
1715                     enum ofputil_protocol *usable_protocols)
1716 {
1717     /* Table mod requires at least OF 1.1. */
1718     *usable_protocols = OFPUTIL_P_OF11_UP;
1719
1720     if (!strcasecmp(table_id, "all")) {
1721         tm->table_id = 255;
1722     } else {
1723         char *error = str_to_u8(table_id, "table_id", &tm->table_id);
1724         if (error) {
1725             return error;
1726         }
1727     }
1728
1729     if (strcmp(flow_miss_handling, "controller") == 0) {
1730         tm->config = OFPTC11_TABLE_MISS_CONTROLLER;
1731     } else if (strcmp(flow_miss_handling, "continue") == 0) {
1732         tm->config = OFPTC11_TABLE_MISS_CONTINUE;
1733     } else if (strcmp(flow_miss_handling, "drop") == 0) {
1734         tm->config = OFPTC11_TABLE_MISS_DROP;
1735     } else {
1736         return xasprintf("invalid flow_miss_handling %s", flow_miss_handling);
1737     }
1738
1739     if (tm->table_id == 0xfe && tm->config == OFPTC11_TABLE_MISS_CONTINUE) {
1740         return xstrdup("last table's flow miss handling can not be continue");
1741     }
1742
1743     return NULL;
1744 }
1745
1746
1747 /* Opens file 'file_name' and reads each line as a flow_mod of the specified
1748  * type (one of OFPFC_*).  Stores each flow_mod in '*fm', an array allocated
1749  * on the caller's behalf, and the number of flow_mods in '*n_fms'.
1750  *
1751  * Returns NULL if successful, otherwise a malloc()'d string describing the
1752  * error.  The caller is responsible for freeing the returned string. */
1753 char * WARN_UNUSED_RESULT
1754 parse_ofp_flow_mod_file(const char *file_name, uint16_t command,
1755                         struct ofputil_flow_mod **fms, size_t *n_fms,
1756                         enum ofputil_protocol *usable_protocols)
1757 {
1758     size_t allocated_fms;
1759     int line_number;
1760     FILE *stream;
1761     struct ds s;
1762
1763     *usable_protocols = OFPUTIL_P_ANY;
1764
1765     *fms = NULL;
1766     *n_fms = 0;
1767
1768     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
1769     if (stream == NULL) {
1770         return xasprintf("%s: open failed (%s)",
1771                          file_name, ovs_strerror(errno));
1772     }
1773
1774     allocated_fms = *n_fms;
1775     ds_init(&s);
1776     line_number = 0;
1777     while (!ds_get_preprocessed_line(&s, stream, &line_number)) {
1778         char *error;
1779         enum ofputil_protocol usable;
1780
1781         if (*n_fms >= allocated_fms) {
1782             *fms = x2nrealloc(*fms, &allocated_fms, sizeof **fms);
1783         }
1784         error = parse_ofp_flow_mod_str(&(*fms)[*n_fms], ds_cstr(&s), command,
1785                                        &usable);
1786         if (error) {
1787             size_t i;
1788
1789             for (i = 0; i < *n_fms; i++) {
1790                 free((*fms)[i].ofpacts);
1791             }
1792             free(*fms);
1793             *fms = NULL;
1794             *n_fms = 0;
1795
1796             ds_destroy(&s);
1797             if (stream != stdin) {
1798                 fclose(stream);
1799             }
1800
1801             return xasprintf("%s:%d: %s", file_name, line_number, error);
1802         }
1803         *usable_protocols &= usable; /* Each line can narrow the set. */
1804         *n_fms += 1;
1805     }
1806
1807     ds_destroy(&s);
1808     if (stream != stdin) {
1809         fclose(stream);
1810     }
1811     return NULL;
1812 }
1813
1814 char * WARN_UNUSED_RESULT
1815 parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
1816                                  bool aggregate, const char *string,
1817                                  enum ofputil_protocol *usable_protocols)
1818 {
1819     struct ofputil_flow_mod fm;
1820     char *error;
1821
1822     error = parse_ofp_str(&fm, -1, string, usable_protocols);
1823     if (error) {
1824         return error;
1825     }
1826
1827     /* Special table ID support not required for stats requests. */
1828     if (*usable_protocols & OFPUTIL_P_OF10_STD_TID) {
1829         *usable_protocols |= OFPUTIL_P_OF10_STD;
1830     }
1831     if (*usable_protocols & OFPUTIL_P_OF10_NXM_TID) {
1832         *usable_protocols |= OFPUTIL_P_OF10_NXM;
1833     }
1834
1835     fsr->aggregate = aggregate;
1836     fsr->cookie = fm.cookie;
1837     fsr->cookie_mask = fm.cookie_mask;
1838     fsr->match = fm.match;
1839     fsr->out_port = fm.out_port;
1840     fsr->out_group = fm.out_group;
1841     fsr->table_id = fm.table_id;
1842     return NULL;
1843 }
1844
1845 /* Parses a specification of a flow from 's' into 'flow'.  's' must take the
1846  * form FIELD=VALUE[,FIELD=VALUE]... where each FIELD is the name of a
1847  * mf_field.  Fields must be specified in a natural order for satisfying
1848  * prerequisites.
1849  *
1850  * Returns NULL on success, otherwise a malloc()'d string that explains the
1851  * problem. */
1852 char *
1853 parse_ofp_exact_flow(struct flow *flow, const char *s)
1854 {
1855     char *pos, *key, *value_s;
1856     char *error = NULL;
1857     char *copy;
1858
1859     memset(flow, 0, sizeof *flow);
1860
1861     pos = copy = xstrdup(s);
1862     while (ofputil_parse_key_value(&pos, &key, &value_s)) {
1863         const struct protocol *p;
1864         if (parse_protocol(key, &p)) {
1865             if (flow->dl_type) {
1866                 error = xasprintf("%s: Ethernet type set multiple times", s);
1867                 goto exit;
1868             }
1869             flow->dl_type = htons(p->dl_type);
1870
1871             if (p->nw_proto) {
1872                 if (flow->nw_proto) {
1873                     error = xasprintf("%s: network protocol set "
1874                                       "multiple times", s);
1875                     goto exit;
1876                 }
1877                 flow->nw_proto = p->nw_proto;
1878             }
1879         } else {
1880             const struct mf_field *mf;
1881             union mf_value value;
1882             char *field_error;
1883
1884             mf = mf_from_name(key);
1885             if (!mf) {
1886                 error = xasprintf("%s: unknown field %s", s, key);
1887                 goto exit;
1888             }
1889
1890             if (!mf_are_prereqs_ok(mf, flow)) {
1891                 error = xasprintf("%s: prerequisites not met for setting %s",
1892                                   s, key);
1893                 goto exit;
1894             }
1895
1896             if (!mf_is_zero(mf, flow)) {
1897                 error = xasprintf("%s: field %s set multiple times", s, key);
1898                 goto exit;
1899             }
1900
1901             field_error = mf_parse_value(mf, value_s, &value);
1902             if (field_error) {
1903                 error = xasprintf("%s: bad value for %s (%s)",
1904                                   s, key, field_error);
1905                 free(field_error);
1906                 goto exit;
1907             }
1908
1909             mf_set_flow_value(mf, &value, flow);
1910         }
1911     }
1912
1913     if (!flow->in_port.ofp_port) {
1914         flow->in_port.ofp_port = OFPP_NONE;
1915     }
1916
1917 exit:
1918     free(copy);
1919
1920     if (error) {
1921         memset(flow, 0, sizeof *flow);
1922     }
1923     return error;
1924 }
1925
1926 static char * WARN_UNUSED_RESULT
1927 parse_bucket_str(struct ofputil_bucket *bucket, char *str_,
1928                   enum ofputil_protocol *usable_protocols)
1929 {
1930     struct ofpbuf ofpacts;
1931     char *pos, *act, *arg;
1932     int n_actions;
1933
1934     bucket->weight = 1;
1935     bucket->watch_port = OFPP_ANY;
1936     bucket->watch_group = OFPG11_ANY;
1937
1938     pos = str_;
1939     n_actions = 0;
1940     ofpbuf_init(&ofpacts, 64);
1941     while (ofputil_parse_key_value(&pos, &act, &arg)) {
1942         char *error = NULL;
1943
1944         if (!strcasecmp(act, "weight")) {
1945             error = str_to_u16(arg, "weight", &bucket->weight);
1946         } else if (!strcasecmp(act, "watch_port")) {
1947             if (!ofputil_port_from_string(arg, &bucket->watch_port)
1948                 || (ofp_to_u16(bucket->watch_port) >= ofp_to_u16(OFPP_MAX)
1949                     && bucket->watch_port != OFPP_ANY)) {
1950                 error = xasprintf("%s: invalid watch_port", arg);
1951             }
1952         } else if (!strcasecmp(act, "watch_group")) {
1953             error = str_to_u32(arg, &bucket->watch_group);
1954             if (!error && bucket->watch_group > OFPG_MAX) {
1955                 error = xasprintf("invalid watch_group id %"PRIu32,
1956                                   bucket->watch_group);
1957             }
1958         } else {
1959             error = str_to_ofpact__(pos, act, arg, &ofpacts, n_actions,
1960                                     usable_protocols);
1961             n_actions++;
1962         }
1963
1964         if (error) {
1965             ofpbuf_uninit(&ofpacts);
1966             return error;
1967         }
1968     }
1969
1970     ofpact_pad(&ofpacts);
1971     bucket->ofpacts = ofpacts.data;
1972     bucket->ofpacts_len = ofpacts.size;
1973
1974     return NULL;
1975 }
1976
1977 static char * WARN_UNUSED_RESULT
1978 parse_ofp_group_mod_str__(struct ofputil_group_mod *gm, uint16_t command,
1979                           char *string,
1980                           enum ofputil_protocol *usable_protocols)
1981 {
1982     enum {
1983         F_GROUP_TYPE  = 1 << 0,
1984         F_BUCKETS     = 1 << 1,
1985     } fields;
1986     char *save_ptr = NULL;
1987     bool had_type = false;
1988     char *name;
1989     struct ofputil_bucket *bucket;
1990     char *error = NULL;
1991
1992     *usable_protocols = OFPUTIL_P_OF11_UP;
1993
1994     switch (command) {
1995     case OFPGC11_ADD:
1996         fields = F_GROUP_TYPE | F_BUCKETS;
1997         break;
1998
1999     case OFPGC11_DELETE:
2000         fields = 0;
2001         break;
2002
2003     case OFPGC11_MODIFY:
2004         fields = F_GROUP_TYPE | F_BUCKETS;
2005         break;
2006
2007     default:
2008         NOT_REACHED();
2009     }
2010
2011     memset(gm, 0, sizeof *gm);
2012     gm->command = command;
2013     gm->group_id = OFPG_ANY;
2014     list_init(&gm->buckets);
2015     if (command == OFPGC11_DELETE && string[0] == '\0') {
2016         gm->group_id = OFPG_ALL;
2017         return NULL;
2018     }
2019
2020     *usable_protocols = OFPUTIL_P_OF11_UP;
2021
2022     if (fields & F_BUCKETS) {
2023         char *bkt_str = strstr(string, "bucket");
2024
2025         if (bkt_str) {
2026             *bkt_str = '\0';
2027         }
2028
2029         while (bkt_str) {
2030             char *next_bkt_str;
2031
2032             bkt_str = strchr(bkt_str + 1, '=');
2033             if (!bkt_str) {
2034                 error = xstrdup("must specify bucket content");
2035                 goto out;
2036             }
2037             bkt_str++;
2038
2039             next_bkt_str = strstr(bkt_str, "bucket");
2040             if (next_bkt_str) {
2041                 *next_bkt_str = '\0';
2042             }
2043
2044             bucket = xzalloc(sizeof(struct ofputil_bucket));
2045             error = parse_bucket_str(bucket, bkt_str, usable_protocols);
2046             if (error) {
2047                 free(bucket);
2048                 goto out;
2049             }
2050             list_push_back(&gm->buckets, &bucket->list_node);
2051
2052             bkt_str = next_bkt_str;
2053         }
2054     }
2055
2056     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
2057          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
2058         char *value;
2059
2060         value = strtok_r(NULL, ", \t\r\n", &save_ptr);
2061         if (!value) {
2062             error = xasprintf("field %s missing value", name);
2063             goto out;
2064         }
2065
2066         if (!strcmp(name, "group_id")) {
2067             if(!strcmp(value, "all")) {
2068                 gm->group_id = OFPG_ALL;
2069             } else {
2070                 char *error = str_to_u32(value, &gm->group_id);
2071                 if (error) {
2072                     goto out;
2073                 }
2074                 if (gm->group_id != OFPG_ALL && gm->group_id > OFPG_MAX) {
2075                     error = xasprintf("invalid group id %"PRIu32,
2076                                       gm->group_id);
2077                     goto out;
2078                 }
2079             }
2080         } else if (!strcmp(name, "type")){
2081             if (!(fields & F_GROUP_TYPE)) {
2082                 error = xstrdup("type is not needed");
2083                 goto out;
2084             }
2085             if (!strcmp(value, "all")) {
2086                 gm->type = OFPGT11_ALL;
2087             } else if (!strcmp(value, "select")) {
2088                 gm->type = OFPGT11_SELECT;
2089             } else if (!strcmp(value, "indirect")) {
2090                 gm->type = OFPGT11_INDIRECT;
2091             } else if (!strcmp(value, "ff") ||
2092                        !strcmp(value, "fast_failover")) {
2093                 gm->type = OFPGT11_FF;
2094             } else {
2095                 error = xasprintf("invalid group type %s", value);
2096                 goto out;
2097             }
2098             had_type = true;
2099         } else if (!strcmp(name, "bucket")) {
2100             error = xstrdup("bucket is not needed");
2101             goto out;
2102         } else {
2103             error = xasprintf("unknown keyword %s", name);
2104             goto out;
2105         }
2106     }
2107     if (gm->group_id == OFPG_ANY) {
2108         error = xstrdup("must specify a group_id");
2109         goto out;
2110     }
2111     if (fields & F_GROUP_TYPE && !had_type) {
2112         error = xstrdup("must specify a type");
2113         goto out;
2114     }
2115
2116     /* Validate buckets. */
2117     LIST_FOR_EACH (bucket, list_node, &gm->buckets) {
2118         if (bucket->weight != 1 && gm->type != OFPGT11_SELECT) {
2119             error = xstrdup("Only select groups can have bucket weights.");
2120             goto out;
2121         }
2122     }
2123     if (gm->type == OFPGT11_INDIRECT && !list_is_short(&gm->buckets)) {
2124         error = xstrdup("Indirect groups can have at most one bucket.");
2125         goto out;
2126     }
2127
2128     return NULL;
2129  out:
2130     ofputil_bucket_list_destroy(&gm->buckets);
2131     return error;
2132 }
2133
2134 char * WARN_UNUSED_RESULT
2135 parse_ofp_group_mod_str(struct ofputil_group_mod *gm, uint16_t command,
2136                         const char *str_,
2137                         enum ofputil_protocol *usable_protocols)
2138 {
2139     char *string = xstrdup(str_);
2140     char *error = parse_ofp_group_mod_str__(gm, command, string,
2141                                             usable_protocols);
2142     free(string);
2143
2144     if (error) {
2145         ofputil_bucket_list_destroy(&gm->buckets);
2146     }
2147     return error;
2148 }
2149
2150 char * WARN_UNUSED_RESULT
2151 parse_ofp_group_mod_file(const char *file_name, uint16_t command,
2152                          struct ofputil_group_mod **gms, size_t *n_gms,
2153                          enum ofputil_protocol *usable_protocols)
2154 {
2155     size_t allocated_gms;
2156     int line_number;
2157     FILE *stream;
2158     struct ds s;
2159
2160     *gms = NULL;
2161     *n_gms = 0;
2162
2163     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
2164     if (stream == NULL) {
2165         return xasprintf("%s: open failed (%s)",
2166                          file_name, ovs_strerror(errno));
2167     }
2168
2169     allocated_gms = *n_gms;
2170     ds_init(&s);
2171     line_number = 0;
2172     *usable_protocols = OFPUTIL_P_OF11_UP;
2173     while (!ds_get_preprocessed_line(&s, stream, &line_number)) {
2174         enum ofputil_protocol usable;
2175         char *error;
2176
2177         if (*n_gms >= allocated_gms) {
2178             *gms = x2nrealloc(*gms, &allocated_gms, sizeof **gms);
2179         }
2180         error = parse_ofp_group_mod_str(&(*gms)[*n_gms], command, ds_cstr(&s),
2181                                         &usable);
2182         if (error) {
2183             size_t i;
2184
2185             for (i = 0; i < *n_gms; i++) {
2186                 ofputil_bucket_list_destroy(&(*gms)[i].buckets);
2187             }
2188             free(*gms);
2189             *gms = NULL;
2190             *n_gms = 0;
2191
2192             ds_destroy(&s);
2193             if (stream != stdin) {
2194                 fclose(stream);
2195             }
2196
2197             return xasprintf("%s:%d: %s", file_name, line_number, error);
2198         }
2199         *usable_protocols &= usable;
2200         *n_gms += 1;
2201     }
2202
2203     ds_destroy(&s);
2204     if (stream != stdin) {
2205         fclose(stream);
2206     }
2207     return NULL;
2208 }