ofp-actions: Add parsing of set_field actions
[sliver-openvswitch.git] / lib / ofp-parse.c
1 /*
2  * Copyright (c) 2010, 2011, 2012 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 "autopath.h"
26 #include "bundle.h"
27 #include "byte-order.h"
28 #include "dynamic-string.h"
29 #include "learn.h"
30 #include "meta-flow.h"
31 #include "multipath.h"
32 #include "netdev.h"
33 #include "nx-match.h"
34 #include "ofp-actions.h"
35 #include "ofp-util.h"
36 #include "ofpbuf.h"
37 #include "openflow/openflow.h"
38 #include "packets.h"
39 #include "socket-util.h"
40 #include "vconn.h"
41 #include "vlog.h"
42
43 VLOG_DEFINE_THIS_MODULE(ofp_parse);
44
45 static void ofp_fatal(const char *flow, bool verbose, const char *format, ...)
46     NO_RETURN;
47
48 static uint8_t
49 str_to_table_id(const char *str)
50 {
51     int table_id;
52
53     if (!str_to_int(str, 10, &table_id) || table_id < 0 || table_id > 255) {
54         ovs_fatal(0, "invalid table \"%s\"", str);
55     }
56     return table_id;
57 }
58
59 static uint16_t
60 str_to_u16(const char *str, const char *name)
61 {
62     int value;
63
64     if (!str_to_int(str, 0, &value) || value < 0 || value > 65535) {
65         ovs_fatal(0, "invalid %s \"%s\"", name, str);
66     }
67     return value;
68 }
69
70 static uint32_t
71 str_to_u32(const char *str)
72 {
73     char *tail;
74     uint32_t value;
75
76     if (!str[0]) {
77         ovs_fatal(0, "missing required numeric argument");
78     }
79
80     errno = 0;
81     value = strtoul(str, &tail, 0);
82     if (errno == EINVAL || errno == ERANGE || *tail) {
83         ovs_fatal(0, "invalid numeric format %s", str);
84     }
85     return value;
86 }
87
88 static uint64_t
89 str_to_u64(const char *str)
90 {
91     char *tail;
92     uint64_t value;
93
94     if (!str[0]) {
95         ovs_fatal(0, "missing required numeric argument");
96     }
97
98     errno = 0;
99     value = strtoull(str, &tail, 0);
100     if (errno == EINVAL || errno == ERANGE || *tail) {
101         ovs_fatal(0, "invalid numeric format %s", str);
102     }
103     return value;
104 }
105
106 static void
107 str_to_mac(const char *str, uint8_t mac[6])
108 {
109     if (sscanf(str, ETH_ADDR_SCAN_FMT, ETH_ADDR_SCAN_ARGS(mac))
110         != ETH_ADDR_SCAN_COUNT) {
111         ovs_fatal(0, "invalid mac address %s", str);
112     }
113 }
114
115 static void
116 str_to_ip(const char *str, ovs_be32 *ip)
117 {
118     struct in_addr in_addr;
119
120     if (lookup_ip(str, &in_addr)) {
121         ovs_fatal(0, "%s: could not convert to IP address", str);
122     }
123     *ip = in_addr.s_addr;
124 }
125
126 static void
127 parse_enqueue(char *arg, struct ofpbuf *ofpacts)
128 {
129     char *sp = NULL;
130     char *port = strtok_r(arg, ":q", &sp);
131     char *queue = strtok_r(NULL, "", &sp);
132     struct ofpact_enqueue *enqueue;
133
134     if (port == NULL || queue == NULL) {
135         ovs_fatal(0, "\"enqueue\" syntax is \"enqueue:PORT:QUEUE\"");
136     }
137
138     enqueue = ofpact_put_ENQUEUE(ofpacts);
139     enqueue->port = str_to_u32(port);
140     enqueue->queue = str_to_u32(queue);
141 }
142
143 static void
144 parse_output(char *arg, struct ofpbuf *ofpacts)
145 {
146     if (strchr(arg, '[')) {
147         struct ofpact_output_reg *output_reg;
148
149         output_reg = ofpact_put_OUTPUT_REG(ofpacts);
150         mf_parse_subfield(&output_reg->src, arg);
151         output_reg->max_len = UINT16_MAX;
152     } else {
153         struct ofpact_output *output;
154
155         output = ofpact_put_OUTPUT(ofpacts);
156         output->port = str_to_u32(arg);
157         output->max_len = output->port == OFPP_CONTROLLER ? UINT16_MAX : 0;
158     }
159 }
160
161 static void
162 parse_resubmit(char *arg, struct ofpbuf *ofpacts)
163 {
164     struct ofpact_resubmit *resubmit;
165     char *in_port_s, *table_s;
166
167     resubmit = ofpact_put_RESUBMIT(ofpacts);
168
169     in_port_s = strsep(&arg, ",");
170     if (in_port_s && in_port_s[0]) {
171         resubmit->in_port = ofputil_port_from_string(in_port_s);
172         if (!resubmit->in_port) {
173             ovs_fatal(0, "%s: resubmit to unknown port", in_port_s);
174         }
175     } else {
176         resubmit->in_port = OFPP_IN_PORT;
177     }
178
179     table_s = strsep(&arg, ",");
180     resubmit->table_id = table_s && table_s[0] ? str_to_u32(table_s) : 255;
181
182     if (resubmit->in_port == OFPP_IN_PORT && resubmit->table_id == 255) {
183         ovs_fatal(0, "at least one \"in_port\" or \"table\" must be specified "
184                   " on resubmit");
185     }
186 }
187
188 static void
189 parse_note(const char *arg, struct ofpbuf *ofpacts)
190 {
191     struct ofpact_note *note;
192
193     note = ofpact_put_NOTE(ofpacts);
194     while (*arg != '\0') {
195         uint8_t byte;
196         bool ok;
197
198         if (*arg == '.') {
199             arg++;
200         }
201         if (*arg == '\0') {
202             break;
203         }
204
205         byte = hexits_value(arg, 2, &ok);
206         if (!ok) {
207             ovs_fatal(0, "bad hex digit in `note' argument");
208         }
209         ofpbuf_put(ofpacts, &byte, 1);
210
211         note = ofpacts->l2;
212         note->length++;
213
214         arg += 2;
215     }
216     ofpact_update_len(ofpacts, &note->ofpact);
217 }
218
219 static void
220 parse_fin_timeout(struct ofpbuf *b, char *arg)
221 {
222     struct ofpact_fin_timeout *oft = ofpact_put_FIN_TIMEOUT(b);
223     char *key, *value;
224
225     while (ofputil_parse_key_value(&arg, &key, &value)) {
226         if (!strcmp(key, "idle_timeout")) {
227             oft->fin_idle_timeout = str_to_u16(value, key);
228         } else if (!strcmp(key, "hard_timeout")) {
229             oft->fin_hard_timeout = str_to_u16(value, key);
230         } else {
231             ovs_fatal(0, "invalid key '%s' in 'fin_timeout' argument", key);
232         }
233     }
234 }
235
236 static void
237 parse_controller(struct ofpbuf *b, char *arg)
238 {
239     enum ofp_packet_in_reason reason = OFPR_ACTION;
240     uint16_t controller_id = 0;
241     uint16_t max_len = UINT16_MAX;
242
243     if (!arg[0]) {
244         /* Use defaults. */
245     } else if (strspn(arg, "0123456789") == strlen(arg)) {
246         max_len = str_to_u16(arg, "max_len");
247     } else {
248         char *name, *value;
249
250         while (ofputil_parse_key_value(&arg, &name, &value)) {
251             if (!strcmp(name, "reason")) {
252                 if (!ofputil_packet_in_reason_from_string(value, &reason)) {
253                     ovs_fatal(0, "unknown reason \"%s\"", value);
254                 }
255             } else if (!strcmp(name, "max_len")) {
256                 max_len = str_to_u16(value, "max_len");
257             } else if (!strcmp(name, "id")) {
258                 controller_id = str_to_u16(value, "id");
259             } else {
260                 ovs_fatal(0, "unknown key \"%s\" parsing controller action",
261                           name);
262             }
263         }
264     }
265
266     if (reason == OFPR_ACTION && controller_id == 0) {
267         struct ofpact_output *output;
268
269         output = ofpact_put_OUTPUT(b);
270         output->port = OFPP_CONTROLLER;
271         output->max_len = max_len;
272     } else {
273         struct ofpact_controller *controller;
274
275         controller = ofpact_put_CONTROLLER(b);
276         controller->max_len = max_len;
277         controller->reason = reason;
278         controller->controller_id = controller_id;
279     }
280 }
281
282 static void
283 parse_dec_ttl(struct ofpbuf *b, char *arg)
284 {
285     struct ofpact_cnt_ids *ids;
286
287     ids = ofpact_put_DEC_TTL(b);
288
289     if (*arg == '\0') {
290         uint16_t id = 0;
291
292         ids->ofpact.compat = OFPUTIL_NXAST_DEC_TTL;
293         ofpbuf_put(b, &id, sizeof id);
294         ids = b->l2;
295         ids->n_controllers++;
296     } else {
297         char *cntr;
298
299         ids->ofpact.compat = OFPUTIL_NXAST_DEC_TTL_CNT_IDS;
300         for (cntr = strtok_r(arg, ", ", &arg); cntr != NULL;
301              cntr = strtok_r(NULL, ", ", &arg)) {
302             uint16_t id = atoi(cntr);
303
304             ofpbuf_put(b, &id, sizeof id);
305             ids = b->l2;
306             ids->n_controllers++;
307         }
308         if (!ids->n_controllers) {
309             ovs_fatal(0, "dec_ttl_cnt_ids: expected at least one controller "
310                       "id.");
311         }
312
313     }
314     ofpact_update_len(b, &ids->ofpact);
315 }
316
317 static void
318 set_field_parse(const char *arg, struct ofpbuf *ofpacts)
319 {
320     char *orig = xstrdup(arg);
321     struct ofpact_reg_load *load = ofpact_put_REG_LOAD(ofpacts);
322     char *value;
323     char *delim;
324     char *key;
325     const struct mf_field *mf;
326     const char *error;
327     union mf_value mf_value;
328
329     value = orig;
330     delim = strstr(orig, "->");
331     if (!delim) {
332         ovs_fatal(0, "%s: missing `->'", orig);
333     }
334     if (strlen(delim) <= strlen("->")) {
335         ovs_fatal(0, "%s: missing field name following `->'", orig);
336     }
337
338     key = delim + strlen("->");
339     mf = mf_from_name(key);
340     if (!mf) {
341         ovs_fatal(0, "%s is not valid oxm field name", key);
342     }
343     if (!mf->writable) {
344         ovs_fatal(0, "%s is not allowed to set", key);
345     }
346
347     delim[0] = '\0';
348     error = mf_parse_value(mf, value, &mf_value);
349     if (error) {
350         ovs_fatal(0, "%s", error);
351     }
352     if (!mf_is_value_valid(mf, &mf_value)) {
353         ovs_fatal(0, "%s is not valid valid for field %s", value, key);
354     }
355     ofpact_set_field_init(load, mf, &mf_value);
356     free(orig);
357 }
358
359 static void
360 parse_named_action(enum ofputil_action_code code, const struct flow *flow,
361                    char *arg, struct ofpbuf *ofpacts)
362 {
363     struct ofpact_tunnel *tunnel;
364     uint16_t vid;
365     ovs_be32 ip;
366     uint8_t pcp;
367     uint8_t tos;
368
369     switch (code) {
370     case OFPUTIL_ACTION_INVALID:
371         NOT_REACHED();
372
373     case OFPUTIL_OFPAT10_OUTPUT:
374     case OFPUTIL_OFPAT11_OUTPUT:
375         parse_output(arg, ofpacts);
376         break;
377
378     case OFPUTIL_OFPAT10_SET_VLAN_VID:
379     case OFPUTIL_OFPAT11_SET_VLAN_VID:
380         vid = str_to_u32(arg);
381         if (vid & ~VLAN_VID_MASK) {
382             ovs_fatal(0, "%s: not a valid VLAN VID", arg);
383         }
384         ofpact_put_SET_VLAN_VID(ofpacts)->vlan_vid = vid;
385         break;
386
387     case OFPUTIL_OFPAT10_SET_VLAN_PCP:
388     case OFPUTIL_OFPAT11_SET_VLAN_PCP:
389         pcp = str_to_u32(arg);
390         if (pcp & ~7) {
391             ovs_fatal(0, "%s: not a valid VLAN PCP", arg);
392         }
393         ofpact_put_SET_VLAN_PCP(ofpacts)->vlan_pcp = pcp;
394         break;
395
396     case OFPUTIL_OFPAT12_SET_FIELD:
397         set_field_parse(arg, ofpacts);
398         break;
399
400     case OFPUTIL_OFPAT10_STRIP_VLAN:
401         ofpact_put_STRIP_VLAN(ofpacts);
402         break;
403
404     case OFPUTIL_OFPAT10_SET_DL_SRC:
405     case OFPUTIL_OFPAT11_SET_DL_SRC:
406         str_to_mac(arg, ofpact_put_SET_ETH_SRC(ofpacts)->mac);
407         break;
408
409     case OFPUTIL_OFPAT10_SET_DL_DST:
410     case OFPUTIL_OFPAT11_SET_DL_DST:
411         str_to_mac(arg, ofpact_put_SET_ETH_DST(ofpacts)->mac);
412         break;
413
414     case OFPUTIL_OFPAT10_SET_NW_SRC:
415     case OFPUTIL_OFPAT11_SET_NW_SRC:
416         str_to_ip(arg, &ip);
417         ofpact_put_SET_IPV4_SRC(ofpacts)->ipv4 = ip;
418         break;
419
420     case OFPUTIL_OFPAT10_SET_NW_DST:
421     case OFPUTIL_OFPAT11_SET_NW_DST:
422         str_to_ip(arg, &ip);
423         ofpact_put_SET_IPV4_DST(ofpacts)->ipv4 = ip;
424         break;
425
426     case OFPUTIL_OFPAT10_SET_NW_TOS:
427     case OFPUTIL_OFPAT11_SET_NW_TOS:
428         tos = str_to_u32(arg);
429         if (tos & ~IP_DSCP_MASK) {
430             ovs_fatal(0, "%s: not a valid TOS", arg);
431         }
432         ofpact_put_SET_IPV4_DSCP(ofpacts)->dscp = tos;
433         break;
434
435     case OFPUTIL_OFPAT10_SET_TP_SRC:
436     case OFPUTIL_OFPAT11_SET_TP_SRC:
437         ofpact_put_SET_L4_SRC_PORT(ofpacts)->port = str_to_u32(arg);
438         break;
439
440     case OFPUTIL_OFPAT10_SET_TP_DST:
441     case OFPUTIL_OFPAT11_SET_TP_DST:
442         ofpact_put_SET_L4_DST_PORT(ofpacts)->port = str_to_u32(arg);
443         break;
444
445     case OFPUTIL_OFPAT10_ENQUEUE:
446         parse_enqueue(arg, ofpacts);
447         break;
448
449     case OFPUTIL_NXAST_RESUBMIT:
450         parse_resubmit(arg, ofpacts);
451         break;
452
453     case OFPUTIL_NXAST_SET_TUNNEL:
454     case OFPUTIL_NXAST_SET_TUNNEL64:
455         tunnel = ofpact_put_SET_TUNNEL(ofpacts);
456         tunnel->ofpact.compat = code;
457         tunnel->tun_id = str_to_u64(arg);
458         break;
459
460     case OFPUTIL_NXAST_SET_QUEUE:
461         ofpact_put_SET_QUEUE(ofpacts)->queue_id = str_to_u32(arg);
462         break;
463
464     case OFPUTIL_NXAST_POP_QUEUE:
465         ofpact_put_POP_QUEUE(ofpacts);
466         break;
467
468     case OFPUTIL_NXAST_REG_MOVE:
469         nxm_parse_reg_move(ofpact_put_REG_MOVE(ofpacts), arg);
470         break;
471
472     case OFPUTIL_NXAST_REG_LOAD:
473         nxm_parse_reg_load(ofpact_put_REG_LOAD(ofpacts), arg);
474         break;
475
476     case OFPUTIL_NXAST_NOTE:
477         parse_note(arg, ofpacts);
478         break;
479
480     case OFPUTIL_NXAST_MULTIPATH:
481         multipath_parse(ofpact_put_MULTIPATH(ofpacts), arg);
482         break;
483
484     case OFPUTIL_NXAST_AUTOPATH__DEPRECATED:
485         autopath_parse(ofpact_put_AUTOPATH(ofpacts), arg);
486         break;
487
488     case OFPUTIL_NXAST_BUNDLE:
489         bundle_parse(arg, ofpacts);
490         break;
491
492     case OFPUTIL_NXAST_BUNDLE_LOAD:
493         bundle_parse_load(arg, ofpacts);
494         break;
495
496     case OFPUTIL_NXAST_RESUBMIT_TABLE:
497     case OFPUTIL_NXAST_OUTPUT_REG:
498     case OFPUTIL_NXAST_DEC_TTL_CNT_IDS:
499         NOT_REACHED();
500
501     case OFPUTIL_NXAST_LEARN:
502         learn_parse(arg, flow, ofpacts);
503         break;
504
505     case OFPUTIL_NXAST_EXIT:
506         ofpact_put_EXIT(ofpacts);
507         break;
508
509     case OFPUTIL_NXAST_DEC_TTL:
510         parse_dec_ttl(ofpacts, arg);
511         break;
512
513     case OFPUTIL_NXAST_FIN_TIMEOUT:
514         parse_fin_timeout(ofpacts, arg);
515         break;
516
517     case OFPUTIL_NXAST_CONTROLLER:
518         parse_controller(ofpacts, arg);
519         break;
520     }
521 }
522
523 static void
524 str_to_ofpacts(const struct flow *flow, char *str, struct ofpbuf *ofpacts)
525 {
526     char *pos, *act, *arg;
527     int n_actions;
528
529     pos = str;
530     n_actions = 0;
531     while (ofputil_parse_key_value(&pos, &act, &arg)) {
532         int code = ofputil_action_code_from_name(act);
533         if (code >= 0) {
534             parse_named_action(code, flow, arg, ofpacts);
535         } else if (!strcasecmp(act, "drop")) {
536             if (n_actions) {
537                 ovs_fatal(0, "Drop actions must not be preceded by other "
538                           "actions");
539             } else if (ofputil_parse_key_value(&pos, &act, &arg)) {
540                 ovs_fatal(0, "Drop actions must not be followed by other "
541                           "actions");
542             }
543             break;
544         } else {
545             uint16_t port = ofputil_port_from_string(act);
546             if (port) {
547                 ofpact_put_OUTPUT(ofpacts)->port = port;
548             } else {
549                 ovs_fatal(0, "Unknown action: %s", act);
550             }
551         }
552         n_actions++;
553     }
554     ofpact_pad(ofpacts);
555 }
556
557 struct protocol {
558     const char *name;
559     uint16_t dl_type;
560     uint8_t nw_proto;
561 };
562
563 static bool
564 parse_protocol(const char *name, const struct protocol **p_out)
565 {
566     static const struct protocol protocols[] = {
567         { "ip", ETH_TYPE_IP, 0 },
568         { "arp", ETH_TYPE_ARP, 0 },
569         { "icmp", ETH_TYPE_IP, IPPROTO_ICMP },
570         { "tcp", ETH_TYPE_IP, IPPROTO_TCP },
571         { "udp", ETH_TYPE_IP, IPPROTO_UDP },
572         { "ipv6", ETH_TYPE_IPV6, 0 },
573         { "ip6", ETH_TYPE_IPV6, 0 },
574         { "icmp6", ETH_TYPE_IPV6, IPPROTO_ICMPV6 },
575         { "tcp6", ETH_TYPE_IPV6, IPPROTO_TCP },
576         { "udp6", ETH_TYPE_IPV6, IPPROTO_UDP },
577     };
578     const struct protocol *p;
579
580     for (p = protocols; p < &protocols[ARRAY_SIZE(protocols)]; p++) {
581         if (!strcmp(p->name, name)) {
582             *p_out = p;
583             return true;
584         }
585     }
586     *p_out = NULL;
587     return false;
588 }
589
590 static void
591 ofp_fatal(const char *flow, bool verbose, const char *format, ...)
592 {
593     va_list args;
594
595     if (verbose) {
596         fprintf(stderr, "%s:\n", flow);
597     }
598
599     va_start(args, format);
600     ovs_fatal_valist(0, format, args);
601 }
602
603 static void
604 parse_field(const struct mf_field *mf, const char *s, struct match *match)
605 {
606     union mf_value value, mask;
607     char *error;
608
609     error = mf_parse(mf, s, &value, &mask);
610     if (error) {
611         ovs_fatal(0, "%s", error);
612     }
613
614     mf_set(mf, &value, &mask, match);
615 }
616
617 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
618  * page) into 'fm' for sending the specified flow_mod 'command' to a switch.
619  * If 'actions' is specified, an action must be in 'string' and may be expanded
620  * or reallocated.
621  *
622  * To parse syntax for an OFPT_FLOW_MOD (or NXT_FLOW_MOD), use an OFPFC_*
623  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
624  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'. */
625 void
626 parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
627               bool verbose)
628 {
629     enum {
630         F_OUT_PORT = 1 << 0,
631         F_ACTIONS = 1 << 1,
632         F_TIMEOUT = 1 << 3,
633         F_PRIORITY = 1 << 4,
634         F_FLAGS = 1 << 5,
635     } fields;
636     char *string = xstrdup(str_);
637     char *save_ptr = NULL;
638     char *act_str = NULL;
639     char *name;
640
641     switch (command) {
642     case -1:
643         fields = F_OUT_PORT;
644         break;
645
646     case OFPFC_ADD:
647         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
648         break;
649
650     case OFPFC_DELETE:
651         fields = F_OUT_PORT;
652         break;
653
654     case OFPFC_DELETE_STRICT:
655         fields = F_OUT_PORT | F_PRIORITY;
656         break;
657
658     case OFPFC_MODIFY:
659         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
660         break;
661
662     case OFPFC_MODIFY_STRICT:
663         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
664         break;
665
666     default:
667         NOT_REACHED();
668     }
669
670     match_init_catchall(&fm->match);
671     fm->priority = OFP_DEFAULT_PRIORITY;
672     fm->cookie = htonll(0);
673     fm->cookie_mask = htonll(0);
674     if (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) {
675         /* For modify, by default, don't update the cookie. */
676         fm->new_cookie = htonll(UINT64_MAX);
677     } else{
678         fm->new_cookie = htonll(0);
679     }
680     fm->table_id = 0xff;
681     fm->command = command;
682     fm->idle_timeout = OFP_FLOW_PERMANENT;
683     fm->hard_timeout = OFP_FLOW_PERMANENT;
684     fm->buffer_id = UINT32_MAX;
685     fm->out_port = OFPP_NONE;
686     fm->flags = 0;
687     if (fields & F_ACTIONS) {
688         act_str = strstr(string, "action");
689         if (!act_str) {
690             ofp_fatal(str_, verbose, "must specify an action");
691         }
692         *act_str = '\0';
693
694         act_str = strchr(act_str + 1, '=');
695         if (!act_str) {
696             ofp_fatal(str_, verbose, "must specify an action");
697         }
698
699         act_str++;
700     }
701     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
702          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
703         const struct protocol *p;
704
705         if (parse_protocol(name, &p)) {
706             match_set_dl_type(&fm->match, htons(p->dl_type));
707             if (p->nw_proto) {
708                 match_set_nw_proto(&fm->match, p->nw_proto);
709             }
710         } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) {
711             fm->flags |= OFPFF_SEND_FLOW_REM;
712         } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) {
713             fm->flags |= OFPFF_CHECK_OVERLAP;
714         } else {
715             char *value;
716
717             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
718             if (!value) {
719                 ofp_fatal(str_, verbose, "field %s missing value", name);
720             }
721
722             if (!strcmp(name, "table")) {
723                 fm->table_id = str_to_table_id(value);
724             } else if (!strcmp(name, "out_port")) {
725                 fm->out_port = ofputil_port_from_string(name);
726                 if (!fm->out_port) {
727                     ofp_fatal(str_, verbose, "%s is not a valid OpenFlow port",
728                               name);
729                 }
730             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
731                 fm->priority = str_to_u16(value, name);
732             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
733                 fm->idle_timeout = str_to_u16(value, name);
734             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
735                 fm->hard_timeout = str_to_u16(value, name);
736             } else if (!strcmp(name, "cookie")) {
737                 char *mask = strchr(value, '/');
738
739                 if (mask) {
740                     /* A mask means we're searching for a cookie. */
741                     if (command == OFPFC_ADD) {
742                         ofp_fatal(str_, verbose, "flow additions cannot use "
743                                   "a cookie mask");
744                     }
745                     *mask = '\0';
746                     fm->cookie = htonll(str_to_u64(value));
747                     fm->cookie_mask = htonll(str_to_u64(mask+1));
748                 } else {
749                     /* No mask means that the cookie is being set. */
750                     if (command != OFPFC_ADD && command != OFPFC_MODIFY
751                             && command != OFPFC_MODIFY_STRICT) {
752                         ofp_fatal(str_, verbose, "cannot set cookie");
753                     }
754                     fm->new_cookie = htonll(str_to_u64(value));
755                 }
756             } else if (mf_from_name(name)) {
757                 parse_field(mf_from_name(name), value, &fm->match);
758             } else if (!strcmp(name, "duration")
759                        || !strcmp(name, "n_packets")
760                        || !strcmp(name, "n_bytes")) {
761                 /* Ignore these, so that users can feed the output of
762                  * "ovs-ofctl dump-flows" back into commands that parse
763                  * flows. */
764             } else {
765                 ofp_fatal(str_, verbose, "unknown keyword %s", name);
766             }
767         }
768     }
769     if (!fm->cookie_mask && fm->new_cookie == htonll(UINT64_MAX)
770             && (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT)) {
771         /* On modifies without a mask, we are supposed to add a flow if
772          * one does not exist.  If a cookie wasn't been specified, use a
773          * default of zero. */
774         fm->new_cookie = htonll(0);
775     }
776     if (fields & F_ACTIONS) {
777         struct ofpbuf ofpacts;
778
779         ofpbuf_init(&ofpacts, 32);
780         str_to_ofpacts(&fm->match.flow, act_str, &ofpacts);
781         fm->ofpacts_len = ofpacts.size;
782         fm->ofpacts = ofpbuf_steal_data(&ofpacts);
783     } else {
784         fm->ofpacts_len = 0;
785         fm->ofpacts = NULL;
786     }
787
788     free(string);
789 }
790
791 /* Convert 'str_' (as described in the documentation for the "monitor" command
792  * in the ovs-ofctl man page) into 'fmr'. */
793 void
794 parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,
795                            const char *str_)
796 {
797     static uint32_t id;
798
799     char *string = xstrdup(str_);
800     char *save_ptr = NULL;
801     char *name;
802
803     fmr->id = id++;
804     fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
805                   | NXFMF_OWN | NXFMF_ACTIONS);
806     fmr->out_port = OFPP_NONE;
807     fmr->table_id = 0xff;
808     match_init_catchall(&fmr->match);
809
810     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
811          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
812         const struct protocol *p;
813
814         if (!strcmp(name, "!initial")) {
815             fmr->flags &= ~NXFMF_INITIAL;
816         } else if (!strcmp(name, "!add")) {
817             fmr->flags &= ~NXFMF_ADD;
818         } else if (!strcmp(name, "!delete")) {
819             fmr->flags &= ~NXFMF_DELETE;
820         } else if (!strcmp(name, "!modify")) {
821             fmr->flags &= ~NXFMF_MODIFY;
822         } else if (!strcmp(name, "!actions")) {
823             fmr->flags &= ~NXFMF_ACTIONS;
824         } else if (!strcmp(name, "!own")) {
825             fmr->flags &= ~NXFMF_OWN;
826         } else if (parse_protocol(name, &p)) {
827             match_set_dl_type(&fmr->match, htons(p->dl_type));
828             if (p->nw_proto) {
829                 match_set_nw_proto(&fmr->match, p->nw_proto);
830             }
831         } else {
832             char *value;
833
834             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
835             if (!value) {
836                 ovs_fatal(0, "%s: field %s missing value", str_, name);
837             }
838
839             if (!strcmp(name, "table")) {
840                 fmr->table_id = str_to_table_id(value);
841             } else if (!strcmp(name, "out_port")) {
842                 fmr->out_port = atoi(value);
843             } else if (mf_from_name(name)) {
844                 parse_field(mf_from_name(name), value, &fmr->match);
845             } else {
846                 ovs_fatal(0, "%s: unknown keyword %s", str_, name);
847             }
848         }
849     }
850     free(string);
851 }
852
853 /* Parses 's' as a set of OpenFlow actions and appends the actions to
854  * 'actions'.
855  *
856  * Prints an error on stderr and aborts the program if 's' syntax is
857  * invalid. */
858 void
859 parse_ofpacts(const char *s_, struct ofpbuf *ofpacts)
860 {
861     char *s = xstrdup(s_);
862     str_to_ofpacts(NULL, s, ofpacts);
863     free(s);
864 }
865
866 /* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
867  * (one of OFPFC_*) into 'fm'. */
868 void
869 parse_ofp_flow_mod_str(struct ofputil_flow_mod *fm, const char *string,
870                        uint16_t command, bool verbose)
871 {
872     struct match match_copy;
873
874     parse_ofp_str(fm, command, string, verbose);
875
876     /* Normalize a copy of the match.  This ensures that non-normalized flows
877      * get logged but doesn't affect what gets sent to the switch, so that the
878      * switch can do whatever it likes with the flow. */
879     match_copy = fm->match;
880     ofputil_normalize_match(&match_copy);
881 }
882
883 void
884 parse_ofp_flow_mod_file(const char *file_name, uint16_t command,
885                         struct ofputil_flow_mod **fms, size_t *n_fms)
886 {
887     size_t allocated_fms;
888     FILE *stream;
889     struct ds s;
890
891     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
892     if (stream == NULL) {
893         ovs_fatal(errno, "%s: open", file_name);
894     }
895
896     allocated_fms = *n_fms;
897     ds_init(&s);
898     while (!ds_get_preprocessed_line(&s, stream)) {
899         if (*n_fms >= allocated_fms) {
900             *fms = x2nrealloc(*fms, &allocated_fms, sizeof **fms);
901         }
902         parse_ofp_flow_mod_str(&(*fms)[*n_fms], ds_cstr(&s), command, false);
903         *n_fms += 1;
904     }
905     ds_destroy(&s);
906
907     if (stream != stdin) {
908         fclose(stream);
909     }
910 }
911
912 void
913 parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
914                                  bool aggregate, const char *string)
915 {
916     struct ofputil_flow_mod fm;
917
918     parse_ofp_str(&fm, -1, string, false);
919     fsr->aggregate = aggregate;
920     fsr->cookie = fm.cookie;
921     fsr->cookie_mask = fm.cookie_mask;
922     fsr->match = fm.match;
923     fsr->out_port = fm.out_port;
924     fsr->table_id = fm.table_id;
925 }
926
927 /* Parses a specification of a flow from 's' into 'flow'.  's' must take the
928  * form FIELD=VALUE[,FIELD=VALUE]... where each FIELD is the name of a
929  * mf_field.  Fields must be specified in a natural order for satisfying
930  * prerequisites.
931  *
932  * Returns NULL on success, otherwise a malloc()'d string that explains the
933  * problem. */
934 char *
935 parse_ofp_exact_flow(struct flow *flow, const char *s)
936 {
937     char *pos, *key, *value_s;
938     char *error = NULL;
939     char *copy;
940
941     memset(flow, 0, sizeof *flow);
942
943     pos = copy = xstrdup(s);
944     while (ofputil_parse_key_value(&pos, &key, &value_s)) {
945         const struct protocol *p;
946         if (parse_protocol(key, &p)) {
947             if (flow->dl_type) {
948                 error = xasprintf("%s: Ethernet type set multiple times", s);
949                 goto exit;
950             }
951             flow->dl_type = htons(p->dl_type);
952
953             if (p->nw_proto) {
954                 if (flow->nw_proto) {
955                     error = xasprintf("%s: network protocol set "
956                                       "multiple times", s);
957                     goto exit;
958                 }
959                 flow->nw_proto = p->nw_proto;
960             }
961         } else {
962             const struct mf_field *mf;
963             union mf_value value;
964             char *field_error;
965
966             mf = mf_from_name(key);
967             if (!mf) {
968                 error = xasprintf("%s: unknown field %s", s, key);
969                 goto exit;
970             }
971
972             if (!mf_are_prereqs_ok(mf, flow)) {
973                 error = xasprintf("%s: prerequisites not met for setting %s",
974                                   s, key);
975                 goto exit;
976             }
977
978             if (!mf_is_zero(mf, flow)) {
979                 error = xasprintf("%s: field %s set multiple times", s, key);
980                 goto exit;
981             }
982
983             field_error = mf_parse_value(mf, value_s, &value);
984             if (field_error) {
985                 error = xasprintf("%s: bad value for %s (%s)",
986                                   s, key, field_error);
987                 free(field_error);
988                 goto exit;
989             }
990
991             mf_set_flow_value(mf, &value, flow);
992         }
993     }
994
995 exit:
996     free(copy);
997
998     if (error) {
999         memset(flow, 0, sizeof *flow);
1000     }
1001     return error;
1002 }