instruction: support goto-table action
[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 bool
524 str_to_ofpact__(const struct flow *flow, char *pos, char *act, char *arg,
525                 struct ofpbuf *ofpacts, int n_actions)
526 {
527     int code = ofputil_action_code_from_name(act);
528     if (code >= 0) {
529         parse_named_action(code, flow, arg, ofpacts);
530     } else if (!strcasecmp(act, "drop")) {
531         if (n_actions) {
532             ovs_fatal(0, "Drop actions must not be preceded by other "
533                       "actions");
534         } else if (ofputil_parse_key_value(&pos, &act, &arg)) {
535             ovs_fatal(0, "Drop actions must not be followed by other "
536                       "actions");
537         }
538         return false;
539     } else {
540         uint16_t port = ofputil_port_from_string(act);
541         if (port) {
542             ofpact_put_OUTPUT(ofpacts)->port = port;
543         } else {
544             ovs_fatal(0, "Unknown action: %s", act);
545         }
546     }
547
548     return true;
549 }
550
551 static void
552 str_to_ofpacts(const struct flow *flow, char *str, struct ofpbuf *ofpacts)
553 {
554     char *pos, *act, *arg;
555     int n_actions;
556
557     pos = str;
558     n_actions = 0;
559     while (ofputil_parse_key_value(&pos, &act, &arg)) {
560         if (!str_to_ofpact__(flow, pos, act, arg, ofpacts, n_actions)) {
561             break;
562         }
563         n_actions++;
564     }
565     ofpact_pad(ofpacts);
566 }
567
568 static void
569 parse_named_instruction(enum ovs_instruction_type type,
570                         char *arg, struct ofpbuf *ofpacts)
571 {
572     switch (type) {
573     case OVSINST_OFPIT11_APPLY_ACTIONS:
574         NOT_REACHED();  /* This case is handled by str_to_inst_ofpacts() */
575         break;
576
577     case OVSINST_OFPIT11_WRITE_ACTIONS:
578         /* TODO:XXX */
579         ovs_fatal(0, "instruction write-actions is not supported yet");
580         break;
581
582     case OVSINST_OFPIT11_CLEAR_ACTIONS:
583         /* TODO:XXX */
584         ovs_fatal(0, "instruction clear-actions is not supported yet");
585         break;
586
587     case OVSINST_OFPIT11_WRITE_METADATA:
588         /* TODO:XXX */
589         ovs_fatal(0, "instruction write-metadata is not supported yet");
590         break;
591
592     case OVSINST_OFPIT11_GOTO_TABLE: {
593         struct ofpact_goto_table *ogt = ofpact_put_GOTO_TABLE(ofpacts);
594         char *table_s = strsep(&arg, ",");
595         if (!table_s || !table_s[0]) {
596             ovs_fatal(0, "instruction goto-table needs table id");
597         }
598         ogt->table_id = str_to_table_id(table_s);
599         break;
600     }
601     }
602 }
603
604 static void
605 str_to_inst_ofpacts(const struct flow *flow, char *str, struct ofpbuf *ofpacts)
606 {
607     char *pos, *inst, *arg;
608     int type;
609     const char *prev_inst = NULL;
610     int prev_type = -1;
611     int n_actions = 0;
612
613     pos = str;
614     while (ofputil_parse_key_value(&pos, &inst, &arg)) {
615         type = ofpact_instruction_type_from_name(inst);
616         if (type < 0) {
617             if (!str_to_ofpact__(flow, pos, inst, arg, ofpacts, n_actions)) {
618                 break;
619             }
620
621             type = OVSINST_OFPIT11_APPLY_ACTIONS;
622             if (prev_type == type) {
623                 n_actions++;
624                 continue;
625             }
626         } else if (type == OVSINST_OFPIT11_APPLY_ACTIONS) {
627             ovs_fatal(0, "%s isn't supported. Just write actions then "
628                       "it is interpreted as apply_actions", inst);
629         } else {
630             parse_named_instruction(type, arg, ofpacts);
631         }
632
633         if (type == prev_type) {
634             ovs_fatal(0, "instruction can be specified at most once: %s",
635                       inst);
636         }
637         if (type <= prev_type) {
638             ovs_fatal(0, "Instruction %s must be specified before %s",
639                       inst, prev_inst);
640         }
641
642         prev_inst = inst;
643         prev_type = type;
644         n_actions++;
645     }
646     ofpact_pad(ofpacts);
647 }
648
649 struct protocol {
650     const char *name;
651     uint16_t dl_type;
652     uint8_t nw_proto;
653 };
654
655 static bool
656 parse_protocol(const char *name, const struct protocol **p_out)
657 {
658     static const struct protocol protocols[] = {
659         { "ip", ETH_TYPE_IP, 0 },
660         { "arp", ETH_TYPE_ARP, 0 },
661         { "icmp", ETH_TYPE_IP, IPPROTO_ICMP },
662         { "tcp", ETH_TYPE_IP, IPPROTO_TCP },
663         { "udp", ETH_TYPE_IP, IPPROTO_UDP },
664         { "ipv6", ETH_TYPE_IPV6, 0 },
665         { "ip6", ETH_TYPE_IPV6, 0 },
666         { "icmp6", ETH_TYPE_IPV6, IPPROTO_ICMPV6 },
667         { "tcp6", ETH_TYPE_IPV6, IPPROTO_TCP },
668         { "udp6", ETH_TYPE_IPV6, IPPROTO_UDP },
669     };
670     const struct protocol *p;
671
672     for (p = protocols; p < &protocols[ARRAY_SIZE(protocols)]; p++) {
673         if (!strcmp(p->name, name)) {
674             *p_out = p;
675             return true;
676         }
677     }
678     *p_out = NULL;
679     return false;
680 }
681
682 static void
683 ofp_fatal(const char *flow, bool verbose, const char *format, ...)
684 {
685     va_list args;
686
687     if (verbose) {
688         fprintf(stderr, "%s:\n", flow);
689     }
690
691     va_start(args, format);
692     ovs_fatal_valist(0, format, args);
693 }
694
695 static void
696 parse_field(const struct mf_field *mf, const char *s, struct match *match)
697 {
698     union mf_value value, mask;
699     char *error;
700
701     error = mf_parse(mf, s, &value, &mask);
702     if (error) {
703         ovs_fatal(0, "%s", error);
704     }
705
706     mf_set(mf, &value, &mask, match);
707 }
708
709 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
710  * page) into 'fm' for sending the specified flow_mod 'command' to a switch.
711  * If 'actions' is specified, an action must be in 'string' and may be expanded
712  * or reallocated.
713  *
714  * To parse syntax for an OFPT_FLOW_MOD (or NXT_FLOW_MOD), use an OFPFC_*
715  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
716  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'. */
717 void
718 parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
719               bool verbose)
720 {
721     enum {
722         F_OUT_PORT = 1 << 0,
723         F_ACTIONS = 1 << 1,
724         F_TIMEOUT = 1 << 3,
725         F_PRIORITY = 1 << 4,
726         F_FLAGS = 1 << 5,
727     } fields;
728     char *string = xstrdup(str_);
729     char *save_ptr = NULL;
730     char *act_str = NULL;
731     char *name;
732
733     switch (command) {
734     case -1:
735         fields = F_OUT_PORT;
736         break;
737
738     case OFPFC_ADD:
739         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
740         break;
741
742     case OFPFC_DELETE:
743         fields = F_OUT_PORT;
744         break;
745
746     case OFPFC_DELETE_STRICT:
747         fields = F_OUT_PORT | F_PRIORITY;
748         break;
749
750     case OFPFC_MODIFY:
751         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
752         break;
753
754     case OFPFC_MODIFY_STRICT:
755         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
756         break;
757
758     default:
759         NOT_REACHED();
760     }
761
762     match_init_catchall(&fm->match);
763     fm->priority = OFP_DEFAULT_PRIORITY;
764     fm->cookie = htonll(0);
765     fm->cookie_mask = htonll(0);
766     if (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) {
767         /* For modify, by default, don't update the cookie. */
768         fm->new_cookie = htonll(UINT64_MAX);
769     } else{
770         fm->new_cookie = htonll(0);
771     }
772     fm->table_id = 0xff;
773     fm->command = command;
774     fm->idle_timeout = OFP_FLOW_PERMANENT;
775     fm->hard_timeout = OFP_FLOW_PERMANENT;
776     fm->buffer_id = UINT32_MAX;
777     fm->out_port = OFPP_NONE;
778     fm->flags = 0;
779     if (fields & F_ACTIONS) {
780         act_str = strstr(string, "action");
781         if (!act_str) {
782             ofp_fatal(str_, verbose, "must specify an action");
783         }
784         *act_str = '\0';
785
786         act_str = strchr(act_str + 1, '=');
787         if (!act_str) {
788             ofp_fatal(str_, verbose, "must specify an action");
789         }
790
791         act_str++;
792     }
793     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
794          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
795         const struct protocol *p;
796
797         if (parse_protocol(name, &p)) {
798             match_set_dl_type(&fm->match, htons(p->dl_type));
799             if (p->nw_proto) {
800                 match_set_nw_proto(&fm->match, p->nw_proto);
801             }
802         } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) {
803             fm->flags |= OFPFF_SEND_FLOW_REM;
804         } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) {
805             fm->flags |= OFPFF_CHECK_OVERLAP;
806         } else {
807             char *value;
808
809             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
810             if (!value) {
811                 ofp_fatal(str_, verbose, "field %s missing value", name);
812             }
813
814             if (!strcmp(name, "table")) {
815                 fm->table_id = str_to_table_id(value);
816             } else if (!strcmp(name, "out_port")) {
817                 fm->out_port = ofputil_port_from_string(name);
818                 if (!fm->out_port) {
819                     ofp_fatal(str_, verbose, "%s is not a valid OpenFlow port",
820                               name);
821                 }
822             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
823                 fm->priority = str_to_u16(value, name);
824             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
825                 fm->idle_timeout = str_to_u16(value, name);
826             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
827                 fm->hard_timeout = str_to_u16(value, name);
828             } else if (!strcmp(name, "cookie")) {
829                 char *mask = strchr(value, '/');
830
831                 if (mask) {
832                     /* A mask means we're searching for a cookie. */
833                     if (command == OFPFC_ADD) {
834                         ofp_fatal(str_, verbose, "flow additions cannot use "
835                                   "a cookie mask");
836                     }
837                     *mask = '\0';
838                     fm->cookie = htonll(str_to_u64(value));
839                     fm->cookie_mask = htonll(str_to_u64(mask+1));
840                 } else {
841                     /* No mask means that the cookie is being set. */
842                     if (command != OFPFC_ADD && command != OFPFC_MODIFY
843                             && command != OFPFC_MODIFY_STRICT) {
844                         ofp_fatal(str_, verbose, "cannot set cookie");
845                     }
846                     fm->new_cookie = htonll(str_to_u64(value));
847                 }
848             } else if (mf_from_name(name)) {
849                 parse_field(mf_from_name(name), value, &fm->match);
850             } else if (!strcmp(name, "duration")
851                        || !strcmp(name, "n_packets")
852                        || !strcmp(name, "n_bytes")) {
853                 /* Ignore these, so that users can feed the output of
854                  * "ovs-ofctl dump-flows" back into commands that parse
855                  * flows. */
856             } else {
857                 ofp_fatal(str_, verbose, "unknown keyword %s", name);
858             }
859         }
860     }
861     if (!fm->cookie_mask && fm->new_cookie == htonll(UINT64_MAX)
862             && (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT)) {
863         /* On modifies without a mask, we are supposed to add a flow if
864          * one does not exist.  If a cookie wasn't been specified, use a
865          * default of zero. */
866         fm->new_cookie = htonll(0);
867     }
868     if (fields & F_ACTIONS) {
869         struct ofpbuf ofpacts;
870
871         ofpbuf_init(&ofpacts, 32);
872         str_to_inst_ofpacts(&fm->match.flow, act_str, &ofpacts);
873         fm->ofpacts_len = ofpacts.size;
874         fm->ofpacts = ofpbuf_steal_data(&ofpacts);
875     } else {
876         fm->ofpacts_len = 0;
877         fm->ofpacts = NULL;
878     }
879
880     free(string);
881 }
882
883 /* Convert 'str_' (as described in the documentation for the "monitor" command
884  * in the ovs-ofctl man page) into 'fmr'. */
885 void
886 parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,
887                            const char *str_)
888 {
889     static uint32_t id;
890
891     char *string = xstrdup(str_);
892     char *save_ptr = NULL;
893     char *name;
894
895     fmr->id = id++;
896     fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
897                   | NXFMF_OWN | NXFMF_ACTIONS);
898     fmr->out_port = OFPP_NONE;
899     fmr->table_id = 0xff;
900     match_init_catchall(&fmr->match);
901
902     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
903          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
904         const struct protocol *p;
905
906         if (!strcmp(name, "!initial")) {
907             fmr->flags &= ~NXFMF_INITIAL;
908         } else if (!strcmp(name, "!add")) {
909             fmr->flags &= ~NXFMF_ADD;
910         } else if (!strcmp(name, "!delete")) {
911             fmr->flags &= ~NXFMF_DELETE;
912         } else if (!strcmp(name, "!modify")) {
913             fmr->flags &= ~NXFMF_MODIFY;
914         } else if (!strcmp(name, "!actions")) {
915             fmr->flags &= ~NXFMF_ACTIONS;
916         } else if (!strcmp(name, "!own")) {
917             fmr->flags &= ~NXFMF_OWN;
918         } else if (parse_protocol(name, &p)) {
919             match_set_dl_type(&fmr->match, htons(p->dl_type));
920             if (p->nw_proto) {
921                 match_set_nw_proto(&fmr->match, p->nw_proto);
922             }
923         } else {
924             char *value;
925
926             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
927             if (!value) {
928                 ovs_fatal(0, "%s: field %s missing value", str_, name);
929             }
930
931             if (!strcmp(name, "table")) {
932                 fmr->table_id = str_to_table_id(value);
933             } else if (!strcmp(name, "out_port")) {
934                 fmr->out_port = atoi(value);
935             } else if (mf_from_name(name)) {
936                 parse_field(mf_from_name(name), value, &fmr->match);
937             } else {
938                 ovs_fatal(0, "%s: unknown keyword %s", str_, name);
939             }
940         }
941     }
942     free(string);
943 }
944
945 /* Parses 's' as a set of OpenFlow actions and appends the actions to
946  * 'actions'.
947  *
948  * Prints an error on stderr and aborts the program if 's' syntax is
949  * invalid. */
950 void
951 parse_ofpacts(const char *s_, struct ofpbuf *ofpacts)
952 {
953     char *s = xstrdup(s_);
954     str_to_ofpacts(NULL, s, ofpacts);
955     free(s);
956 }
957
958 /* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
959  * (one of OFPFC_*) into 'fm'. */
960 void
961 parse_ofp_flow_mod_str(struct ofputil_flow_mod *fm, const char *string,
962                        uint16_t command, bool verbose)
963 {
964     struct match match_copy;
965
966     parse_ofp_str(fm, command, string, verbose);
967
968     /* Normalize a copy of the match.  This ensures that non-normalized flows
969      * get logged but doesn't affect what gets sent to the switch, so that the
970      * switch can do whatever it likes with the flow. */
971     match_copy = fm->match;
972     ofputil_normalize_match(&match_copy);
973 }
974
975 void
976 parse_ofp_flow_mod_file(const char *file_name, uint16_t command,
977                         struct ofputil_flow_mod **fms, size_t *n_fms)
978 {
979     size_t allocated_fms;
980     FILE *stream;
981     struct ds s;
982
983     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
984     if (stream == NULL) {
985         ovs_fatal(errno, "%s: open", file_name);
986     }
987
988     allocated_fms = *n_fms;
989     ds_init(&s);
990     while (!ds_get_preprocessed_line(&s, stream)) {
991         if (*n_fms >= allocated_fms) {
992             *fms = x2nrealloc(*fms, &allocated_fms, sizeof **fms);
993         }
994         parse_ofp_flow_mod_str(&(*fms)[*n_fms], ds_cstr(&s), command, false);
995         *n_fms += 1;
996     }
997     ds_destroy(&s);
998
999     if (stream != stdin) {
1000         fclose(stream);
1001     }
1002 }
1003
1004 void
1005 parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
1006                                  bool aggregate, const char *string)
1007 {
1008     struct ofputil_flow_mod fm;
1009
1010     parse_ofp_str(&fm, -1, string, false);
1011     fsr->aggregate = aggregate;
1012     fsr->cookie = fm.cookie;
1013     fsr->cookie_mask = fm.cookie_mask;
1014     fsr->match = fm.match;
1015     fsr->out_port = fm.out_port;
1016     fsr->table_id = fm.table_id;
1017 }
1018
1019 /* Parses a specification of a flow from 's' into 'flow'.  's' must take the
1020  * form FIELD=VALUE[,FIELD=VALUE]... where each FIELD is the name of a
1021  * mf_field.  Fields must be specified in a natural order for satisfying
1022  * prerequisites.
1023  *
1024  * Returns NULL on success, otherwise a malloc()'d string that explains the
1025  * problem. */
1026 char *
1027 parse_ofp_exact_flow(struct flow *flow, const char *s)
1028 {
1029     char *pos, *key, *value_s;
1030     char *error = NULL;
1031     char *copy;
1032
1033     memset(flow, 0, sizeof *flow);
1034
1035     pos = copy = xstrdup(s);
1036     while (ofputil_parse_key_value(&pos, &key, &value_s)) {
1037         const struct protocol *p;
1038         if (parse_protocol(key, &p)) {
1039             if (flow->dl_type) {
1040                 error = xasprintf("%s: Ethernet type set multiple times", s);
1041                 goto exit;
1042             }
1043             flow->dl_type = htons(p->dl_type);
1044
1045             if (p->nw_proto) {
1046                 if (flow->nw_proto) {
1047                     error = xasprintf("%s: network protocol set "
1048                                       "multiple times", s);
1049                     goto exit;
1050                 }
1051                 flow->nw_proto = p->nw_proto;
1052             }
1053         } else {
1054             const struct mf_field *mf;
1055             union mf_value value;
1056             char *field_error;
1057
1058             mf = mf_from_name(key);
1059             if (!mf) {
1060                 error = xasprintf("%s: unknown field %s", s, key);
1061                 goto exit;
1062             }
1063
1064             if (!mf_are_prereqs_ok(mf, flow)) {
1065                 error = xasprintf("%s: prerequisites not met for setting %s",
1066                                   s, key);
1067                 goto exit;
1068             }
1069
1070             if (!mf_is_zero(mf, flow)) {
1071                 error = xasprintf("%s: field %s set multiple times", s, key);
1072                 goto exit;
1073             }
1074
1075             field_error = mf_parse_value(mf, value_s, &value);
1076             if (field_error) {
1077                 error = xasprintf("%s: bad value for %s (%s)",
1078                                   s, key, field_error);
1079                 free(field_error);
1080                 goto exit;
1081             }
1082
1083             mf_set_flow_value(mf, &value, flow);
1084         }
1085     }
1086
1087 exit:
1088     free(copy);
1089
1090     if (error) {
1091         memset(flow, 0, sizeof *flow);
1092     }
1093     return error;
1094 }