[ovs-dev] [PATCH v2 16/47] ofp-print: Support printing of OF1.4 Flow Monitor Requests

Simon Horman horms at verge.net.au
Tue Jun 10 10:27:20 UTC 2014


This is consists of extending and renaming
existing code for NX flow monitor requests.

Signed-off-by: Simon Horman <horms at verge.net.au>

---
v2
* No change
---
 lib/ofp-print.c    | 68 +++++++++++++++++++++++++++++++++++++++++++++++-------
 tests/ofp-print.at | 12 ++++++++++
 2 files changed, 72 insertions(+), 8 deletions(-)

diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 81cac90..40eb16d 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -2184,16 +2184,50 @@ nx_flow_monitor_flags_to_name(uint32_t bit)
     return NULL;
 }
 
+static const char *
+ofp_flow_monitor_flags_to_name(uint32_t bit)
+{
+    enum ofp14_flow_monitor_flags fmf = bit;
+
+    switch (fmf) {
+    case OFPFMF14_INITIAL: return "initial";
+    case OFPFMF14_ADD: return "add";
+    case OFPFMF14_REMOVED: return "delete";
+    case OFPFMF14_MODIFY: return "modify";
+    case OFPFMF14_INSTRUCTIONS: return "instructions";
+    case OFPFMF14_NO_ABBREV: return "no_abbrev";
+    case OFPFMF14_ONLY_OWN: return "only_own";
+    }
+
+    return NULL;
+}
+
+static const char *
+ofp_flow_monitor_command_to_name(enum ofp14_flow_monitor_command command)
+{
+    switch (command) {
+    case OFPFMC14_ADD:
+        return "ADD";
+    case OFPFMC14_MODIFY:
+        return "MODIFY";
+    case OFPFMC14_DELETE:
+        return "DELETE";
+    default:
+        OVS_NOT_REACHED();
+    }
+}
+
 static void
-ofp_print_nxst_flow_monitor_request(struct ds *string,
-                                    const struct ofp_header *oh)
+ofp_print_flow_monitor_request(struct ds *string, const struct ofp_header *oh)
 {
     struct ofpbuf b;
+    enum ofpraw raw;
+
+    ofpraw_decode(&raw, oh);
 
     ofpbuf_use_const(&b, oh, ntohs(oh->length));
     for (;;) {
         struct ofputil_flow_monitor_request request;
-        enum nx_flow_monitor_flags nx_flags;
         int retval;
 
         retval = ofputil_decode_flow_monitor_request(&request, &b);
@@ -2204,16 +2238,34 @@ ofp_print_nxst_flow_monitor_request(struct ds *string,
             return;
         }
 
-        ds_put_format(string, "\n id=%"PRIu32" flags=", request.id);
-        nx_flags = nx_from_ofp14_flow_monitor_flags(request.flags);
-        ofp_print_bit_names(string, nx_flags,
-                            nx_flow_monitor_flags_to_name, ',');
+        ds_put_char(string, '\n');
+
+        if (raw == OFPRAW_OFPST14_FLOW_MONITOR_REQUEST) {
+            ds_put_format(string, " command=%s",
+                          ofp_flow_monitor_command_to_name(request.command));
+        }
+
+        ds_put_format(string, " id=%"PRIu32" flags=", request.id);
+        if (raw == OFPRAW_OFPST14_FLOW_MONITOR_REQUEST) {
+            ofp_print_bit_names(string, request.flags,
+                                ofp_flow_monitor_flags_to_name, ',');
+        } else {
+            enum nx_flow_monitor_flags nx_flags;
+            nx_flags = nx_from_ofp14_flow_monitor_flags(request.flags);
+            ofp_print_bit_names(string, nx_flags,
+                                nx_flow_monitor_flags_to_name, ',');
+        }
 
         if (request.out_port != OFPP_NONE) {
             ds_put_cstr(string, " out_port=");
             ofputil_format_port(request.out_port, string);
         }
 
+        if (request.out_group != OFPG_ANY) {
+            ds_put_cstr(string, " out_group=");
+            ofputil_format_group(request.out_group, string);
+        }
+
         if (request.table_id != 0xff) {
             ds_put_format(string, " table=%"PRIu8, request.table_id);
         }
@@ -3025,7 +3077,7 @@ ofp_to_string__(const struct ofp_header *oh, enum ofpraw raw,
         break;
 
     case OFPTYPE_FLOW_MONITOR_STATS_REQUEST:
-        ofp_print_nxst_flow_monitor_request(string, msg);
+        ofp_print_flow_monitor_request(string, msg);
         break;
 
     case OFPTYPE_FLOW_MONITOR_STATS_REPLY:
diff --git a/tests/ofp-print.at b/tests/ofp-print.at
index cfb604e..15efd73 100644
--- a/tests/ofp-print.at
+++ b/tests/ofp-print.at
@@ -1975,6 +1975,18 @@ OFPST_PORT_DESC reply (xid=0x0):
 ])
 AT_CLEANUP
 
+AT_SETUP([OFPST_FLOW_MONITOR request - OF1.4])
+AT_KEYWORDS([ofp-print OFPT_STATS_REQUEST])
+AT_CHECK([ovs-ofctl ofp-print "\
+05 12 00 30 00 00 00 02 00 10 00 00 00 00 00 00 \
+00 00 00 01 00 00 00 05 00 00 00 08 00 7f 00 00 \
+00 01 00 0a 80 00 0c 02 10 09 00 00 00 00 00 00 \
+"], [0], [dnl
+OFPST_FLOW_MONITOR request (OF1.4) (xid=0x2):
+ command=ADD id=1 flags=initial,add,delete,modify,instructions,no_abbrev,only_own out_port=5 out_group=8 table=0 dl_vlan=9
+])
+AT_CLEANUP
+
 AT_SETUP([OFPST_PORT_DESC reply - OF1.4])
 AT_KEYWORDS([ofp-print OFPT_STATS_REPLY])
 AT_CHECK([ovs-ofctl ofp-print "\
-- 
2.0.0.rc2




More information about the dev mailing list