OF11: push_vlan support
[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         if (!ofputil_port_from_string(in_port_s, &resubmit->in_port)) {
172             ovs_fatal(0, "%s: resubmit to unknown port", in_port_s);
173         }
174     } else {
175         resubmit->in_port = OFPP_IN_PORT;
176     }
177
178     table_s = strsep(&arg, ",");
179     resubmit->table_id = table_s && table_s[0] ? str_to_u32(table_s) : 255;
180
181     if (resubmit->in_port == OFPP_IN_PORT && resubmit->table_id == 255) {
182         ovs_fatal(0, "at least one \"in_port\" or \"table\" must be specified "
183                   " on resubmit");
184     }
185 }
186
187 static void
188 parse_note(const char *arg, struct ofpbuf *ofpacts)
189 {
190     struct ofpact_note *note;
191
192     note = ofpact_put_NOTE(ofpacts);
193     while (*arg != '\0') {
194         uint8_t byte;
195         bool ok;
196
197         if (*arg == '.') {
198             arg++;
199         }
200         if (*arg == '\0') {
201             break;
202         }
203
204         byte = hexits_value(arg, 2, &ok);
205         if (!ok) {
206             ovs_fatal(0, "bad hex digit in `note' argument");
207         }
208         ofpbuf_put(ofpacts, &byte, 1);
209
210         note = ofpacts->l2;
211         note->length++;
212
213         arg += 2;
214     }
215     ofpact_update_len(ofpacts, &note->ofpact);
216 }
217
218 static void
219 parse_fin_timeout(struct ofpbuf *b, char *arg)
220 {
221     struct ofpact_fin_timeout *oft = ofpact_put_FIN_TIMEOUT(b);
222     char *key, *value;
223
224     while (ofputil_parse_key_value(&arg, &key, &value)) {
225         if (!strcmp(key, "idle_timeout")) {
226             oft->fin_idle_timeout = str_to_u16(value, key);
227         } else if (!strcmp(key, "hard_timeout")) {
228             oft->fin_hard_timeout = str_to_u16(value, key);
229         } else {
230             ovs_fatal(0, "invalid key '%s' in 'fin_timeout' argument", key);
231         }
232     }
233 }
234
235 static void
236 parse_controller(struct ofpbuf *b, char *arg)
237 {
238     enum ofp_packet_in_reason reason = OFPR_ACTION;
239     uint16_t controller_id = 0;
240     uint16_t max_len = UINT16_MAX;
241
242     if (!arg[0]) {
243         /* Use defaults. */
244     } else if (strspn(arg, "0123456789") == strlen(arg)) {
245         max_len = str_to_u16(arg, "max_len");
246     } else {
247         char *name, *value;
248
249         while (ofputil_parse_key_value(&arg, &name, &value)) {
250             if (!strcmp(name, "reason")) {
251                 if (!ofputil_packet_in_reason_from_string(value, &reason)) {
252                     ovs_fatal(0, "unknown reason \"%s\"", value);
253                 }
254             } else if (!strcmp(name, "max_len")) {
255                 max_len = str_to_u16(value, "max_len");
256             } else if (!strcmp(name, "id")) {
257                 controller_id = str_to_u16(value, "id");
258             } else {
259                 ovs_fatal(0, "unknown key \"%s\" parsing controller action",
260                           name);
261             }
262         }
263     }
264
265     if (reason == OFPR_ACTION && controller_id == 0) {
266         struct ofpact_output *output;
267
268         output = ofpact_put_OUTPUT(b);
269         output->port = OFPP_CONTROLLER;
270         output->max_len = max_len;
271     } else {
272         struct ofpact_controller *controller;
273
274         controller = ofpact_put_CONTROLLER(b);
275         controller->max_len = max_len;
276         controller->reason = reason;
277         controller->controller_id = controller_id;
278     }
279 }
280
281 static void
282 parse_noargs_dec_ttl(struct ofpbuf *b)
283 {
284     struct ofpact_cnt_ids *ids;
285     uint16_t id = 0;
286
287     ids = ofpact_put_DEC_TTL(b);
288     ofpbuf_put(b, &id, sizeof id);
289     ids = b->l2;
290     ids->n_controllers++;
291     ofpact_update_len(b, &ids->ofpact);
292 }
293
294 static void
295 parse_dec_ttl(struct ofpbuf *b, char *arg)
296 {
297     if (*arg == '\0') {
298         parse_noargs_dec_ttl(b);
299     } else {
300         struct ofpact_cnt_ids *ids;
301         char *cntr;
302
303         ids = ofpact_put_DEC_TTL(b);
304         ids->ofpact.compat = OFPUTIL_NXAST_DEC_TTL_CNT_IDS;
305         for (cntr = strtok_r(arg, ", ", &arg); cntr != NULL;
306              cntr = strtok_r(NULL, ", ", &arg)) {
307             uint16_t id = atoi(cntr);
308
309             ofpbuf_put(b, &id, sizeof id);
310             ids = b->l2;
311             ids->n_controllers++;
312         }
313         if (!ids->n_controllers) {
314             ovs_fatal(0, "dec_ttl_cnt_ids: expected at least one controller "
315                       "id.");
316         }
317         ofpact_update_len(b, &ids->ofpact);
318     }
319 }
320
321 static void
322 set_field_parse(const char *arg, struct ofpbuf *ofpacts)
323 {
324     char *orig = xstrdup(arg);
325     struct ofpact_reg_load *load = ofpact_put_REG_LOAD(ofpacts);
326     char *value;
327     char *delim;
328     char *key;
329     const struct mf_field *mf;
330     const char *error;
331     union mf_value mf_value;
332
333     value = orig;
334     delim = strstr(orig, "->");
335     if (!delim) {
336         ovs_fatal(0, "%s: missing `->'", orig);
337     }
338     if (strlen(delim) <= strlen("->")) {
339         ovs_fatal(0, "%s: missing field name following `->'", orig);
340     }
341
342     key = delim + strlen("->");
343     mf = mf_from_name(key);
344     if (!mf) {
345         ovs_fatal(0, "%s is not valid oxm field name", key);
346     }
347     if (!mf->writable) {
348         ovs_fatal(0, "%s is not allowed to set", key);
349     }
350
351     delim[0] = '\0';
352     error = mf_parse_value(mf, value, &mf_value);
353     if (error) {
354         ovs_fatal(0, "%s", error);
355     }
356     if (!mf_is_value_valid(mf, &mf_value)) {
357         ovs_fatal(0, "%s is not valid valid for field %s", value, key);
358     }
359     ofpact_set_field_init(load, mf, &mf_value);
360     free(orig);
361 }
362
363 static void
364 parse_metadata(struct ofpbuf *b, char *arg)
365 {
366     struct ofpact_metadata *om;
367     char *mask = strchr(arg, '/');
368
369     om = ofpact_put_WRITE_METADATA(b);
370
371     if (mask) {
372         *mask = '\0';
373         om->mask = htonll(str_to_u64(mask + 1));
374     } else {
375         om->mask = htonll(UINT64_MAX);
376     }
377
378     om->metadata = htonll(str_to_u64(arg));
379 }
380
381 static void
382 parse_named_action(enum ofputil_action_code code, const struct flow *flow,
383                    char *arg, struct ofpbuf *ofpacts)
384 {
385     struct ofpact_tunnel *tunnel;
386     uint16_t vid;
387     uint16_t ethertype;
388     ovs_be32 ip;
389     uint8_t pcp;
390     uint8_t tos;
391
392     switch (code) {
393     case OFPUTIL_ACTION_INVALID:
394         NOT_REACHED();
395
396     case OFPUTIL_OFPAT10_OUTPUT:
397     case OFPUTIL_OFPAT11_OUTPUT:
398         parse_output(arg, ofpacts);
399         break;
400
401     case OFPUTIL_OFPAT10_SET_VLAN_VID:
402     case OFPUTIL_OFPAT11_SET_VLAN_VID:
403         vid = str_to_u32(arg);
404         if (vid & ~VLAN_VID_MASK) {
405             ovs_fatal(0, "%s: not a valid VLAN VID", arg);
406         }
407         ofpact_put_SET_VLAN_VID(ofpacts)->vlan_vid = vid;
408         break;
409
410     case OFPUTIL_OFPAT10_SET_VLAN_PCP:
411     case OFPUTIL_OFPAT11_SET_VLAN_PCP:
412         pcp = str_to_u32(arg);
413         if (pcp & ~7) {
414             ovs_fatal(0, "%s: not a valid VLAN PCP", arg);
415         }
416         ofpact_put_SET_VLAN_PCP(ofpacts)->vlan_pcp = pcp;
417         break;
418
419     case OFPUTIL_OFPAT12_SET_FIELD:
420         set_field_parse(arg, ofpacts);
421         break;
422
423     case OFPUTIL_OFPAT10_STRIP_VLAN:
424     case OFPUTIL_OFPAT11_POP_VLAN:
425         ofpact_put_STRIP_VLAN(ofpacts);
426         break;
427
428     case OFPUTIL_OFPAT11_PUSH_VLAN:
429         ethertype = str_to_u16(arg, "ethertype");
430         if (ethertype != ETH_TYPE_VLAN_8021Q) {
431             /* TODO:XXXX ETH_TYPE_VLAN_8021AD case isn't supported */
432             ovs_fatal(0, "%s: not a valid VLAN ethertype", arg);
433         }
434         ofpact_put_PUSH_VLAN(ofpacts);
435         break;
436
437     case OFPUTIL_OFPAT10_SET_DL_SRC:
438     case OFPUTIL_OFPAT11_SET_DL_SRC:
439         str_to_mac(arg, ofpact_put_SET_ETH_SRC(ofpacts)->mac);
440         break;
441
442     case OFPUTIL_OFPAT10_SET_DL_DST:
443     case OFPUTIL_OFPAT11_SET_DL_DST:
444         str_to_mac(arg, ofpact_put_SET_ETH_DST(ofpacts)->mac);
445         break;
446
447     case OFPUTIL_OFPAT10_SET_NW_SRC:
448     case OFPUTIL_OFPAT11_SET_NW_SRC:
449         str_to_ip(arg, &ip);
450         ofpact_put_SET_IPV4_SRC(ofpacts)->ipv4 = ip;
451         break;
452
453     case OFPUTIL_OFPAT10_SET_NW_DST:
454     case OFPUTIL_OFPAT11_SET_NW_DST:
455         str_to_ip(arg, &ip);
456         ofpact_put_SET_IPV4_DST(ofpacts)->ipv4 = ip;
457         break;
458
459     case OFPUTIL_OFPAT10_SET_NW_TOS:
460     case OFPUTIL_OFPAT11_SET_NW_TOS:
461         tos = str_to_u32(arg);
462         if (tos & ~IP_DSCP_MASK) {
463             ovs_fatal(0, "%s: not a valid TOS", arg);
464         }
465         ofpact_put_SET_IPV4_DSCP(ofpacts)->dscp = tos;
466         break;
467
468     case OFPUTIL_OFPAT11_DEC_NW_TTL:
469         NOT_REACHED();
470
471     case OFPUTIL_OFPAT10_SET_TP_SRC:
472     case OFPUTIL_OFPAT11_SET_TP_SRC:
473         ofpact_put_SET_L4_SRC_PORT(ofpacts)->port = str_to_u32(arg);
474         break;
475
476     case OFPUTIL_OFPAT10_SET_TP_DST:
477     case OFPUTIL_OFPAT11_SET_TP_DST:
478         ofpact_put_SET_L4_DST_PORT(ofpacts)->port = str_to_u32(arg);
479         break;
480
481     case OFPUTIL_OFPAT10_ENQUEUE:
482         parse_enqueue(arg, ofpacts);
483         break;
484
485     case OFPUTIL_NXAST_RESUBMIT:
486         parse_resubmit(arg, ofpacts);
487         break;
488
489     case OFPUTIL_NXAST_SET_TUNNEL:
490     case OFPUTIL_NXAST_SET_TUNNEL64:
491         tunnel = ofpact_put_SET_TUNNEL(ofpacts);
492         tunnel->ofpact.compat = code;
493         tunnel->tun_id = str_to_u64(arg);
494         break;
495
496     case OFPUTIL_NXAST_WRITE_METADATA:
497         parse_metadata(ofpacts, arg);
498         break;
499
500     case OFPUTIL_NXAST_SET_QUEUE:
501         ofpact_put_SET_QUEUE(ofpacts)->queue_id = str_to_u32(arg);
502         break;
503
504     case OFPUTIL_NXAST_POP_QUEUE:
505         ofpact_put_POP_QUEUE(ofpacts);
506         break;
507
508     case OFPUTIL_NXAST_REG_MOVE:
509         nxm_parse_reg_move(ofpact_put_REG_MOVE(ofpacts), arg);
510         break;
511
512     case OFPUTIL_NXAST_REG_LOAD:
513         nxm_parse_reg_load(ofpact_put_REG_LOAD(ofpacts), arg);
514         break;
515
516     case OFPUTIL_NXAST_NOTE:
517         parse_note(arg, ofpacts);
518         break;
519
520     case OFPUTIL_NXAST_MULTIPATH:
521         multipath_parse(ofpact_put_MULTIPATH(ofpacts), arg);
522         break;
523
524     case OFPUTIL_NXAST_AUTOPATH__DEPRECATED:
525         autopath_parse(ofpact_put_AUTOPATH(ofpacts), arg);
526         break;
527
528     case OFPUTIL_NXAST_BUNDLE:
529         bundle_parse(arg, ofpacts);
530         break;
531
532     case OFPUTIL_NXAST_BUNDLE_LOAD:
533         bundle_parse_load(arg, ofpacts);
534         break;
535
536     case OFPUTIL_NXAST_RESUBMIT_TABLE:
537     case OFPUTIL_NXAST_OUTPUT_REG:
538     case OFPUTIL_NXAST_DEC_TTL_CNT_IDS:
539         NOT_REACHED();
540
541     case OFPUTIL_NXAST_LEARN:
542         learn_parse(arg, flow, ofpacts);
543         break;
544
545     case OFPUTIL_NXAST_EXIT:
546         ofpact_put_EXIT(ofpacts);
547         break;
548
549     case OFPUTIL_NXAST_DEC_TTL:
550         parse_dec_ttl(ofpacts, arg);
551         break;
552
553     case OFPUTIL_NXAST_FIN_TIMEOUT:
554         parse_fin_timeout(ofpacts, arg);
555         break;
556
557     case OFPUTIL_NXAST_CONTROLLER:
558         parse_controller(ofpacts, arg);
559         break;
560     }
561 }
562
563 static bool
564 str_to_ofpact__(const struct flow *flow, char *pos, char *act, char *arg,
565                 struct ofpbuf *ofpacts, int n_actions)
566 {
567     int code = ofputil_action_code_from_name(act);
568     if (code >= 0) {
569         parse_named_action(code, flow, arg, ofpacts);
570     } else if (!strcasecmp(act, "drop")) {
571         if (n_actions) {
572             ovs_fatal(0, "Drop actions must not be preceded by other "
573                       "actions");
574         } else if (ofputil_parse_key_value(&pos, &act, &arg)) {
575             ovs_fatal(0, "Drop actions must not be followed by other "
576                       "actions");
577         }
578         return false;
579     } else {
580         uint16_t port;
581         if (ofputil_port_from_string(act, &port)) {
582             ofpact_put_OUTPUT(ofpacts)->port = port;
583         } else {
584             ovs_fatal(0, "Unknown action: %s", act);
585         }
586     }
587
588     return true;
589 }
590
591 static void
592 str_to_ofpacts(const struct flow *flow, char *str, struct ofpbuf *ofpacts)
593 {
594     char *pos, *act, *arg;
595     enum ofperr error;
596     int n_actions;
597
598     pos = str;
599     n_actions = 0;
600     while (ofputil_parse_key_value(&pos, &act, &arg)) {
601         if (!str_to_ofpact__(flow, pos, act, arg, ofpacts, n_actions)) {
602             break;
603         }
604         n_actions++;
605     }
606
607     error = ofpacts_verify(ofpacts->data, ofpacts->size);
608     if (error) {
609         ovs_fatal(0, "Incorrect action ordering");
610     }
611
612     ofpact_pad(ofpacts);
613 }
614
615 static void
616 parse_named_instruction(enum ovs_instruction_type type,
617                         char *arg, struct ofpbuf *ofpacts)
618 {
619     enum ofperr error;
620
621     switch (type) {
622     case OVSINST_OFPIT11_APPLY_ACTIONS:
623         NOT_REACHED();  /* This case is handled by str_to_inst_ofpacts() */
624         break;
625
626     case OVSINST_OFPIT11_WRITE_ACTIONS:
627         /* TODO:XXX */
628         ovs_fatal(0, "instruction write-actions is not supported yet");
629         break;
630
631     case OVSINST_OFPIT11_CLEAR_ACTIONS:
632         ofpact_put_CLEAR_ACTIONS(ofpacts);
633         break;
634
635     case OVSINST_OFPIT11_WRITE_METADATA:
636         parse_metadata(ofpacts, arg);
637         break;
638
639     case OVSINST_OFPIT11_GOTO_TABLE: {
640         struct ofpact_goto_table *ogt = ofpact_put_GOTO_TABLE(ofpacts);
641         char *table_s = strsep(&arg, ",");
642         if (!table_s || !table_s[0]) {
643             ovs_fatal(0, "instruction goto-table needs table id");
644         }
645         ogt->table_id = str_to_table_id(table_s);
646         break;
647     }
648     }
649
650     /* If write_metadata is specified as an action AND an instruction, ofpacts
651        could be invalid. */
652     error = ofpacts_verify(ofpacts->data, ofpacts->size);
653     if (error) {
654         ovs_fatal(0, "Incorrect instruction ordering");
655     }
656 }
657
658 static void
659 str_to_inst_ofpacts(const struct flow *flow, char *str, struct ofpbuf *ofpacts)
660 {
661     char *pos, *inst, *arg;
662     int type;
663     const char *prev_inst = NULL;
664     int prev_type = -1;
665     int n_actions = 0;
666
667     pos = str;
668     while (ofputil_parse_key_value(&pos, &inst, &arg)) {
669         type = ofpact_instruction_type_from_name(inst);
670         if (type < 0) {
671             if (!str_to_ofpact__(flow, pos, inst, arg, ofpacts, n_actions)) {
672                 break;
673             }
674
675             type = OVSINST_OFPIT11_APPLY_ACTIONS;
676             if (prev_type == type) {
677                 n_actions++;
678                 continue;
679             }
680         } else if (type == OVSINST_OFPIT11_APPLY_ACTIONS) {
681             ovs_fatal(0, "%s isn't supported. Just write actions then "
682                       "it is interpreted as apply_actions", inst);
683         } else {
684             parse_named_instruction(type, arg, ofpacts);
685         }
686
687         if (type == prev_type) {
688             ovs_fatal(0, "instruction can be specified at most once: %s",
689                       inst);
690         }
691         if (type <= prev_type) {
692             ovs_fatal(0, "Instruction %s must be specified before %s",
693                       inst, prev_inst);
694         }
695
696         prev_inst = inst;
697         prev_type = type;
698         n_actions++;
699     }
700     ofpact_pad(ofpacts);
701 }
702
703 struct protocol {
704     const char *name;
705     uint16_t dl_type;
706     uint8_t nw_proto;
707 };
708
709 static bool
710 parse_protocol(const char *name, const struct protocol **p_out)
711 {
712     static const struct protocol protocols[] = {
713         { "ip", ETH_TYPE_IP, 0 },
714         { "arp", ETH_TYPE_ARP, 0 },
715         { "icmp", ETH_TYPE_IP, IPPROTO_ICMP },
716         { "tcp", ETH_TYPE_IP, IPPROTO_TCP },
717         { "udp", ETH_TYPE_IP, IPPROTO_UDP },
718         { "ipv6", ETH_TYPE_IPV6, 0 },
719         { "ip6", ETH_TYPE_IPV6, 0 },
720         { "icmp6", ETH_TYPE_IPV6, IPPROTO_ICMPV6 },
721         { "tcp6", ETH_TYPE_IPV6, IPPROTO_TCP },
722         { "udp6", ETH_TYPE_IPV6, IPPROTO_UDP },
723     };
724     const struct protocol *p;
725
726     for (p = protocols; p < &protocols[ARRAY_SIZE(protocols)]; p++) {
727         if (!strcmp(p->name, name)) {
728             *p_out = p;
729             return true;
730         }
731     }
732     *p_out = NULL;
733     return false;
734 }
735
736 static void
737 ofp_fatal(const char *flow, bool verbose, const char *format, ...)
738 {
739     va_list args;
740
741     if (verbose) {
742         fprintf(stderr, "%s:\n", flow);
743     }
744
745     va_start(args, format);
746     ovs_fatal_valist(0, format, args);
747 }
748
749 static void
750 parse_field(const struct mf_field *mf, const char *s, struct match *match)
751 {
752     union mf_value value, mask;
753     char *error;
754
755     error = mf_parse(mf, s, &value, &mask);
756     if (error) {
757         ovs_fatal(0, "%s", error);
758     }
759
760     mf_set(mf, &value, &mask, match);
761 }
762
763 /* Convert 'str_' (as described in the Flow Syntax section of the ovs-ofctl man
764  * page) into 'fm' for sending the specified flow_mod 'command' to a switch.
765  * If 'actions' is specified, an action must be in 'string' and may be expanded
766  * or reallocated.
767  *
768  * To parse syntax for an OFPT_FLOW_MOD (or NXT_FLOW_MOD), use an OFPFC_*
769  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
770  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'. */
771 void
772 parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
773               bool verbose)
774 {
775     enum {
776         F_OUT_PORT = 1 << 0,
777         F_ACTIONS = 1 << 1,
778         F_TIMEOUT = 1 << 3,
779         F_PRIORITY = 1 << 4,
780         F_FLAGS = 1 << 5,
781     } fields;
782     char *string = xstrdup(str_);
783     char *save_ptr = NULL;
784     char *act_str = NULL;
785     char *name;
786
787     switch (command) {
788     case -1:
789         fields = F_OUT_PORT;
790         break;
791
792     case OFPFC_ADD:
793         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
794         break;
795
796     case OFPFC_DELETE:
797         fields = F_OUT_PORT;
798         break;
799
800     case OFPFC_DELETE_STRICT:
801         fields = F_OUT_PORT | F_PRIORITY;
802         break;
803
804     case OFPFC_MODIFY:
805         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
806         break;
807
808     case OFPFC_MODIFY_STRICT:
809         fields = F_ACTIONS | F_TIMEOUT | F_PRIORITY | F_FLAGS;
810         break;
811
812     default:
813         NOT_REACHED();
814     }
815
816     match_init_catchall(&fm->match);
817     fm->priority = OFP_DEFAULT_PRIORITY;
818     fm->cookie = htonll(0);
819     fm->cookie_mask = htonll(0);
820     if (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT) {
821         /* For modify, by default, don't update the cookie. */
822         fm->new_cookie = htonll(UINT64_MAX);
823     } else{
824         fm->new_cookie = htonll(0);
825     }
826     fm->table_id = 0xff;
827     fm->command = command;
828     fm->idle_timeout = OFP_FLOW_PERMANENT;
829     fm->hard_timeout = OFP_FLOW_PERMANENT;
830     fm->buffer_id = UINT32_MAX;
831     fm->out_port = OFPP_NONE;
832     fm->flags = 0;
833     if (fields & F_ACTIONS) {
834         act_str = strstr(string, "action");
835         if (!act_str) {
836             ofp_fatal(str_, verbose, "must specify an action");
837         }
838         *act_str = '\0';
839
840         act_str = strchr(act_str + 1, '=');
841         if (!act_str) {
842             ofp_fatal(str_, verbose, "must specify an action");
843         }
844
845         act_str++;
846     }
847     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
848          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
849         const struct protocol *p;
850
851         if (parse_protocol(name, &p)) {
852             match_set_dl_type(&fm->match, htons(p->dl_type));
853             if (p->nw_proto) {
854                 match_set_nw_proto(&fm->match, p->nw_proto);
855             }
856         } else if (fields & F_FLAGS && !strcmp(name, "send_flow_rem")) {
857             fm->flags |= OFPFF_SEND_FLOW_REM;
858         } else if (fields & F_FLAGS && !strcmp(name, "check_overlap")) {
859             fm->flags |= OFPFF_CHECK_OVERLAP;
860         } else {
861             char *value;
862
863             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
864             if (!value) {
865                 ofp_fatal(str_, verbose, "field %s missing value", name);
866             }
867
868             if (!strcmp(name, "table")) {
869                 fm->table_id = str_to_table_id(value);
870             } else if (!strcmp(name, "out_port")) {
871                 if (!ofputil_port_from_string(name, &fm->out_port)) {
872                     ofp_fatal(str_, verbose, "%s is not a valid OpenFlow port",
873                               name);
874                 }
875             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
876                 fm->priority = str_to_u16(value, name);
877             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
878                 fm->idle_timeout = str_to_u16(value, name);
879             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
880                 fm->hard_timeout = str_to_u16(value, name);
881             } else if (!strcmp(name, "cookie")) {
882                 char *mask = strchr(value, '/');
883
884                 if (mask) {
885                     /* A mask means we're searching for a cookie. */
886                     if (command == OFPFC_ADD) {
887                         ofp_fatal(str_, verbose, "flow additions cannot use "
888                                   "a cookie mask");
889                     }
890                     *mask = '\0';
891                     fm->cookie = htonll(str_to_u64(value));
892                     fm->cookie_mask = htonll(str_to_u64(mask+1));
893                 } else {
894                     /* No mask means that the cookie is being set. */
895                     if (command != OFPFC_ADD && command != OFPFC_MODIFY
896                             && command != OFPFC_MODIFY_STRICT) {
897                         ofp_fatal(str_, verbose, "cannot set cookie");
898                     }
899                     fm->new_cookie = htonll(str_to_u64(value));
900                 }
901             } else if (mf_from_name(name)) {
902                 parse_field(mf_from_name(name), value, &fm->match);
903             } else if (!strcmp(name, "duration")
904                        || !strcmp(name, "n_packets")
905                        || !strcmp(name, "n_bytes")) {
906                 /* Ignore these, so that users can feed the output of
907                  * "ovs-ofctl dump-flows" back into commands that parse
908                  * flows. */
909             } else {
910                 ofp_fatal(str_, verbose, "unknown keyword %s", name);
911             }
912         }
913     }
914     if (!fm->cookie_mask && fm->new_cookie == htonll(UINT64_MAX)
915             && (command == OFPFC_MODIFY || command == OFPFC_MODIFY_STRICT)) {
916         /* On modifies without a mask, we are supposed to add a flow if
917          * one does not exist.  If a cookie wasn't been specified, use a
918          * default of zero. */
919         fm->new_cookie = htonll(0);
920     }
921     if (fields & F_ACTIONS) {
922         struct ofpbuf ofpacts;
923
924         ofpbuf_init(&ofpacts, 32);
925         str_to_inst_ofpacts(&fm->match.flow, act_str, &ofpacts);
926         fm->ofpacts_len = ofpacts.size;
927         fm->ofpacts = ofpbuf_steal_data(&ofpacts);
928     } else {
929         fm->ofpacts_len = 0;
930         fm->ofpacts = NULL;
931     }
932
933     free(string);
934 }
935
936 /* Convert 'str_' (as described in the documentation for the "monitor" command
937  * in the ovs-ofctl man page) into 'fmr'. */
938 void
939 parse_flow_monitor_request(struct ofputil_flow_monitor_request *fmr,
940                            const char *str_)
941 {
942     static uint32_t id;
943
944     char *string = xstrdup(str_);
945     char *save_ptr = NULL;
946     char *name;
947
948     fmr->id = id++;
949     fmr->flags = (NXFMF_INITIAL | NXFMF_ADD | NXFMF_DELETE | NXFMF_MODIFY
950                   | NXFMF_OWN | NXFMF_ACTIONS);
951     fmr->out_port = OFPP_NONE;
952     fmr->table_id = 0xff;
953     match_init_catchall(&fmr->match);
954
955     for (name = strtok_r(string, "=, \t\r\n", &save_ptr); name;
956          name = strtok_r(NULL, "=, \t\r\n", &save_ptr)) {
957         const struct protocol *p;
958
959         if (!strcmp(name, "!initial")) {
960             fmr->flags &= ~NXFMF_INITIAL;
961         } else if (!strcmp(name, "!add")) {
962             fmr->flags &= ~NXFMF_ADD;
963         } else if (!strcmp(name, "!delete")) {
964             fmr->flags &= ~NXFMF_DELETE;
965         } else if (!strcmp(name, "!modify")) {
966             fmr->flags &= ~NXFMF_MODIFY;
967         } else if (!strcmp(name, "!actions")) {
968             fmr->flags &= ~NXFMF_ACTIONS;
969         } else if (!strcmp(name, "!own")) {
970             fmr->flags &= ~NXFMF_OWN;
971         } else if (parse_protocol(name, &p)) {
972             match_set_dl_type(&fmr->match, htons(p->dl_type));
973             if (p->nw_proto) {
974                 match_set_nw_proto(&fmr->match, p->nw_proto);
975             }
976         } else {
977             char *value;
978
979             value = strtok_r(NULL, ", \t\r\n", &save_ptr);
980             if (!value) {
981                 ovs_fatal(0, "%s: field %s missing value", str_, name);
982             }
983
984             if (!strcmp(name, "table")) {
985                 fmr->table_id = str_to_table_id(value);
986             } else if (!strcmp(name, "out_port")) {
987                 fmr->out_port = atoi(value);
988             } else if (mf_from_name(name)) {
989                 parse_field(mf_from_name(name), value, &fmr->match);
990             } else {
991                 ovs_fatal(0, "%s: unknown keyword %s", str_, name);
992             }
993         }
994     }
995     free(string);
996 }
997
998 /* Parses 's' as a set of OpenFlow actions and appends the actions to
999  * 'actions'.
1000  *
1001  * Prints an error on stderr and aborts the program if 's' syntax is
1002  * invalid. */
1003 void
1004 parse_ofpacts(const char *s_, struct ofpbuf *ofpacts)
1005 {
1006     char *s = xstrdup(s_);
1007     str_to_ofpacts(NULL, s, ofpacts);
1008     free(s);
1009 }
1010
1011 /* Parses 'string' as an OFPT_FLOW_MOD or NXT_FLOW_MOD with command 'command'
1012  * (one of OFPFC_*) into 'fm'. */
1013 void
1014 parse_ofp_flow_mod_str(struct ofputil_flow_mod *fm, const char *string,
1015                        uint16_t command, bool verbose)
1016 {
1017     struct match match_copy;
1018
1019     parse_ofp_str(fm, command, string, verbose);
1020
1021     /* Normalize a copy of the match.  This ensures that non-normalized flows
1022      * get logged but doesn't affect what gets sent to the switch, so that the
1023      * switch can do whatever it likes with the flow. */
1024     match_copy = fm->match;
1025     ofputil_normalize_match(&match_copy);
1026 }
1027
1028 void
1029 parse_ofp_flow_mod_file(const char *file_name, uint16_t command,
1030                         struct ofputil_flow_mod **fms, size_t *n_fms)
1031 {
1032     size_t allocated_fms;
1033     FILE *stream;
1034     struct ds s;
1035
1036     stream = !strcmp(file_name, "-") ? stdin : fopen(file_name, "r");
1037     if (stream == NULL) {
1038         ovs_fatal(errno, "%s: open", file_name);
1039     }
1040
1041     allocated_fms = *n_fms;
1042     ds_init(&s);
1043     while (!ds_get_preprocessed_line(&s, stream)) {
1044         if (*n_fms >= allocated_fms) {
1045             *fms = x2nrealloc(*fms, &allocated_fms, sizeof **fms);
1046         }
1047         parse_ofp_flow_mod_str(&(*fms)[*n_fms], ds_cstr(&s), command, false);
1048         *n_fms += 1;
1049     }
1050     ds_destroy(&s);
1051
1052     if (stream != stdin) {
1053         fclose(stream);
1054     }
1055 }
1056
1057 void
1058 parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
1059                                  bool aggregate, const char *string)
1060 {
1061     struct ofputil_flow_mod fm;
1062
1063     parse_ofp_str(&fm, -1, string, false);
1064     fsr->aggregate = aggregate;
1065     fsr->cookie = fm.cookie;
1066     fsr->cookie_mask = fm.cookie_mask;
1067     fsr->match = fm.match;
1068     fsr->out_port = fm.out_port;
1069     fsr->table_id = fm.table_id;
1070 }
1071
1072 /* Parses a specification of a flow from 's' into 'flow'.  's' must take the
1073  * form FIELD=VALUE[,FIELD=VALUE]... where each FIELD is the name of a
1074  * mf_field.  Fields must be specified in a natural order for satisfying
1075  * prerequisites.
1076  *
1077  * Returns NULL on success, otherwise a malloc()'d string that explains the
1078  * problem. */
1079 char *
1080 parse_ofp_exact_flow(struct flow *flow, const char *s)
1081 {
1082     char *pos, *key, *value_s;
1083     char *error = NULL;
1084     char *copy;
1085
1086     memset(flow, 0, sizeof *flow);
1087
1088     pos = copy = xstrdup(s);
1089     while (ofputil_parse_key_value(&pos, &key, &value_s)) {
1090         const struct protocol *p;
1091         if (parse_protocol(key, &p)) {
1092             if (flow->dl_type) {
1093                 error = xasprintf("%s: Ethernet type set multiple times", s);
1094                 goto exit;
1095             }
1096             flow->dl_type = htons(p->dl_type);
1097
1098             if (p->nw_proto) {
1099                 if (flow->nw_proto) {
1100                     error = xasprintf("%s: network protocol set "
1101                                       "multiple times", s);
1102                     goto exit;
1103                 }
1104                 flow->nw_proto = p->nw_proto;
1105             }
1106         } else {
1107             const struct mf_field *mf;
1108             union mf_value value;
1109             char *field_error;
1110
1111             mf = mf_from_name(key);
1112             if (!mf) {
1113                 error = xasprintf("%s: unknown field %s", s, key);
1114                 goto exit;
1115             }
1116
1117             if (!mf_are_prereqs_ok(mf, flow)) {
1118                 error = xasprintf("%s: prerequisites not met for setting %s",
1119                                   s, key);
1120                 goto exit;
1121             }
1122
1123             if (!mf_is_zero(mf, flow)) {
1124                 error = xasprintf("%s: field %s set multiple times", s, key);
1125                 goto exit;
1126             }
1127
1128             field_error = mf_parse_value(mf, value_s, &value);
1129             if (field_error) {
1130                 error = xasprintf("%s: bad value for %s (%s)",
1131                                   s, key, field_error);
1132                 free(field_error);
1133                 goto exit;
1134             }
1135
1136             mf_set_flow_value(mf, &value, flow);
1137         }
1138     }
1139
1140 exit:
1141     free(copy);
1142
1143     if (error) {
1144         memset(flow, 0, sizeof *flow);
1145     }
1146     return error;
1147 }