ofp-util: New functions for creating Nicira extension messages.
[openvswitch] / utilities / ovs-ofctl.c
index 869c75457614284497155a439036141577316483..3beef3b6b00c7fd97ebcac62d4bef999cb257a3f 100644 (file)
@@ -197,7 +197,7 @@ static void
 open_vconn_socket(const char *name, struct vconn **vconnp)
 {
     char *vconn_name = xasprintf("unix:%s", name);
-    VLOG_INFO("connecting to %s", vconn_name);
+    VLOG_DBG("connecting to %s", vconn_name);
     run(vconn_open_block(vconn_name, OFP_VERSION, vconnp),
         "connecting to %s", vconn_name);
     free(vconn_name);
@@ -229,7 +229,7 @@ open_vconn__(const char *name, const char *default_suffix,
             "obtaining name of %s", dpif_name);
         dpif_close(dpif);
         if (strcmp(dpif_name, name)) {
-            VLOG_INFO("datapath %s is named %s", name, dpif_name);
+            VLOG_DBG("datapath %s is named %s", name, dpif_name);
         }
 
         socket_name = xasprintf("%s/%s.%s",
@@ -337,6 +337,24 @@ dump_trivial_stats_transaction(const char *vconn_name, uint8_t stats_type)
     dump_stats_transaction(vconn_name, request);
 }
 
+/* Sends 'request', which should be a request that only has a reply if an error
+ * occurs, and waits for it to succeed or fail.  If an error does occur, prints
+ * it and exits with an error. */
+static void
+dump_noreply_transaction(struct vconn *vconn, struct ofpbuf *request)
+{
+    struct ofpbuf *reply;
+
+    update_openflow_length(request);
+    run(vconn_transact_noreply(vconn, request, &reply),
+        "talking to %s", vconn_get_name(vconn));
+    if (reply) {
+        ofp_print(stderr, reply->data, reply->size, 2);
+        exit(1);
+    }
+    ofpbuf_delete(reply);
+}
+
 static void
 do_show(int argc OVS_UNUSED, char *argv[])
 {
@@ -422,7 +440,7 @@ fetch_ofp_phy_port(const char *vconn_name, const char *port_name,
 
         if (port_no != UINT_MAX
             ? htons(port_no) == opp->port_no
-            : !strncmp((char *) opp->name, port_name, sizeof opp->name)) {
+            : !strncmp(opp->name, port_name, sizeof opp->name)) {
             *oppp = *opp;
             ofpbuf_delete(reply);
             vconn_close(vconn);
@@ -460,6 +478,7 @@ do_dump_flows(int argc, char *argv[])
     parse_ofp_str(&pf, NULL, argc > 2 ? argv[2] : "");
     ofputil_cls_rule_to_match(&pf.rule, NXFF_OPENFLOW10, &req->match);
     memset(&req->pad, 0, sizeof req->pad);
+    req->table_id = pf.table_idx;
     req->out_port = htons(pf.out_port);
 
     dump_stats_transaction(argv[1], request);
@@ -476,6 +495,7 @@ do_dump_aggregate(int argc, char *argv[])
     parse_ofp_str(&pf, NULL, argc > 2 ? argv[2] : "");
     ofputil_cls_rule_to_match(&pf.rule, NXFF_OPENFLOW10, &req->match);
     memset(&req->pad, 0, sizeof req->pad);
+    req->table_id = pf.table_idx;
     req->out_port = htons(pf.out_port);
 
     dump_stats_transaction(argv[1], request);
@@ -509,12 +529,12 @@ static void
 do_add_flow(int argc OVS_UNUSED, char *argv[])
 {
     struct vconn *vconn;
-    struct ofpbuf *buffer;
+    struct ofpbuf *request;
 
-    buffer = parse_ofp_flow_mod_str(argv[2], OFPFC_ADD);
+    request = parse_ofp_flow_mod_str(argv[2], OFPFC_ADD);
 
     open_vconn(argv[1], &vconn);
-    send_openflow_buffer(vconn, buffer);
+    dump_noreply_transaction(vconn, request);
     vconn_close(vconn);
 }
 
@@ -532,7 +552,7 @@ do_add_flows(int argc OVS_UNUSED, char *argv[])
 
     open_vconn(argv[1], &vconn);
     while ((b = parse_ofp_add_flow_file(file)) != NULL) {
-        send_openflow_buffer(vconn, b);
+        dump_noreply_transaction(vconn, b);
     }
     vconn_close(vconn);
     fclose(file);
@@ -548,7 +568,7 @@ do_mod_flows(int argc OVS_UNUSED, char *argv[])
     command = strict ? OFPFC_MODIFY_STRICT : OFPFC_MODIFY;
     buffer = parse_ofp_flow_mod_str(argv[2], command);
     open_vconn(argv[1], &vconn);
-    send_openflow_buffer(vconn, buffer);
+    dump_noreply_transaction(vconn, buffer);
     vconn_close(vconn);
 }
 
@@ -562,7 +582,7 @@ static void do_del_flows(int argc, char *argv[])
     buffer = parse_ofp_flow_mod_str(argc > 2 ? argv[2] : "", command);
 
     open_vconn(argv[1], &vconn);
-    send_openflow_buffer(vconn, buffer);
+    dump_noreply_transaction(vconn, buffer);
     vconn_close(vconn);
 }
 
@@ -590,7 +610,7 @@ do_monitor(int argc, char *argv[])
 
         osc = make_openflow(sizeof *osc, OFPT_SET_CONFIG, &buf);
         osc->miss_send_len = htons(miss_send_len);
-        send_openflow_buffer(vconn, buf);
+        dump_noreply_transaction(vconn, buf);
     }
     monitor_vconn(vconn);
 }
@@ -666,7 +686,7 @@ do_mod_port(int argc OVS_UNUSED, char *argv[])
     }
 
     open_vconn(argv[1], &vconn);
-    send_openflow_buffer(vconn, request);
+    dump_noreply_transaction(vconn, request);
     vconn_close(vconn);
 }