openflow: Separate OF1.0, OF1.1 flow_mod constants and types.
authorBen Pfaff <blp@nicira.com>
Wed, 4 Jul 2012 06:01:59 +0000 (23:01 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 25 Jul 2012 05:26:30 +0000 (22:26 -0700)
Signed-off-by: Ben Pfaff <blp@nicira.com>
Tested-by: Simon Horman <horms@verge.net.au>
Reviewed-by: Simon Horman <horms@verge.net.au>
---
v3->v4: Builds, passes unit tests.

include/openflow/nicira-ext.h
include/openflow/openflow-1.0.h
include/openflow/openflow-common.h
lib/ofp-msgs.h
lib/ofp-print.c
lib/ofp-util.c
ofproto/ofproto.c
utilities/ovs-ofctl.c

index 05f6c18a7cb67eb5903bfac393c9ec1ec69473db..4fc2049d15d19a9e12d5e6e6f80768b1bb864245 100644 (file)
@@ -118,7 +118,7 @@ enum nx_hash_fields {
  * instead of having the switch decide which table is most appropriate as
  * required by OpenFlow 1.0.  By default, the extension is disabled.
  *
- * When this feature is enabled, Open vSwitch treats struct ofp_flow_mod's
+ * When this feature is enabled, Open vSwitch treats struct ofp10_flow_mod's
  * 16-bit 'command' member as two separate fields.  The upper 8 bits are used
  * as the table ID, the lower 8 bits specify the command as usual.  A table ID
  * of 0xff is treated like a wildcarded table ID.
index b2077f0273432f000a8d0396ec15c4cbafc3e036..75c5fc3dbc3d91b404e3c7dc0a941f5b0759cbf7 100644 (file)
@@ -271,14 +271,6 @@ struct ofp_packet_out {
 };
 OFP_ASSERT(sizeof(struct ofp_packet_out) == 8);
 
-enum ofp_flow_mod_command {
-    OFPFC_ADD,              /* New flow. */
-    OFPFC_MODIFY,           /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards */
-    OFPFC_DELETE,           /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT     /* Strictly match wildcards and priority. */
-};
-
 /* Flow wildcards. */
 enum ofp_flow_wildcards {
     OFPFW10_IN_PORT    = 1 << 0,  /* Switch input port. */
@@ -363,15 +355,12 @@ OFP_ASSERT(sizeof(struct ofp10_match) == 40);
 /* By default, choose a priority in the middle. */
 #define OFP_DEFAULT_PRIORITY 0x8000
 
-enum ofp_flow_mod_flags {
-    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
-                                    * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
-    OFPFF_EMERG         = 1 << 2   /* Ramark this is for emergency. */
+enum ofp10_flow_mod_flags {
+    OFPFF10_EMERG       = 1 << 2   /* Ramark this is for emergency. */
 };
 
 /* Flow setup and teardown (controller -> datapath). */
-struct ofp_flow_mod {
+struct ofp10_flow_mod {
     struct ofp10_match match;    /* Fields to match */
     ovs_be64 cookie;             /* Opaque controller-issued identifier. */
 
@@ -391,7 +380,7 @@ struct ofp_flow_mod {
                                             from the length field in the
                                             header. */
 };
-OFP_ASSERT(sizeof(struct ofp_flow_mod) == 64);
+OFP_ASSERT(sizeof(struct ofp10_flow_mod) == 64);
 
 /* Flow removed (datapath -> controller). */
 struct ofp_flow_removed {
index 3c456ba14b8228fb7ab7e73036eeb8cf2311b9f7..4ab378046b00feaf78e71302945bd9686dee9cc1 100644 (file)
@@ -195,6 +195,20 @@ enum ofp_packet_in_reason {
     OFPR_N_REASONS
 };
 
+enum ofp_flow_mod_command {
+    OFPFC_ADD,              /* New flow. */
+    OFPFC_MODIFY,           /* Modify all matching flows. */
+    OFPFC_MODIFY_STRICT,    /* Modify entry strictly matching wildcards */
+    OFPFC_DELETE,           /* Delete all matching flows. */
+    OFPFC_DELETE_STRICT     /* Strictly match wildcards and priority. */
+};
+
+enum ofp_flow_mod_flags {
+    OFPFF_SEND_FLOW_REM = 1 << 0,  /* Send flow removed message when flow
+                                    * expires or is deleted. */
+    OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
+};
+
 /* Action structure for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */
 struct ofp_action_vlan_vid {
     ovs_be16 type;                  /* Type. */
index 162d6e0467cc96f99c77990f8ca3615ad96dbcb1..5ff5976e74065a9e9f0e81f6e5debf4de882976f 100644 (file)
@@ -145,7 +145,7 @@ enum ofpraw {
     /* OFPT 1.1+ (13): struct ofp11_packet_out, uint8_t[]. */
     OFPRAW_OFPT11_PACKET_OUT,
 
-    /* OFPT 1.0 (14): struct ofp_flow_mod, struct ofp_action_header[]. */
+    /* OFPT 1.0 (14): struct ofp10_flow_mod, struct ofp_action_header[]. */
     OFPRAW_OFPT10_FLOW_MOD,
     /* OFPT 1.1+ (14): struct ofp11_flow_mod, struct ofp11_instruction[]. */
     OFPRAW_OFPT11_FLOW_MOD,
index c4e7b8f4512359727acb1aacc71c215f9653f70a..dc9fb6de1f26ac1228cb5c5929765923c9db1673 100644 (file)
@@ -711,7 +711,7 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh, int verbosity)
     ds_put_char(s, ' ');
     ofpraw_decode(&raw, oh);
     if (verbosity >= 3 && raw == OFPRAW_OFPT10_FLOW_MOD) {
-        const struct ofp_flow_mod *ofm = ofpmsg_body(oh);
+        const struct ofp10_flow_mod *ofm = ofpmsg_body(oh);
         ofp10_match_print(s, &ofm->match, verbosity);
 
         /* ofp_print_match() doesn't print priority. */
@@ -770,11 +770,11 @@ ofp_print_flow_mod(struct ds *s, const struct ofp_header *oh, int verbosity)
         if (flags & OFPFF_CHECK_OVERLAP) {
             ds_put_cstr(s, "check_overlap ");
         }
-        if (flags & OFPFF_EMERG) {
+        if (flags & OFPFF10_EMERG) {
             ds_put_cstr(s, "emerg ");
         }
 
-        flags &= ~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF_EMERG);
+        flags &= ~(OFPFF_SEND_FLOW_REM | OFPFF_CHECK_OVERLAP | OFPFF10_EMERG);
         if (flags) {
             ds_put_format(s, "flags:0x%"PRIx16" ", flags);
         }
index e41bab2b63da363da711d714aec33444121f25f2..92d3fe465d2b914e3dc8e4adf5fa3d644a6e4933 100644 (file)
@@ -1104,7 +1104,7 @@ ofputil_decode_flow_mod(struct ofputil_flow_mod *fm,
     raw = ofpraw_pull_assert(&b);
     if (raw == OFPRAW_OFPT10_FLOW_MOD) {
         /* Standard OpenFlow 1.1 flow_mod. */
-        const struct ofp_flow_mod *ofm;
+        const struct ofp10_flow_mod *ofm;
         uint16_t priority;
         enum ofperr error;
 
@@ -1193,7 +1193,7 @@ struct ofpbuf *
 ofputil_encode_flow_mod(const struct ofputil_flow_mod *fm,
                         enum ofputil_protocol protocol)
 {
-    struct ofp_flow_mod *ofm;
+    struct ofp10_flow_mod *ofm;
     struct nx_flow_mod *nfm;
     struct ofpbuf *msg;
     uint16_t command;
index 522b791f48220226863996beec720bdc1a64ea5c..5fa57d85ebfe35f382c54a105b96283ce7542cb9 100644 (file)
@@ -3209,9 +3209,9 @@ handle_flow_mod(struct ofconn *ofconn, const struct ofp_header *oh)
         goto exit_free_ofpacts;
     }
 
+    if (fm.flags & OFPFF10_EMERG) {
     /* We do not support the OpenFlow 1.0 emergency flow cache, which is not
      * required in OpenFlow 1.0.1 and removed from OpenFlow 1.1. */
-    if (fm.flags & OFPFF_EMERG) {
         /* We do not support the emergency flow cache.  It will hopefully get
          * dropped from OpenFlow in the near future.  There is no good error
          * code, so just state that the flow table is full. */
index 258115ec55fa54e5c0832762c1e43232cad83dde..00ba06b18f05f45476a5374f12e70a567d82b9fa 100644 (file)
@@ -1843,7 +1843,7 @@ read_flows_from_file(const char *filename, struct classifier *cls, int index)
         version->cookie = fm.new_cookie;
         version->idle_timeout = fm.idle_timeout;
         version->hard_timeout = fm.hard_timeout;
-        version->flags = fm.flags & (OFPFF_SEND_FLOW_REM | OFPFF_EMERG);
+        version->flags = fm.flags & (OFPFF_SEND_FLOW_REM | OFPFF10_EMERG);
         version->ofpacts = fm.ofpacts;
         version->ofpacts_len = fm.ofpacts_len;
 
@@ -1868,8 +1868,8 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 send_xid,
     struct ofpbuf *reply = *replyp;
 
     for (;;) {
-        ovs_be16 flags;
         int retval;
+        bool more;
 
         /* Get a flow stats reply message, if we don't already have one. */
         if (!reply) {
@@ -1897,10 +1897,10 @@ recv_flow_stats_reply(struct vconn *vconn, ovs_be32 send_xid,
             return true;
 
         case EOF:
-            flags = ((const struct ofp_stats_msg *) reply->l2)->flags;
+            more = ofpmp_more(reply->l2);
             ofpbuf_delete(reply);
             reply = NULL;
-            if (!(flags & htons(OFPSF_REPLY_MORE))) {
+            if (!more) {
                 *replyp = NULL;
                 return false;
             }