ovs-ofctl: Add "out_group" keyword for OF1.1+ matching on output group.
[cascardo/ovs.git] / lib / ofp-parse.c
1 /*
2  * Copyright (c) 2010, 2011, 2012, 2013, 2014, 2015 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 #include <netinet/in.h>
25
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 "simap.h"
40 #include "socket-util.h"
41 #include "openvswitch/vconn.h"
42
43 /* Parses 'str' as an 8-bit unsigned integer into '*valuep'.
44  *
45  * 'name' describes the value parsed in an error message, if any.
46  *
47  * Returns NULL if successful, otherwise a malloc()'d string describing the
48  * error.  The caller is responsible for freeing the returned string. */
49 char * OVS_WARN_UNUSED_RESULT
50 str_to_u8(const char *str, const char *name, uint8_t *valuep)
51 {
52     int value;
53
54     if (!str_to_int(str, 0, &value) || value < 0 || value > 255) {
55         return xasprintf("invalid %s \"%s\"", name, str);
56     }
57     *valuep = value;
58     return NULL;
59 }
60
61 /* Parses 'str' as a 16-bit unsigned integer into '*valuep'.
62  *
63  * 'name' describes the value parsed in an error message, if any.
64  *
65  * Returns NULL if successful, otherwise a malloc()'d string describing the
66  * error.  The caller is responsible for freeing the returned string. */
67 char * OVS_WARN_UNUSED_RESULT
68 str_to_u16(const char *str, const char *name, uint16_t *valuep)
69 {
70     int value;
71
72     if (!str_to_int(str, 0, &value) || value < 0 || value > 65535) {
73         return xasprintf("invalid %s \"%s\"", name, str);
74     }
75     *valuep = value;
76     return NULL;
77 }
78
79 /* Parses 'str' as a 32-bit unsigned integer into '*valuep'.
80  *
81  * Returns NULL if successful, otherwise a malloc()'d string describing the
82  * error.  The caller is responsible for freeing the returned string. */
83 char * OVS_WARN_UNUSED_RESULT
84 str_to_u32(const char *str, uint32_t *valuep)
85 {
86     char *tail;
87     uint32_t value;
88
89     if (!str[0]) {
90         return xstrdup("missing required numeric argument");
91     }
92
93     errno = 0;
94     value = strtoul(str, &tail, 0);
95     if (errno == EINVAL || errno == ERANGE || *tail) {
96         return xasprintf("invalid numeric format %s", str);
97     }
98     *valuep = value;
99     return NULL;
100 }
101
102 /* Parses 'str' as an 64-bit unsigned integer into '*valuep'.
103  *
104  * Returns NULL if successful, otherwise a malloc()'d string describing the
105  * error.  The caller is responsible for freeing the returned string. */
106 char * OVS_WARN_UNUSED_RESULT
107 str_to_u64(const char *str, uint64_t *valuep)
108 {
109     char *tail;
110     uint64_t value;
111
112     if (!str[0]) {
113         return xstrdup("missing required numeric argument");
114     }
115
116     errno = 0;
117     value = strtoull(str, &tail, 0);
118     if (errno == EINVAL || errno == ERANGE || *tail) {
119         return xasprintf("invalid numeric format %s", str);
120     }
121     *valuep = value;
122     return NULL;
123 }
124
125 /* Parses 'str' as an 64-bit unsigned integer in network byte order into
126  * '*valuep'.
127  *
128  * Returns NULL if successful, otherwise a malloc()'d string describing the
129  * error.  The caller is responsible for freeing the returned string. */
130 char * OVS_WARN_UNUSED_RESULT
131 str_to_be64(const char *str, ovs_be64 *valuep)
132 {
133     uint64_t value = 0;
134     char *error;
135
136     error = str_to_u64(str, &value);
137     if (!error) {
138         *valuep = htonll(value);
139     }
140     return error;
141 }
142
143 /* Parses 'str' as an Ethernet address into 'mac'.
144  *
145  * Returns NULL if successful, otherwise a malloc()'d string describing the
146  * error.  The caller is responsible for freeing the returned string. */
147 char * OVS_WARN_UNUSED_RESULT
148 str_to_mac(const char *str, struct eth_addr *mac)
149 {
150     if (!ovs_scan(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(*mac))) {
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 char * OVS_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 'str' as a conntrack helper into 'alg'.
173  *
174  * Returns NULL if successful, otherwise a malloc()'d string describing the
175  * error.  The caller is responsible for freeing the returned string. */
176 char * OVS_WARN_UNUSED_RESULT
177 str_to_connhelper(const char *str, uint16_t *alg)
178 {
179     if (!strcmp(str, "ftp")) {
180         *alg = IPPORT_FTP;
181         return NULL;
182     }
183     return xasprintf("invalid conntrack helper \"%s\"", str);
184 }
185
186 struct protocol {
187     const char *name;
188     uint16_t dl_type;
189     uint8_t nw_proto;
190 };
191
192 static bool
193 parse_protocol(const char *name, const struct protocol **p_out)
194 {
195     static const struct protocol protocols[] = {
196         { "ip", ETH_TYPE_IP, 0 },
197         { "ipv4", ETH_TYPE_IP, 0 },
198         { "ip4", ETH_TYPE_IP, 0 },
199         { "arp", ETH_TYPE_ARP, 0 },
200         { "icmp", ETH_TYPE_IP, IPPROTO_ICMP },
201         { "tcp", ETH_TYPE_IP, IPPROTO_TCP },
202         { "udp", ETH_TYPE_IP, IPPROTO_UDP },
203         { "sctp", ETH_TYPE_IP, IPPROTO_SCTP },
204         { "ipv6", ETH_TYPE_IPV6, 0 },
205         { "ip6", ETH_TYPE_IPV6, 0 },
206         { "icmp6", ETH_TYPE_IPV6, IPPROTO_ICMPV6 },
207         { "tcp6", ETH_TYPE_IPV6, IPPROTO_TCP },
208         { "udp6", ETH_TYPE_IPV6, IPPROTO_UDP },
209         { "sctp6", ETH_TYPE_IPV6, IPPROTO_SCTP },
210         { "rarp", ETH_TYPE_RARP, 0},
211         { "mpls", ETH_TYPE_MPLS, 0 },
212         { "mplsm", ETH_TYPE_MPLS_MCAST, 0 },
213     };
214     const struct protocol *p;
215
216     for (p = protocols; p < &protocols[ARRAY_SIZE(protocols)]; p++) {
217         if (!strcmp(p->name, name)) {
218             *p_out = p;
219             return true;
220         }
221     }
222     *p_out = NULL;
223     return false;
224 }
225
226 /* Parses 's' as the (possibly masked) value of field 'mf', and updates
227  * 'match' appropriately.  Restricts the set of usable protocols to ones
228  * supporting the parsed field.
229  *
230  * Returns NULL if successful, otherwise a malloc()'d string describing the
231  * error.  The caller is responsible for freeing the returned string. */
232 static char * OVS_WARN_UNUSED_RESULT
233 parse_field(const struct mf_field *mf, const char *s, struct match *match,
234             enum ofputil_protocol *usable_protocols)
235 {
236     union mf_value value, mask;
237     char *error;
238
239     if (!*s) {
240         /* If there's no string, we're just trying to match on the
241          * existence of the field, so use a no-op value. */
242         s = "0/0";
243     }
244
245     error = mf_parse(mf, s, &value, &mask);
246     if (!error) {
247         *usable_protocols &= mf_set(mf, &value, &mask, match, &error);
248     }
249     return error;
250 }
251
252 static char *
253 extract_actions(char *s)
254 {
255     s = strstr(s, "action");
256     if (s) {
257         *s = '\0';
258         s = strchr(s + 1, '=');
259         return s ? s + 1 : NULL;
260     } else {
261         return NULL;
262     }
263 }
264
265
266 static char * OVS_WARN_UNUSED_RESULT
267 parse_ofp_str__(struct ofputil_flow_mod *fm, int command, char *string,
268                 enum ofputil_protocol *usable_protocols)
269 {
270     enum {
271         F_OUT_PORT = 1 << 0,
272         F_ACTIONS = 1 << 1,
273         F_IMPORTANCE = 1 << 2,
274         F_TIMEOUT = 1 << 3,
275         F_PRIORITY = 1 << 4,
276         F_FLAGS = 1 << 5,
277     } fields;
278     char *act_str = NULL;
279     char *name, *value;
280
281     *usable_protocols = OFPUTIL_P_ANY;
282
283     if (command == -2) {
284         size_t len;
285
286         string += strspn(string, " \t\r\n");   /* Skip white space. */
287         len = strcspn(string, ", \t\r\n"); /* Get length of the first token. */
288
289         if (!strncmp(string, "add", len)) {
290             command = OFPFC_ADD;
291         } else if (!strncmp(string, "delete", len)) {
292             command = OFPFC_DELETE;
293         } else if (!strncmp(string, "delete_strict", len)) {
294             command = OFPFC_DELETE_STRICT;
295         } else if (!strncmp(string, "modify", len)) {
296             command = OFPFC_MODIFY;
297         } else if (!strncmp(string, "modify_strict", len)) {
298             command = OFPFC_MODIFY_STRICT;
299         } else {
300             len = 0;
301             command = OFPFC_ADD;
302         }
303         string += len;
304     }
305
306     switch (command) {
307     case -1:
308         fields = F_OUT_PORT;
309         break;
310
311     case OFPFC_ADD:
312         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS | F_IMPORTANCE;
313         break;
314
315     case OFPFC_DELETE:
316         fields = F_OUT_PORT;
317         break;
318
319     case OFPFC_DELETE_STRICT:
320         fields = F_OUT_PORT | F_PRIORITY;
321         break;
322
323     case OFPFC_MODIFY:
324         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
325         break;
326
327     case OFPFC_MODIFY_STRICT:
328         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
329         break;
330
331     default:
332         OVS_NOT_REACHED();
333     }
334
335     match_init_catchall(&fm->match);
336     fm->priority = OFP_DEFAULT_PRIORITY;
337     fm->cookie = htonll(0);
338     fm->cookie_mask = htonll(0);
339     if (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) {
340         /* For modify, by default, don't update the cookie. */
341         fm->new_cookie = OVS_BE64_MAX;
342     } else{
343         fm->new_cookie = htonll(0);
344     }
345     fm->modify_cookie = false;
346     fm->table_id = 0xff;
347     fm->command = command;
348     fm->idle_timeout = OFP_FLOW_PERMANENT;
349     fm->hard_timeout = OFP_FLOW_PERMANENT;
350     fm->buffer_id = UINT32_MAX;
351     fm->out_port = OFPP_ANY;
352     fm->flags = 0;
353     fm->importance = 0;
354     fm->out_group = OFPG_ANY;
355     fm->delete_reason = OFPRR_DELETE;
356     if (fields & F_ACTIONS) {
357         act_str = extract_actions(string);
358         if (!act_str) {
359             return xstrdup("must specify an action");
360         }
361     }
362
363     while (ofputil_parse_key_value(&string, &name, &value)) {
364         const struct protocol *p;
365         char *error = NULL;
366
367         if (parse_protocol(name, &p)) {
368             match_set_dl_type(&fm->match, htons(p->dl_type));
369             if (p->nw_proto) {
370                 match_set_nw_proto(&fm->match, p->nw_proto);
371             }
372         } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) {
373             fm->flags |= OFPUTIL_FF_SEND_FLOW_REM;
374         } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) {
375             fm->flags |= OFPUTIL_FF_CHECK_OVERLAP;
376         } else if (fields & F_FLAGS && !strcmp(name, "reset_counts")) {
377             fm->flags |= OFPUTIL_FF_RESET_COUNTS;
378             *usable_protocols &= OFPUTIL_P_OF12_UP;
379         } else if (fields & F_FLAGS && !strcmp(name, "no_packet_counts")) {
380             fm->flags |= OFPUTIL_FF_NO_PKT_COUNTS;
381             *usable_protocols &= OFPUTIL_P_OF13_UP;
382         } else if (fields & F_FLAGS && !strcmp(name, "no_byte_counts")) {
383             fm->flags |= OFPUTIL_FF_NO_BYT_COUNTS;
384             *usable_protocols &= OFPUTIL_P_OF13_UP;
385         } else if (!strcmp(name, "no_readonly_table")
386                    || !strcmp(name, "allow_hidden_fields")) {
387              /* ignore these fields. */
388         } else if (mf_from_name(name)) {
389             error = parse_field(mf_from_name(name), value, &fm->match,
390                                 usable_protocols);
391         } else {
392             if (!*value) {
393                 return xasprintf("field %s missing value", name);
394             }
395
396             if (!strcmp(name, "table")) {
397                 error = str_to_u8(value, "table", &fm->table_id);
398                 if (fm->table_id != 0xff) {
399                     *usable_protocols &= OFPUTIL_P_TID;
400                 }
401             } else if (fields & F_OUT_PORT && !strcmp(name, "out_port")) {
402                 if (!ofputil_port_from_string(value, &fm->out_port)) {
403                     error = xasprintf("%s is not a valid OpenFlow port",
404                                       value);
405                 }
406             } else if (fields & F_OUT_PORT && !strcmp(name, "out_group")) {
407                 *usable_protocols &= OFPUTIL_P_OF11_UP;
408                 if (!ofputil_group_from_string(value, &fm->out_group)) {
409                     error = xasprintf("%s is not a valid OpenFlow group",
410                                       value);
411                 }
412             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
413                 uint16_t priority = 0;
414
415                 error = str_to_u16(value, name, &priority);
416                 fm->priority = priority;
417             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
418                 error = str_to_u16(value, name, &fm->idle_timeout);
419             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
420                 error = str_to_u16(value, name, &fm->hard_timeout);
421             } else if (fields & F_IMPORTANCE && !strcmp(name, "importance")) {
422                 error = str_to_u16(value, name, &fm->importance);
423             } else if (!strcmp(name, "cookie")) {
424                 char *mask = strchr(value, '/');
425
426                 if (mask) {
427                     /* A mask means we're searching for a cookie. */
428                     if (command == OFPFC_ADD) {
429                         return xstrdup("flow additions cannot use "
430                                        "a cookie mask");
431                     }
432                     *mask = '\0';
433                     error = str_to_be64(value, &fm->cookie);
434                     if (error) {
435                         return error;
436                     }
437                     error = str_to_be64(mask + 1, &fm->cookie_mask);
438
439                     /* Matching of the cookie is only supported through NXM or
440                      * OF1.1+. */
441                     if (fm->cookie_mask != htonll(0)) {
442                         *usable_protocols &= OFPUTIL_P_NXM_OF11_UP;
443                     }
444                 } else {
445                     /* No mask means that the cookie is being set. */
446                     if (command != OFPFC_ADD && command != OFPFC_MODIFY
447                         && command != OFPFC_MODIFY_STRICT) {
448                         return xstrdup("cannot set cookie");
449                     }
450                     error = str_to_be64(value, &fm->new_cookie);
451                     fm->modify_cookie = true;
452                 }
453             } else if (!strcmp(name, "duration")
454                        || !strcmp(name, "n_packets")
455                        || !strcmp(name, "n_bytes")
456                        || !strcmp(name, "idle_age")
457                        || !strcmp(name, "hard_age")) {
458                 /* Ignore these, so that users can feed the output of
459                  * "ovs-ofctl dump-flows" back into commands that parse
460                  * flows. */
461             } else {
462                 error = xasprintf("unknown keyword %s", name);
463             }
464         }
465
466         if (error) {
467             return error;
468         }
469     }
470     /* Check for usable protocol interdependencies between match fields. */
471     if (fm->match.flow.dl_type == htons(ETH_TYPE_IPV6)) {
472         const struct flow_wildcards *wc = &fm->match.wc;
473         /* Only NXM and OXM support matching L3 and L4 fields within IPv6.
474          *
475          * (IPv6 specific fields as well as arp_sha, arp_tha, nw_frag, and
476          *  nw_ttl are covered elsewhere so they don't need to be included in
477          *  this test too.)
478          */
479         if (wc->masks.nw_proto || wc->masks.nw_tos
480             || wc->masks.tp_src || wc->masks.tp_dst) {
481             *usable_protocols &= OFPUTIL_P_NXM_OXM_ANY;
482         }
483     }
484     if (!fm->cookie_mask && fm->new_cookie == OVS_BE64_MAX
485         && (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT)) {
486         /* On modifies without a mask, we are supposed to add a flow if
487          * one does not exist.  If a cookie wasn't been specified, use a
488          * default of zero. */
489         fm->new_cookie = htonll(0);
490     }
491     if (fields & F_ACTIONS) {
492         enum ofputil_protocol action_usable_protocols;
493         struct ofpbuf ofpacts;
494         char *error;
495
496         ofpbuf_init(&ofpacts, 32);
497         error = ofpacts_parse_instructions(act_str, &ofpacts,
498                                            &action_usable_protocols);
499         *usable_protocols &= action_usable_protocols;
500         if (!error) {
501             enum ofperr err;
502
503             err = ofpacts_check(ofpacts.data, ofpacts.size, &fm->match.flow,
504                                 OFPP_MAX, fm->table_id, 255, usable_protocols);
505             if (!err && !*usable_protocols) {
506                 err = OFPERR_OFPBAC_MATCH_INCONSISTENT;
507             }
508             if (err) {
509                 error = xasprintf("actions are invalid with specified match "
510                                   "(%s)", ofperr_to_string(err));
511             }
512
513         }
514         if (error) {
515             ofpbuf_uninit(&ofpacts);
516             return error;
517         }
518
519         fm->ofpacts_len = ofpacts.size;
520         fm->ofpacts = ofpbuf_steal_data(&ofpacts);
521     } else {
522         fm->ofpacts_len = 0;
523         fm->ofpacts = NULL;
524     }
525
526     return NULL;
527 }
528
529 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
530  * page) into 'fm' for sending the specified flow_mod 'command' to a switch.
531  * Returns the set of usable protocols in '*usable_protocols'.
532  *
533  * To parse syntax for an OFPT_FLOW_MOD (or NXT_FLOW_MOD), use an OFPFC_*
534  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
535  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'.
536  *
537  * If 'command' is given as -2, 'str_' may begin with a command name ("add",
538  * "modify", "delete", "modify_strict", or "delete_strict").  A missing command
539  * name is treated as "add".
540  *
541  * Returns NULL if successful, otherwise a malloc()'d string describing the
542  * error.  The caller is responsible for freeing the returned string. */
543 char * OVS_WARN_UNUSED_RESULT
544 parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
545               enum ofputil_protocol *usable_protocols)
546 {
547     char *string = xstrdup(str_);
548     char *error;
549
550     error = parse_ofp_str__(fm, command, string, usable_protocols);
551     if (error) {
552         fm->ofpacts = NULL;
553         fm->ofpacts_len = 0;
554     }
555
556     free(string);
557     return error;
558 }
559
560 static char * OVS_WARN_UNUSED_RESULT
561 parse_ofp_meter_mod_str__(struct ofputil_meter_mod *mm, char *string,
562                           struct ofpbuf *bands, int command,
563                           enum ofputil_protocol *usable_protocols)
564 {
565     enum {
566         F_METER = 1 << 0,
567         F_FLAGS = 1 << 1,
568         F_BANDS = 1 << 2,
569     } fields;
570     char *save_ptr = NULL;
571     char *band_str = NULL;
572     char *name;
573
574     /* Meters require at least OF 1.3. */
575     *usable_protocols = OFPUTIL_P_OF13_UP;
576
577     switch (command) {
578     case -1:
579         fields = F_METER;
580         break;
581
582     case OFPMC13_ADD:
583         fields = F_METER | F_FLAGS | F_BANDS;
584         break;
585
586     case OFPMC13_DELETE:
587         fields = F_METER;
588         break;
589
590     case OFPMC13_MODIFY:
591         fields = F_METER | F_FLAGS | F_BANDS;
592         break;
593
594     default:
595         OVS_NOT_REACHED();
596     }
597
598     mm->command = command;
599     mm->meter.meter_id = 0;
600     mm->meter.flags = 0;
601     if (fields & F_BANDS) {
602         band_str = strstr(string, "band");
603         if (!band_str) {
604             return xstrdup("must specify bands");
605         }
606         *band_str = '\0';
607
608         band_str = strchr(band_str + 1, '=');
609         if (!band_str) {
610             return xstrdup("must specify bands");
611         }
612
613         band_str++;
614     }
615     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
616          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
617
618         if (fields & F_FLAGS && !strcmp(name, "kbps")) {
619             mm->meter.flags |= OFPMF13_KBPS;
620         } else if (fields & F_FLAGS && !strcmp(name, "pktps")) {
621             mm->meter.flags |= OFPMF13_PKTPS;
622         } else if (fields & F_FLAGS && !strcmp(name, "burst")) {
623             mm->meter.flags |= OFPMF13_BURST;
624         } else if (fields & F_FLAGS && !strcmp(name, "stats")) {
625             mm->meter.flags |= OFPMF13_STATS;
626         } else {
627             char *value;
628
629             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
630             if (!value) {
631                 return xasprintf("field %s missing value", name);
632             }
633
634             if (!strcmp(name, "meter")) {
635                 if (!strcmp(value, "all")) {
636                     mm->meter.meter_id = OFPM13_ALL;
637                 } else if (!strcmp(value, "controller")) {
638                     mm->meter.meter_id = OFPM13_CONTROLLER;
639                 } else if (!strcmp(value, "slowpath")) {
640                     mm->meter.meter_id = OFPM13_SLOWPATH;
641                 } else {
642                     char *error = str_to_u32(value, &mm->meter.meter_id);
643                     if (error) {
644                         return error;
645                     }
646                     if (mm->meter.meter_id > OFPM13_MAX
647                         || !mm->meter.meter_id) {
648                         return xasprintf("invalid value for %s", name);
649                     }
650                 }
651             } else {
652                 return xasprintf("unknown keyword %s", name);
653             }
654         }
655     }
656     if (fields & F_METER && !mm->meter.meter_id) {
657         return xstrdup("must specify 'meter'");
658     }
659     if (fields & F_FLAGS && !mm->meter.flags) {
660         return xstrdup("meter must specify either 'kbps' or 'pktps'");
661     }
662
663     if (fields & F_BANDS) {
664         uint16_t n_bands = 0;
665         struct ofputil_meter_band *band = NULL;
666         int i;
667
668         for (name = strtok_r(band_str, "=, \t\r\n", &save_ptr); name;
669              name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
670
671             char *value;
672
673             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
674             if (!value) {
675                 return xasprintf("field %s missing value", name);
676             }
677
678             if (!strcmp(name, "type")) {
679                 /* Start a new band */
680                 band = ofpbuf_put_zeros(bands, sizeof *band);
681                 n_bands++;
682
683                 if (!strcmp(value, "drop")) {
684                     band->type = OFPMBT13_DROP;
685                 } else if (!strcmp(value, "dscp_remark")) {
686                     band->type = OFPMBT13_DSCP_REMARK;
687                 } else {
688                     return xasprintf("field %s unknown value %s", name, value);
689                 }
690             } else if (!band || !band->type) {
691                 return xstrdup("band must start with the 'type' keyword");
692             } else if (!strcmp(name, "rate")) {
693                 char *error = str_to_u32(value, &band->rate);
694                 if (error) {
695                     return error;
696                 }
697             } else if (!strcmp(name, "burst_size")) {
698                 char *error = str_to_u32(value, &band->burst_size);
699                 if (error) {
700                     return error;
701                 }
702             } else if (!strcmp(name, "prec_level")) {
703                 char *error = str_to_u8(value, name, &band->prec_level);
704                 if (error) {
705                     return error;
706                 }
707             } else {
708                 return xasprintf("unknown keyword %s", name);
709             }
710         }
711         /* validate bands */
712         if (!n_bands) {
713             return xstrdup("meter must have bands");
714         }
715
716         mm->meter.n_bands = n_bands;
717         mm->meter.bands = ofpbuf_steal_data(bands);
718
719         for (i = 0; i < n_bands; ++i) {
720             band = &mm->meter.bands[i];
721
722             if (!band->type) {
723                 return xstrdup("band must have 'type'");
724             }
725             if (band->type == OFPMBT13_DSCP_REMARK) {
726                 if (!band->prec_level) {
727                     return xstrdup("'dscp_remark' band must have"
728                                    " 'prec_level'");
729                 }
730             } else {
731                 if (band->prec_level) {
732                     return xstrdup("Only 'dscp_remark' band may have"
733                                    " 'prec_level'");
734                 }
735             }
736             if (!band->rate) {
737                 return xstrdup("band must have 'rate'");
738             }
739             if (mm->meter.flags & OFPMF13_BURST) {
740                 if (!band->burst_size) {
741                     return xstrdup("band must have 'burst_size' "
742                                    "when 'burst' flag is set");
743                 }
744             } else {
745                 if (band->burst_size) {
746                     return xstrdup("band may have 'burst_size' only "
747                                    "when 'burst' flag is set");
748                 }
749             }
750         }
751     } else {
752         mm->meter.n_bands = 0;
753         mm->meter.bands = NULL;
754     }
755
756     return NULL;
757 }
758
759 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
760  * page) into 'mm' for sending the specified meter_mod 'command' to a switch.
761  *
762  * Returns NULL if successful, otherwise a malloc()'d string describing the
763  * error.  The caller is responsible for freeing the returned string. */
764 char * OVS_WARN_UNUSED_RESULT
765 parse_ofp_meter_mod_str(struct ofputil_meter_mod *mm, const char *str_,
766                         int command, enum ofputil_protocol *usable_protocols)
767 {
768     struct ofpbuf bands;
769     char *string;
770     char *error;
771
772     ofpbuf_init(&bands, 64);
773     string = xstrdup(str_);
774
775     error = parse_ofp_meter_mod_str__(mm, string, &bands, command,
776                                       usable_protocols);
777
778     free(string);
779     ofpbuf_uninit(&bands);
780
781     return error;
782 }
783
784 static char * OVS_WARN_UNUSED_RESULT
785 parse_flow_monitor_request__(struct ofputil_flow_monitor_request *fmr,
786                              const char *str_, char *string,
787                              enum ofputil_protocol *usable_protocols)
788 {
789     static atomic_count id = ATOMIC_COUNT_INIT(0);
790     char *name, *value;
791
792     fmr->id = atomic_count_inc(&id);
793
794     fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
795                   | NXFMF_OWN | NXFMF_ACTIONS);
796     fmr->out_port = OFPP_NONE;
797     fmr->table_id = 0xff;
798     match_init_catchall(&fmr->match);
799
800     while (ofputil_parse_key_value(&string, &name, &value)) {
801         const struct protocol *p;
802         char *error = NULL;
803
804         if (!strcmp(name, "!initial")) {
805             fmr->flags &= ~NXFMF_INITIAL;
806         } else if (!strcmp(name, "!add")) {
807             fmr->flags &= ~NXFMF_ADD;
808         } else if (!strcmp(name, "!delete")) {
809             fmr->flags &= ~NXFMF_DELETE;
810         } else if (!strcmp(name, "!modify")) {
811             fmr->flags &= ~NXFMF_MODIFY;
812         } else if (!strcmp(name, "!actions")) {
813             fmr->flags &= ~NXFMF_ACTIONS;
814         } else if (!strcmp(name, "!own")) {
815             fmr->flags &= ~NXFMF_OWN;
816         } else if (parse_protocol(name, &p)) {
817             match_set_dl_type(&fmr->match, htons(p->dl_type));
818             if (p->nw_proto) {
819                 match_set_nw_proto(&fmr->match, p->nw_proto);
820             }
821         } else if (mf_from_name(name)) {
822             error = parse_field(mf_from_name(name), value, &fmr->match,
823                                 usable_protocols);
824         } else {
825             if (!*value) {
826                 return xasprintf("%s: field %s missing value", str_, name);
827             }
828
829             if (!strcmp(name, "table")) {
830                 error = str_to_u8(value, "table", &fmr->table_id);
831             } else if (!strcmp(name, "out_port")) {
832                 fmr->out_port = u16_to_ofp(atoi(value));
833             } else {
834                 return xasprintf("%s: unknown keyword %s", str_, name);
835             }
836         }
837
838         if (error) {
839             return error;
840         }
841     }
842     return NULL;
843 }
844
845 /* Convert 'str_' (as described in the documentation for the "monitor" command
846  * in the ovs-ofctl man page) into 'fmr'.
847  *
848  * Returns NULL if successful, otherwise a malloc()'d string describing the
849  * error.  The caller is responsible for freeing the returned string. */
850 char * OVS_WARN_UNUSED_RESULT
851 parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,
852                            const char *str_,
853                            enum ofputil_protocol *usable_protocols)
854 {
855     char *string = xstrdup(str_);
856     char *error = parse_flow_monitor_request__(fmr, str_, string,
857                                                usable_protocols);
858     free(string);
859     return error;
860 }
861
862 /* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
863  * (one of OFPFC_*) into 'fm'.
864  *
865  * If 'command' is given as -2, 'string' may begin with a command name ("add",
866  * "modify", "delete", "modify_strict", or "delete_strict").  A missing command
867  * name is treated as "add".
868  *
869  * Returns NULL if successful, otherwise a malloc()'d string describing the
870  * error.  The caller is responsible for freeing the returned string. */
871 char * OVS_WARN_UNUSED_RESULT
872 parse_ofp_flow_mod_str(struct ofputil_flow_mod *fm, const char *string,
873                        int command,
874                        enum ofputil_protocol *usable_protocols)
875 {
876     char *error = parse_ofp_str(fm, command, string, usable_protocols);
877
878     if (!error) {
879         /* Normalize a copy of the match.  This ensures that non-normalized
880          * flows get logged but doesn't affect what gets sent to the switch, so
881          * that the switch can do whatever it likes with the flow. */
882         struct match match_copy = fm->match;
883         ofputil_normalize_match(&match_copy);
884     }
885
886     return error;
887 }
888
889 /* Convert 'table_id' and 'setting' (as described for the "mod-table" command
890  * in the ovs-ofctl man page) into 'tm' for sending a table_mod command to a
891  * switch.
892  *
893  * Stores a bitmap of the OpenFlow versions that are usable for 'tm' into
894  * '*usable_versions'.
895  *
896  * Returns NULL if successful, otherwise a malloc()'d string describing the
897  * error.  The caller is responsible for freeing the returned string. */
898 char * OVS_WARN_UNUSED_RESULT
899 parse_ofp_table_mod(struct ofputil_table_mod *tm, const char *table_id,
900                     const char *setting, uint32_t *usable_versions)
901 {
902     *usable_versions = 0;
903     if (!strcasecmp(table_id, "all")) {
904         tm->table_id = OFPTT_ALL;
905     } else {
906         char *error = str_to_u8(table_id, "table_id", &tm->table_id);
907         if (error) {
908             return error;
909         }
910     }
911
912     tm->miss = OFPUTIL_TABLE_MISS_DEFAULT;
913     tm->eviction = OFPUTIL_TABLE_EVICTION_DEFAULT;
914     tm->eviction_flags = UINT32_MAX;
915
916     /* Only OpenFlow 1.1 and 1.2 can configure table-miss via table_mod.
917      * Only OpenFlow 1.4+ can configure eviction via table_mod.
918      *
919      * (OpenFlow 1.4+ can also configure vacancy events via table_mod, but OVS
920      * doesn't support those yet and they're also logically a per-OpenFlow
921      * session setting so it wouldn't make sense to support them here anyway.)
922      */
923     if (!strcmp(setting, "controller")) {
924         tm->miss = OFPUTIL_TABLE_MISS_CONTROLLER;
925         *usable_versions = (1u << OFP11_VERSION) | (1u << OFP12_VERSION);
926     } else if (!strcmp(setting, "continue")) {
927         tm->miss = OFPUTIL_TABLE_MISS_CONTINUE;
928         *usable_versions = (1u << OFP11_VERSION) | (1u << OFP12_VERSION);
929     } else if (!strcmp(setting, "drop")) {
930         tm->miss = OFPUTIL_TABLE_MISS_DROP;
931         *usable_versions = (1u << OFP11_VERSION) | (1u << OFP12_VERSION);
932     } else if (!strcmp(setting, "evict")) {
933         tm->eviction = OFPUTIL_TABLE_EVICTION_ON;
934         *usable_versions = (1 << OFP14_VERSION) | (1u << OFP15_VERSION);
935     } else if (!strcmp(setting, "noevict")) {
936         tm->eviction = OFPUTIL_TABLE_EVICTION_OFF;
937         *usable_versions = (1 << OFP14_VERSION) | (1u << OFP15_VERSION);
938     } else {
939         return xasprintf("invalid table_mod setting %s", setting);
940     }
941
942     if (tm->table_id == 0xfe
943         && tm->miss == OFPUTIL_TABLE_MISS_CONTINUE) {
944         return xstrdup("last table's flow miss handling can not be continue");
945     }
946
947     return NULL;
948 }
949
950
951 /* Opens file 'file_name' and reads each line as a flow_mod of the specified
952  * type (one of OFPFC_*).  Stores each flow_mod in '*fm', an array allocated
953  * on the caller's behalf, and the number of flow_mods in '*n_fms'.
954  *
955  * If 'command' is given as -2, each line may start with a command name
956  * ("add", "modify", "delete", "modify_strict", or "delete_strict").  A missing
957  * command name is treated as "add".
958  *
959  * Returns NULL if successful, otherwise a malloc()'d string describing the
960  * error.  The caller is responsible for freeing the returned string. */
961 char * OVS_WARN_UNUSED_RESULT
962 parse_ofp_flow_mod_file(const char *file_name, int command,
963                         struct ofputil_flow_mod **fms, size_t *n_fms,
964                         enum ofputil_protocol *usable_protocols)
965 {
966     size_t allocated_fms;
967     int line_number;
968     FILE *stream;
969     struct ds s;
970
971     *usable_protocols = OFPUTIL_P_ANY;
972
973     *fms = NULL;
974     *n_fms = 0;
975
976     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
977     if (stream == NULL) {
978         return xasprintf("%s: open failed (%s)",
979                          file_name, ovs_strerror(errno));
980     }
981
982     allocated_fms = *n_fms;
983     ds_init(&s);
984     line_number = 0;
985     while (!ds_get_preprocessed_line(&s, stream, &line_number)) {
986         char *error;
987         enum ofputil_protocol usable;
988
989         if (*n_fms >= allocated_fms) {
990             *fms = x2nrealloc(*fms, &allocated_fms, sizeof **fms);
991         }
992         error = parse_ofp_flow_mod_str(&(*fms)[*n_fms], ds_cstr(&s), command,
993                                        &usable);
994         if (error) {
995             size_t i;
996
997             for (i = 0; i < *n_fms; i++) {
998                 free(CONST_CAST(struct ofpact *, (*fms)[i].ofpacts));
999             }
1000             free(*fms);
1001             *fms = NULL;
1002             *n_fms = 0;
1003
1004             ds_destroy(&s);
1005             if (stream != stdin) {
1006                 fclose(stream);
1007             }
1008
1009             return xasprintf("%s:%d: %s", file_name, line_number, error);
1010         }
1011         *usable_protocols &= usable; /* Each line can narrow the set. */
1012         *n_fms += 1;
1013     }
1014
1015     ds_destroy(&s);
1016     if (stream != stdin) {
1017         fclose(stream);
1018     }
1019     return NULL;
1020 }
1021
1022 char * OVS_WARN_UNUSED_RESULT
1023 parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
1024                                  bool aggregate, const char *string,
1025                                  enum ofputil_protocol *usable_protocols)
1026 {
1027     struct ofputil_flow_mod fm;
1028     char *error;
1029
1030     error = parse_ofp_str(&fm, -1, string, usable_protocols);
1031     if (error) {
1032         return error;
1033     }
1034
1035     /* Special table ID support not required for stats requests. */
1036     if (*usable_protocols & OFPUTIL_P_OF10_STD_TID) {
1037         *usable_protocols |= OFPUTIL_P_OF10_STD;
1038     }
1039     if (*usable_protocols & OFPUTIL_P_OF10_NXM_TID) {
1040         *usable_protocols |= OFPUTIL_P_OF10_NXM;
1041     }
1042
1043     fsr->aggregate = aggregate;
1044     fsr->cookie = fm.cookie;
1045     fsr->cookie_mask = fm.cookie_mask;
1046     fsr->match = fm.match;
1047     fsr->out_port = fm.out_port;
1048     fsr->out_group = fm.out_group;
1049     fsr->table_id = fm.table_id;
1050     return NULL;
1051 }
1052
1053 /* Parses a specification of a flow from 's' into 'flow'.  's' must take the
1054  * form FIELD=VALUE[,FIELD=VALUE]... where each FIELD is the name of a
1055  * mf_field.  Fields must be specified in a natural order for satisfying
1056  * prerequisites. If 'mask' is specified, fills the mask field for each of the
1057  * field specified in flow. If the map, 'names_portno' is specfied, converts
1058  * the in_port name into port no while setting the 'flow'.
1059  *
1060  * Returns NULL on success, otherwise a malloc()'d string that explains the
1061  * problem. */
1062 char *
1063 parse_ofp_exact_flow(struct flow *flow, struct flow *mask, const char *s,
1064                      const struct simap *portno_names)
1065 {
1066     char *pos, *key, *value_s;
1067     char *error = NULL;
1068     char *copy;
1069
1070     memset(flow, 0, sizeof *flow);
1071     if (mask) {
1072         memset(mask, 0, sizeof *mask);
1073     }
1074
1075     pos = copy = xstrdup(s);
1076     while (ofputil_parse_key_value(&pos, &key, &value_s)) {
1077         const struct protocol *p;
1078         if (parse_protocol(key, &p)) {
1079             if (flow->dl_type) {
1080                 error = xasprintf("%s: Ethernet type set multiple times", s);
1081                 goto exit;
1082             }
1083             flow->dl_type = htons(p->dl_type);
1084             if (mask) {
1085                 mask->dl_type = OVS_BE16_MAX;
1086             }
1087
1088             if (p->nw_proto) {
1089                 if (flow->nw_proto) {
1090                     error = xasprintf("%s: network protocol set "
1091                                       "multiple times", s);
1092                     goto exit;
1093                 }
1094                 flow->nw_proto = p->nw_proto;
1095                 if (mask) {
1096                     mask->nw_proto = UINT8_MAX;
1097                 }
1098             }
1099         } else {
1100             const struct mf_field *mf;
1101             union mf_value value;
1102             char *field_error;
1103
1104             mf = mf_from_name(key);
1105             if (!mf) {
1106                 error = xasprintf("%s: unknown field %s", s, key);
1107                 goto exit;
1108             }
1109
1110             if (!mf_are_prereqs_ok(mf, flow)) {
1111                 error = xasprintf("%s: prerequisites not met for setting %s",
1112                                   s, key);
1113                 goto exit;
1114             }
1115
1116             if (mf_is_set(mf, flow)) {
1117                 error = xasprintf("%s: field %s set multiple times", s, key);
1118                 goto exit;
1119             }
1120
1121             if (!strcmp(key, "in_port")
1122                 && portno_names
1123                 && simap_contains(portno_names, value_s)) {
1124                 flow->in_port.ofp_port = u16_to_ofp(
1125                     simap_get(portno_names, value_s));
1126                 if (mask) {
1127                     mask->in_port.ofp_port = u16_to_ofp(ntohs(OVS_BE16_MAX));
1128                 }
1129             } else {
1130                 field_error = mf_parse_value(mf, value_s, &value);
1131                 if (field_error) {
1132                     error = xasprintf("%s: bad value for %s (%s)",
1133                                       s, key, field_error);
1134                     free(field_error);
1135                     goto exit;
1136                 }
1137
1138                 mf_set_flow_value(mf, &value, flow);
1139                 if (mask) {
1140                     mf_mask_field(mf, mask);
1141                 }
1142             }
1143         }
1144     }
1145
1146     if (!flow->in_port.ofp_port) {
1147         flow->in_port.ofp_port = OFPP_NONE;
1148     }
1149
1150 exit:
1151     free(copy);
1152
1153     if (error) {
1154         memset(flow, 0, sizeof *flow);
1155         if (mask) {
1156             memset(mask, 0, sizeof *mask);
1157         }
1158     }
1159     return error;
1160 }
1161
1162 static char * OVS_WARN_UNUSED_RESULT
1163 parse_bucket_str(struct ofputil_bucket *bucket, char *str_, uint8_t group_type,
1164                   enum ofputil_protocol *usable_protocols)
1165 {
1166     char *pos, *key, *value;
1167     struct ofpbuf ofpacts;
1168     struct ds actions;
1169     char *error;
1170
1171     bucket->weight = group_type == OFPGT11_SELECT ? 1 : 0;
1172     bucket->bucket_id = OFPG15_BUCKET_ALL;
1173     bucket->watch_port = OFPP_ANY;
1174     bucket->watch_group = OFPG_ANY;
1175
1176     ds_init(&actions);
1177
1178     pos = str_;
1179     error = NULL;
1180     while (ofputil_parse_key_value(&pos, &key, &value)) {
1181         if (!strcasecmp(key, "weight")) {
1182             error = str_to_u16(value, "weight", &bucket->weight);
1183         } else if (!strcasecmp(key, "watch_port")) {
1184             if (!ofputil_port_from_string(value, &bucket->watch_port)
1185                 || (ofp_to_u16(bucket->watch_port) >= ofp_to_u16(OFPP_MAX)
1186                     && bucket->watch_port != OFPP_ANY)) {
1187                 error = xasprintf("%s: invalid watch_port", value);
1188             }
1189         } else if (!strcasecmp(key, "watch_group")) {
1190             error = str_to_u32(value, &bucket->watch_group);
1191             if (!error && bucket->watch_group > OFPG_MAX) {
1192                 error = xasprintf("invalid watch_group id %"PRIu32,
1193                                   bucket->watch_group);
1194             }
1195         } else if (!strcasecmp(key, "bucket_id")) {
1196             error = str_to_u32(value, &bucket->bucket_id);
1197             if (!error && bucket->bucket_id > OFPG15_BUCKET_MAX) {
1198                 error = xasprintf("invalid bucket_id id %"PRIu32,
1199                                   bucket->bucket_id);
1200             }
1201             *usable_protocols &= OFPUTIL_P_OF15_UP;
1202         } else if (!strcasecmp(key, "action") || !strcasecmp(key, "actions")) {
1203             ds_put_format(&actions, "%s,", value);
1204         } else {
1205             ds_put_format(&actions, "%s(%s),", key, value);
1206         }
1207
1208         if (error) {
1209             ds_destroy(&actions);
1210             return error;
1211         }
1212     }
1213
1214     if (!actions.length) {
1215         return xstrdup("bucket must specify actions");
1216     }
1217     ds_chomp(&actions, ',');
1218
1219     ofpbuf_init(&ofpacts, 0);
1220     error = ofpacts_parse_actions(ds_cstr(&actions), &ofpacts,
1221                                   usable_protocols);
1222     ds_destroy(&actions);
1223     if (error) {
1224         ofpbuf_uninit(&ofpacts);
1225         return error;
1226     }
1227     bucket->ofpacts = ofpacts.data;
1228     bucket->ofpacts_len = ofpacts.size;
1229
1230     return NULL;
1231 }
1232
1233 static char * OVS_WARN_UNUSED_RESULT
1234 parse_select_group_field(char *s, struct field_array *fa,
1235                          enum ofputil_protocol *usable_protocols)
1236 {
1237     char *name, *value_str;
1238
1239     while (ofputil_parse_key_value(&s, &name, &value_str)) {
1240         const struct mf_field *mf = mf_from_name(name);
1241
1242         if (mf) {
1243             char *error;
1244             union mf_value value;
1245
1246             if (bitmap_is_set(fa->used.bm, mf->id)) {
1247                 return xasprintf("%s: duplicate field", name);
1248             }
1249
1250             if (*value_str) {
1251                 error = mf_parse_value(mf, value_str, &value);
1252                 if (error) {
1253                     return error;
1254                 }
1255
1256                 /* The mask cannot be all-zeros */
1257                 if (!mf_is_tun_metadata(mf) &&
1258                     is_all_zeros(&value, mf->n_bytes)) {
1259                     return xasprintf("%s: values are wildcards here "
1260                                      "and must not be all-zeros", s);
1261                 }
1262
1263                 /* The values parsed are masks for fields used
1264                  * by the selection method */
1265                 if (!mf_is_mask_valid(mf, &value)) {
1266                     return xasprintf("%s: invalid mask for field %s",
1267                                      value_str, mf->name);
1268                 }
1269             } else {
1270                 memset(&value, 0xff, mf->n_bytes);
1271             }
1272
1273             field_array_set(mf->id, &value, fa);
1274
1275             if (is_all_ones(&value, mf->n_bytes)) {
1276                 *usable_protocols &= mf->usable_protocols_exact;
1277             } else if (mf->usable_protocols_bitwise == mf->usable_protocols_cidr
1278                        || ip_is_cidr(value.be32)) {
1279                 *usable_protocols &= mf->usable_protocols_cidr;
1280             } else {
1281                 *usable_protocols &= mf->usable_protocols_bitwise;
1282             }
1283         } else {
1284             return xasprintf("%s: unknown field %s", s, name);
1285         }
1286     }
1287
1288     return NULL;
1289 }
1290
1291 static char * OVS_WARN_UNUSED_RESULT
1292 parse_ofp_group_mod_str__(struct ofputil_group_mod *gm, uint16_t command,
1293                           char *string,
1294                           enum ofputil_protocol *usable_protocols)
1295 {
1296     enum {
1297         F_GROUP_TYPE            = 1 << 0,
1298         F_BUCKETS               = 1 << 1,
1299         F_COMMAND_BUCKET_ID     = 1 << 2,
1300         F_COMMAND_BUCKET_ID_ALL = 1 << 3,
1301     } fields;
1302     bool had_type = false;
1303     bool had_command_bucket_id = false;
1304     struct ofputil_bucket *bucket;
1305     char *error = NULL;
1306
1307     *usable_protocols = OFPUTIL_P_OF11_UP;
1308
1309     switch (command) {
1310     case OFPGC11_ADD:
1311         fields = F_GROUP_TYPE | F_BUCKETS;
1312         break;
1313
1314     case OFPGC11_DELETE:
1315         fields = 0;
1316         break;
1317
1318     case OFPGC11_MODIFY:
1319         fields = F_GROUP_TYPE | F_BUCKETS;
1320         break;
1321
1322     case OFPGC15_INSERT_BUCKET:
1323         fields = F_BUCKETS | F_COMMAND_BUCKET_ID;
1324         *usable_protocols &= OFPUTIL_P_OF15_UP;
1325         break;
1326
1327     case OFPGC15_REMOVE_BUCKET:
1328         fields = F_COMMAND_BUCKET_ID | F_COMMAND_BUCKET_ID_ALL;
1329         *usable_protocols &= OFPUTIL_P_OF15_UP;
1330         break;
1331
1332     default:
1333         OVS_NOT_REACHED();
1334     }
1335
1336     memset(gm, 0, sizeof *gm);
1337     gm->command = command;
1338     gm->group_id = OFPG_ANY;
1339     gm->command_bucket_id = OFPG15_BUCKET_ALL;
1340     list_init(&gm->buckets);
1341     if (command == OFPGC11_DELETE && string[0] == '\0') {
1342         gm->group_id = OFPG_ALL;
1343         return NULL;
1344     }
1345
1346     *usable_protocols = OFPUTIL_P_OF11_UP;
1347
1348     /* Strip the buckets off the end of 'string', if there are any, saving a
1349      * pointer for later.  We want to parse the buckets last because the bucket
1350      * type influences bucket defaults. */
1351     char *bkt_str = strstr(string, "bucket=");
1352     if (bkt_str) {
1353         if (!(fields & F_BUCKETS)) {
1354             error = xstrdup("bucket is not needed");
1355             goto out;
1356         }
1357         *bkt_str = '\0';
1358     }
1359
1360     /* Parse everything before the buckets. */
1361     char *pos = string;
1362     char *name, *value;
1363     while (ofputil_parse_key_value(&pos, &name, &value)) {
1364         if (!strcmp(name, "command_bucket_id")) {
1365             if (!(fields & F_COMMAND_BUCKET_ID)) {
1366                 error = xstrdup("command bucket id is not needed");
1367                 goto out;
1368             }
1369             if (!strcmp(value, "all")) {
1370                 gm->command_bucket_id = OFPG15_BUCKET_ALL;
1371             } else if (!strcmp(value, "first")) {
1372                 gm->command_bucket_id = OFPG15_BUCKET_FIRST;
1373             } else if (!strcmp(value, "last")) {
1374                 gm->command_bucket_id = OFPG15_BUCKET_LAST;
1375             } else {
1376                 error = str_to_u32(value, &gm->command_bucket_id);
1377                 if (error) {
1378                     goto out;
1379                 }
1380                 if (gm->command_bucket_id > OFPG15_BUCKET_MAX
1381                     && (gm->command_bucket_id != OFPG15_BUCKET_FIRST
1382                         && gm->command_bucket_id != OFPG15_BUCKET_LAST
1383                         && gm->command_bucket_id != OFPG15_BUCKET_ALL)) {
1384                     error = xasprintf("invalid command bucket id %"PRIu32,
1385                                       gm->command_bucket_id);
1386                     goto out;
1387                 }
1388             }
1389             if (gm->command_bucket_id == OFPG15_BUCKET_ALL
1390                 && !(fields & F_COMMAND_BUCKET_ID_ALL)) {
1391                 error = xstrdup("command_bucket_id=all is not permitted");
1392                 goto out;
1393             }
1394             had_command_bucket_id = true;
1395         } else if (!strcmp(name, "group_id")) {
1396             if(!strcmp(value, "all")) {
1397                 gm->group_id = OFPG_ALL;
1398             } else {
1399                 error = str_to_u32(value, &gm->group_id);
1400                 if (error) {
1401                     goto out;
1402                 }
1403                 if (gm->group_id != OFPG_ALL && gm->group_id > OFPG_MAX) {
1404                     error = xasprintf("invalid group id %"PRIu32,
1405                                       gm->group_id);
1406                     goto out;
1407                 }
1408             }
1409         } else if (!strcmp(name, "type")){
1410             if (!(fields & F_GROUP_TYPE)) {
1411                 error = xstrdup("type is not needed");
1412                 goto out;
1413             }
1414             if (!strcmp(value, "all")) {
1415                 gm->type = OFPGT11_ALL;
1416             } else if (!strcmp(value, "select")) {
1417                 gm->type = OFPGT11_SELECT;
1418             } else if (!strcmp(value, "indirect")) {
1419                 gm->type = OFPGT11_INDIRECT;
1420             } else if (!strcmp(value, "ff") ||
1421                        !strcmp(value, "fast_failover")) {
1422                 gm->type = OFPGT11_FF;
1423             } else {
1424                 error = xasprintf("invalid group type %s", value);
1425                 goto out;
1426             }
1427             had_type = true;
1428         } else if (!strcmp(name, "selection_method")) {
1429             if (!(fields & F_GROUP_TYPE)) {
1430                 error = xstrdup("selection method is not needed");
1431                 goto out;
1432             }
1433             if (strlen(value) >= NTR_MAX_SELECTION_METHOD_LEN) {
1434                 error = xasprintf("selection method is longer than %u"
1435                                   " bytes long",
1436                                   NTR_MAX_SELECTION_METHOD_LEN - 1);
1437                 goto out;
1438             }
1439             memset(gm->props.selection_method, '\0',
1440                    NTR_MAX_SELECTION_METHOD_LEN);
1441             strcpy(gm->props.selection_method, value);
1442             *usable_protocols &= OFPUTIL_P_OF15_UP;
1443         } else if (!strcmp(name, "selection_method_param")) {
1444             if (!(fields & F_GROUP_TYPE)) {
1445                 error = xstrdup("selection method param is not needed");
1446                 goto out;
1447             }
1448             error = str_to_u64(value, &gm->props.selection_method_param);
1449             if (error) {
1450                 goto out;
1451             }
1452             *usable_protocols &= OFPUTIL_P_OF15_UP;
1453         } else if (!strcmp(name, "fields")) {
1454             if (!(fields & F_GROUP_TYPE)) {
1455                 error = xstrdup("fields are not needed");
1456                 goto out;
1457             }
1458             error = parse_select_group_field(value, &gm->props.fields,
1459                                              usable_protocols);
1460             if (error) {
1461                 goto out;
1462             }
1463             *usable_protocols &= OFPUTIL_P_OF15_UP;
1464         } else {
1465             error = xasprintf("unknown keyword %s", name);
1466             goto out;
1467         }
1468     }
1469     if (gm->group_id == OFPG_ANY) {
1470         error = xstrdup("must specify a group_id");
1471         goto out;
1472     }
1473     if (fields & F_GROUP_TYPE && !had_type) {
1474         error = xstrdup("must specify a type");
1475         goto out;
1476     }
1477
1478     if (fields & F_COMMAND_BUCKET_ID) {
1479         if (!(fields & F_COMMAND_BUCKET_ID_ALL || had_command_bucket_id)) {
1480             error = xstrdup("must specify a command bucket id");
1481             goto out;
1482         }
1483     } else if (had_command_bucket_id) {
1484         error = xstrdup("command bucket id is not needed");
1485         goto out;
1486     }
1487
1488     /* Now parse the buckets, if any. */
1489     while (bkt_str) {
1490         char *next_bkt_str;
1491
1492         bkt_str = strchr(bkt_str + 1, '=');
1493         if (!bkt_str) {
1494             error = xstrdup("must specify bucket content");
1495             goto out;
1496         }
1497         bkt_str++;
1498
1499         next_bkt_str = strstr(bkt_str, "bucket=");
1500         if (next_bkt_str) {
1501             *next_bkt_str = '\0';
1502         }
1503
1504         bucket = xzalloc(sizeof(struct ofputil_bucket));
1505         error = parse_bucket_str(bucket, bkt_str, gm->type, usable_protocols);
1506         if (error) {
1507             free(bucket);
1508             goto out;
1509         }
1510         list_push_back(&gm->buckets, &bucket->list_node);
1511
1512         if (gm->type != OFPGT11_SELECT && bucket->weight) {
1513             error = xstrdup("Only select groups can have bucket weights.");
1514             goto out;
1515         }
1516
1517         bkt_str = next_bkt_str;
1518     }
1519     if (gm->type == OFPGT11_INDIRECT && !list_is_short(&gm->buckets)) {
1520         error = xstrdup("Indirect groups can have at most one bucket.");
1521         goto out;
1522     }
1523
1524     return NULL;
1525  out:
1526     ofputil_bucket_list_destroy(&gm->buckets);
1527     return error;
1528 }
1529
1530 char * OVS_WARN_UNUSED_RESULT
1531 parse_ofp_group_mod_str(struct ofputil_group_mod *gm, uint16_t command,
1532                         const char *str_,
1533                         enum ofputil_protocol *usable_protocols)
1534 {
1535     char *string = xstrdup(str_);
1536     char *error = parse_ofp_group_mod_str__(gm, command, string,
1537                                             usable_protocols);
1538     free(string);
1539
1540     if (error) {
1541         ofputil_bucket_list_destroy(&gm->buckets);
1542     }
1543     return error;
1544 }
1545
1546 char * OVS_WARN_UNUSED_RESULT
1547 parse_ofp_group_mod_file(const char *file_name, uint16_t command,
1548                          struct ofputil_group_mod **gms, size_t *n_gms,
1549                          enum ofputil_protocol *usable_protocols)
1550 {
1551     size_t allocated_gms;
1552     int line_number;
1553     FILE *stream;
1554     struct ds s;
1555
1556     *gms = NULL;
1557     *n_gms = 0;
1558
1559     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
1560     if (stream == NULL) {
1561         return xasprintf("%s: open failed (%s)",
1562                          file_name, ovs_strerror(errno));
1563     }
1564
1565     allocated_gms = *n_gms;
1566     ds_init(&s);
1567     line_number = 0;
1568     *usable_protocols = OFPUTIL_P_OF11_UP;
1569     while (!ds_get_preprocessed_line(&s, stream, &line_number)) {
1570         enum ofputil_protocol usable;
1571         char *error;
1572
1573         if (*n_gms >= allocated_gms) {
1574             struct ofputil_group_mod *new_gms;
1575             size_t i;
1576
1577             new_gms = x2nrealloc(*gms, &allocated_gms, sizeof **gms);
1578             for (i = 0; i < *n_gms; i++) {
1579                 list_moved(&new_gms[i].buckets, &(*gms)[i].buckets);
1580             }
1581             *gms = new_gms;
1582         }
1583         error = parse_ofp_group_mod_str(&(*gms)[*n_gms], command, ds_cstr(&s),
1584                                         &usable);
1585         if (error) {
1586             size_t i;
1587
1588             for (i = 0; i < *n_gms; i++) {
1589                 ofputil_bucket_list_destroy(&(*gms)[i].buckets);
1590             }
1591             free(*gms);
1592             *gms = NULL;
1593             *n_gms = 0;
1594
1595             ds_destroy(&s);
1596             if (stream != stdin) {
1597                 fclose(stream);
1598             }
1599
1600             return xasprintf("%s:%d: %s", file_name, line_number, error);
1601         }
1602         *usable_protocols &= usable;
1603         *n_gms += 1;
1604     }
1605
1606     ds_destroy(&s);
1607     if (stream != stdin) {
1608         fclose(stream);
1609     }
1610     return NULL;
1611 }
1612
1613 char * OVS_WARN_UNUSED_RESULT
1614 parse_ofp_geneve_table_mod_str(struct ofputil_geneve_table_mod *gtm,
1615                                uint16_t command, const char *s,
1616                                enum ofputil_protocol *usable_protocols)
1617 {
1618     *usable_protocols = OFPUTIL_P_NXM_OXM_ANY;
1619
1620     gtm->command = command;
1621     list_init(&gtm->mappings);
1622
1623     while (*s) {
1624         struct ofputil_geneve_map *map = xmalloc(sizeof *map);
1625         int n;
1626
1627         if (*s == ',') {
1628             s++;
1629         }
1630
1631         list_push_back(&gtm->mappings, &map->list_node);
1632
1633         if (!ovs_scan(s, "{class=%"SCNi16",type=%"SCNi8",len=%"SCNi8"}->tun_metadata%"SCNi16"%n",
1634                       &map->option_class, &map->option_type, &map->option_len,
1635                       &map->index, &n)) {
1636             ofputil_uninit_geneve_table(&gtm->mappings);
1637             return xstrdup("invalid geneve mapping");
1638         }
1639
1640         s += n;
1641     }
1642
1643     return NULL;
1644 }