nicira-ext: New action "exit".
[sliver-openvswitch.git] / lib / ofp-parse.c
index fd0a72e..0146a33 100644 (file)
 
 VLOG_DEFINE_THIS_MODULE(ofp_parse);
 
+static uint8_t
+str_to_table_id(const char *str)
+{
+    int table_id;
+
+    if (!str_to_int(str, 10, &table_id) || table_id < 0 || table_id > 255) {
+        ovs_fatal(0, "invalid table \"%s\"", str);
+    }
+    return table_id;
+}
+
+static uint16_t
+str_to_u16(const char *str, const char *name)
+{
+    int value;
+
+    if (!str_to_int(str, 0, &value) || value < 0 || value > 65535) {
+        ovs_fatal(0, "invalid %s \"%s\"", name, str);
+    }
+    return value;
+}
+
 static uint32_t
 str_to_u32(const char *str)
 {
@@ -338,6 +360,9 @@ parse_named_action(enum ofputil_action_code code, const struct flow *flow,
     case OFPUTIL_NXAST_LEARN:
         learn_parse(b, arg, flow);
         break;
+    case OFPUTIL_NXAST_EXIT:
+        ofputil_put_NXAST_EXIT(b);
+        break;
     }
 }
 
@@ -541,15 +566,15 @@ parse_ofp_str(struct ofputil_flow_mod *fm, int command, const char *str_,
             }
 
             if (!strcmp(name, "table")) {
-                fm->table_id = atoi(value);
+                fm->table_id = str_to_table_id(value);
             } else if (!strcmp(name, "out_port")) {
                 fm->out_port = atoi(value);
             } else if (fields & F_PRIORITY && !strcmp(name, "priority")) {
-                fm->cr.priority = atoi(value);
+                fm->cr.priority = str_to_u16(value, name);
             } else if (fields & F_TIMEOUT && !strcmp(name, "idle_timeout")) {
-                fm->idle_timeout = atoi(value);
+                fm->idle_timeout = str_to_u16(value, name);
             } else if (fields & F_TIMEOUT && !strcmp(name, "hard_timeout")) {
-                fm->hard_timeout = atoi(value);
+                fm->hard_timeout = str_to_u16(value, name);
             } else if (fields & F_COOKIE && !strcmp(name, "cookie")) {
                 fm->cookie = htonll(str_to_u64(value));
             } else if (mf_from_name(name)) {
@@ -593,11 +618,9 @@ parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format,
 {
     enum nx_flow_format min_format, next_format;
     struct cls_rule rule_copy;
-    struct ofpbuf actions;
     struct ofpbuf *ofm;
     struct ofputil_flow_mod fm;
 
-    ofpbuf_init(&actions, 64);
     parse_ofp_str(&fm, command, string, verbose);
 
     min_format = ofputil_min_flow_format(&fm.cr);
@@ -622,8 +645,6 @@ parse_ofp_flow_mod_str(struct list *packets, enum nx_flow_format *cur_format,
 
     ofm = ofputil_encode_flow_mod(&fm, *cur_format, *flow_mod_table_id);
     list_push_back(packets, &ofm->list_node);
-
-    ofpbuf_uninit(&actions);
 }
 
 /* Similar to parse_ofp_flow_mod_str(), except that the string is read from