flow: New FLOW_WC_SEQ build assertion.
[sliver-openvswitch.git] / lib / ofp-parse.c
index 5bc0484..c938400 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 
 #include "autopath.h"
+#include "bundle.h"
 #include "byte-order.h"
 #include "dynamic-string.h"
 #include "netdev.h"
@@ -284,7 +285,6 @@ put_dl_addr_action(struct ofpbuf *b, uint16_t type, const char *addr)
     str_to_mac(addr, oada->dl_addr);
 }
 
-
 static bool
 parse_port_name(const char *name, uint16_t *port)
 {
@@ -316,6 +316,40 @@ parse_port_name(const char *name, uint16_t *port)
     return false;
 }
 
+static void
+parse_resubmit(struct nx_action_resubmit *nar, char *arg)
+{
+    char *in_port_s, *table_s;
+    uint16_t in_port;
+    uint8_t table;
+
+    in_port_s = strsep(&arg, ",");
+    if (in_port_s && in_port_s[0]) {
+        if (!parse_port_name(in_port_s, &in_port)) {
+            in_port = str_to_u32(in_port_s);
+        }
+    } else {
+        in_port = OFPP_IN_PORT;
+    }
+
+    table_s = strsep(&arg, ",");
+    table = table_s && table_s[0] ? str_to_u32(table_s) : 255;
+
+    if (in_port == OFPP_IN_PORT && table == 255) {
+        ovs_fatal(0, "at least one \"in_port\" or \"table\" must be specified "
+                  " on resubmit");
+    }
+
+    nar->vendor = htonl(NX_VENDOR_ID);
+    nar->in_port = htons(in_port);
+    if (in_port != OFPP_IN_PORT && table == 255) {
+        nar->subtype = htons(NXAST_RESUBMIT);
+    } else {
+        nar->subtype = htons(NXAST_RESUBMIT_TABLE);
+        nar->table = table;
+    }
+}
+
 static void
 str_to_action(char *str, struct ofpbuf *b)
 {
@@ -420,9 +454,7 @@ str_to_action(char *str, struct ofpbuf *b)
         } else if (!strcasecmp(act, "resubmit")) {
             struct nx_action_resubmit *nar;
             nar = put_action(b, sizeof *nar, OFPAT_VENDOR);
-            nar->vendor = htonl(NX_VENDOR_ID);
-            nar->subtype = htons(NXAST_RESUBMIT);
-            nar->in_port = htons(str_to_u32(arg));
+            parse_resubmit(nar, arg);
         } else if (!strcasecmp(act, "set_tunnel")
                    || !strcasecmp(act, "set_tunnel64")) {
             uint64_t tun_id = str_to_u64(arg);
@@ -504,6 +536,10 @@ str_to_action(char *str, struct ofpbuf *b)
             struct nx_action_autopath *naa;
             naa = ofpbuf_put_uninit(b, sizeof *naa);
             autopath_parse(naa, arg);
+        } else if (!strcasecmp(act, "bundle")) {
+            bundle_parse(b, arg);
+        } else if (!strcasecmp(act, "bundle_load")) {
+            bundle_parse_load(b, arg);
         } else if (!strcasecmp(act, "output")) {
             put_output_action(b, str_to_u32(arg));
         } else if (!strcasecmp(act, "enqueue")) {
@@ -577,6 +613,7 @@ parse_protocol(const char *name, const struct protocol **p_out)
     return false;
 }
 
+BUILD_ASSERT_DECL(FLOW_WC_SEQ == 1);
 #define FIELDS                                              \
     FIELD(F_TUN_ID,      "tun_id",      0)                  \
     FIELD(F_IN_PORT,     "in_port",     FWW_IN_PORT)        \
@@ -800,7 +837,8 @@ parse_reg_value(struct cls_rule *rule, int reg_idx, const char *value)
  * constant for 'command'.  To parse syntax for an OFPST_FLOW or
  * OFPST_AGGREGATE (or NXST_FLOW or NXST_AGGREGATE), use -1 for 'command'. */
 void
-parse_ofp_str(struct flow_mod *fm, int command, const char *str_, bool verbose)
+parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
+              bool verbose)
 {
     enum {
         F_OUT_PORT = 1 << 0,
@@ -971,7 +1009,7 @@ parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format,
     struct cls_rule rule_copy;
     struct ofpbuf actions;
     struct ofpbuf *ofm;
-    struct flow_mod fm;
+    struct ofputil_flow_mod fm;
 
     ofpbuf_init(&actions, 64);
     parse_ofp_str(&fm, command, string, verbose);
@@ -1025,10 +1063,10 @@ parse_ofp_flow_mod_file(struct list *packets,
 }
 
 void
-parse_ofp_flow_stats_request_str(struct flow_stats_request *fsr,
+parse_ofp_flow_stats_request_str(struct ofputil_flow_stats_request *fsr,
                                  bool aggregate, char *string)
 {
-    struct flow_mod fm;
+    struct ofputil_flow_mod fm;
 
     parse_ofp_str(&fm, -1, string, false);
     fsr->aggregate = aggregate;