[ovs-dev] [PATCH] include/openflow: Moved remaining common definitions from openflow-1.0.h

Jarno Rajahalme jarno.rajahalme at nsn.com
Mon Dec 3 10:37:56 UTC 2012


 Moved remaining common definitions from openflow-1.0.h to
 openflow-common.h and renamed 1.0 specific definitions with
 the "10" infix. Added hstamp rules for new headers, fixed
 non-ASCII characters in openflow-1.3.h, Commented out
 trailing zero-length data members.


Signed-off-by: Jarno Rajahalme <jarno.rajahalme at nsn.com>
---
 build-aux/check-structs            |    2 +-
 include/openflow/automake.mk       |   22 ++++++--
 include/openflow/openflow-1.0.h    |  107 +++---------------------------------
 include/openflow/openflow-1.1.h    |    2 +-
 include/openflow/openflow-1.3.h    |   24 ++++----
 include/openflow/openflow-common.h |   92 +++++++++++++++++++++++++++++++
 lib/ofp-actions.c                  |    6 +-
 lib/ofp-msgs.h                     |    8 +--
 lib/ofp-util.c                     |   18 +++---
 lib/ofp-util.def                   |    2 +-
 ofproto/ofproto.c                  |    4 +-
 ofproto/pktbuf.c                   |    4 +-
 12 files changed, 153 insertions(+), 138 deletions(-)

diff --git a/build-aux/check-structs b/build-aux/check-structs
index e50e310..0428abf 100755
--- a/build-aux/check-structs
+++ b/build-aux/check-structs
@@ -190,7 +190,7 @@ def parseStruct():
         forceMatch(';')
     if size % alignment:
         shortage = alignment - (size % alignment)
-        if (structName == "struct ofp_packet_in" and
+        if (structName == "struct ofp10_packet_in" and
             shortage == 2 and
             memberName == 'data' and
             count == 0):
diff --git a/include/openflow/automake.mk b/include/openflow/automake.mk
index f891086..76a8f06 100644
--- a/include/openflow/automake.mk
+++ b/include/openflow/automake.mk
@@ -15,23 +15,35 @@ SUFFIXES += .h .hstamp
 	touch $@
 
 HSTAMP_FILES = \
-	include/openflow/nicira.hstamp \
+	include/openflow/nicira-ext.hstamp \
 	include/openflow/openflow-1.0.hstamp \
 	include/openflow/openflow-1.1.hstamp \
 	include/openflow/openflow-1.2.hstamp \
+	include/openflow/openflow-1.3.hstamp \
+	include/openflow/openflow-common.hstamp \
 	include/openflow/openflow.hstamp
 CLEANFILES += $(HSTAMP_FILES)
 ALL_LOCAL += $(HSTAMP_FILES)
 $(HSTAMP_FILES): build-aux/check-structs
 
-include/openflow/openflow-1.0.hstamp: include/openflow/openflow-common.h
-include/openflow/openflow-1.1.hstamp: include/openflow/openflow-common.h
+include/openflow/openflow-1.0.hstamp: \
+	include/openflow/openflow-common.h
+include/openflow/openflow-1.1.hstamp: \
+	include/openflow/openflow-common.h
+include/openflow/openflow-1.2.hstamp: \
+	include/openflow/openflow-common.h \
+	include/openflow/openflow-1.1.h
+include/openflow/openflow-1.3.hstamp: \
+	include/openflow/openflow-common.h \
+	include/openflow/openflow-1.1.h \
+	include/openflow/openflow-1.2.h
 include/openflow/nicira-ext.hstamp: \
+	include/openflow/openflow.h \
+	include/openflow/openflow-common.h \
 	include/openflow/openflow-1.0.h \
 	include/openflow/openflow-1.1.h \
 	include/openflow/openflow-1.2.h \
-	include/openflow/openflow-common.h \
-	include/openflow/openflow.h
+	include/openflow/openflow-1.3.h
 endif
 
 EXTRA_DIST += build-aux/check-structs
diff --git a/include/openflow/openflow-1.0.h b/include/openflow/openflow-1.0.h
index ae1e1b8..c30fa92 100644
--- a/include/openflow/openflow-1.0.h
+++ b/include/openflow/openflow-1.0.h
@@ -51,31 +51,6 @@ enum ofp_port {
     OFPP_NONE       = 0xffff   /* Not associated with a physical port. */
 };
 
-#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0,  /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1,  /* Drop fragments. */
-    OFPC_FRAG_REASM    = 2,  /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_NX_MATCH = 3,  /* Make first fragments available for matching. */
-    OFPC_FRAG_MASK     = 3,
-
-    /* OFPC_INVALID_TTL_TO_CONTROLLER is deprecated in OpenFlow 1.3 */
-
-    /* TTL processing - applicable for IP and MPLS packets. */
-    OFPC_INVALID_TTL_TO_CONTROLLER = 1 << 2, /* Send packets with invalid TTL
-                                                to the controller. */
-};
-
-/* Switch configuration. */
-struct ofp_switch_config {
-    ovs_be16 flags;             /* OFPC_* flags. */
-    ovs_be16 miss_send_len;     /* Max bytes of new flow that datapath should
-                                   send to the controller. */
-};
-OFP_ASSERT(sizeof(struct ofp_switch_config) == 4);
-
 /* OpenFlow 1.0 specific capabilities supported by the datapath (struct
  * ofp_switch_features, member capabilities). */
 enum ofp10_capabilities {
@@ -177,7 +152,7 @@ struct ofp10_queue_get_config_reply {
 OFP_ASSERT(sizeof(struct ofp10_queue_get_config_reply) == 8);
 
 /* Packet received on port (datapath -> controller). */
-struct ofp_packet_in {
+struct ofp10_packet_in {
     ovs_be32 buffer_id;     /* ID assigned by datapath. */
     ovs_be16 total_len;     /* Full length of frame. */
     ovs_be16 in_port;       /* Port on which frame was received. */
@@ -190,7 +165,7 @@ struct ofp_packet_in {
                                offsetof(struct ofp_packet_in, data) ==
                                sizeof(struct ofp_packet_in) - 2. */
 };
-OFP_ASSERT(sizeof(struct ofp_packet_in) == 12);
+OFP_ASSERT(sizeof(struct ofp10_packet_in) == 12);
 
 enum ofp10_action_type {
     OFPAT10_OUTPUT,             /* Output to switch port. */
@@ -220,30 +195,8 @@ struct ofp10_action_output {
 };
 OFP_ASSERT(sizeof(struct ofp10_action_output) == 8);
 
-/* Action header for OFPAT10_VENDOR. The rest of the body is vendor-defined. */
-struct ofp_action_vendor_header {
-    ovs_be16 type;                  /* OFPAT10_VENDOR. */
-    ovs_be16 len;                   /* Length is a multiple of 8. */
-    ovs_be32 vendor;                /* Vendor ID, which takes the same form
-                                       as in "struct ofp_vendor_header". */
-};
-OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8);
-
-/* Action header that is common to all actions.  The length includes the
- * header and any padding used to make the action 64-bit aligned.
- * NB: The length of an action *must* always be a multiple of eight. */
-struct ofp_action_header {
-    ovs_be16 type;                  /* One of OFPAT10_*. */
-    ovs_be16 len;                   /* Length of action, including this
-                                       header.  This is the length of action,
-                                       including any padding to make it
-                                       64-bit aligned. */
-    uint8_t pad[4];
-};
-OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
-
 /* OFPAT10_ENQUEUE action struct: send packets to given queue on port. */
-struct ofp_action_enqueue {
+struct ofp10_action_enqueue {
     ovs_be16 type;            /* OFPAT10_ENQUEUE. */
     ovs_be16 len;             /* Len is 16. */
     ovs_be16 port;            /* Port that queue belongs. Should
@@ -252,7 +205,7 @@ struct ofp_action_enqueue {
     uint8_t pad[6];           /* Pad for 64-bit alignment. */
     ovs_be32 queue_id;        /* Where to enqueue the packets. */
 };
-OFP_ASSERT(sizeof(struct ofp_action_enqueue) == 16);
+OFP_ASSERT(sizeof(struct ofp10_action_enqueue) == 16);
 
 union ofp_action {
     ovs_be16 type;
@@ -268,7 +221,7 @@ union ofp_action {
 OFP_ASSERT(sizeof(union ofp_action) == 8);
 
 /* Send packet (controller -> datapath). */
-struct ofp_packet_out {
+struct ofp10_packet_out {
     ovs_be32 buffer_id;           /* ID assigned by datapath or UINT32_MAX. */
     ovs_be16 in_port;             /* Packet's input port (OFPP_NONE if none). */
     ovs_be16 actions_len;         /* Size of action array in bytes. */
@@ -279,10 +232,10 @@ struct ofp_packet_out {
      *     of the message length.
      */
 };
-OFP_ASSERT(sizeof(struct ofp_packet_out) == 8);
+OFP_ASSERT(sizeof(struct ofp10_packet_out) == 8);
 
 /* Flow wildcards. */
-enum ofp_flow_wildcards {
+enum ofp10_flow_wildcards {
     OFPFW10_IN_PORT    = 1 << 0,  /* Switch input port. */
     OFPFW10_DL_VLAN    = 1 << 1,  /* VLAN vid. */
     OFPFW10_DL_SRC     = 1 << 2,  /* Ethernet source address. */
@@ -321,17 +274,6 @@ enum ofp_flow_wildcards {
 #define OFPFW10_ICMP_TYPE OFPFW10_TP_SRC
 #define OFPFW10_ICMP_CODE OFPFW10_TP_DST
 
-/* Values below this cutoff are 802.3 packets and the two bytes
- * following MAC addresses are used as a frame length.  Otherwise, the
- * two bytes are used as the Ethernet type.
- */
-#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
-
-/* Value of dl_type to indicate that the frame does not include an
- * Ethernet type.
- */
-#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
-
 /* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
  * special conditions.  All ones indicates that 802.1Q header is not present.
  */
@@ -358,13 +300,6 @@ struct ofp10_match {
 };
 OFP_ASSERT(sizeof(struct ofp10_match) == 40);
 
-/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
- * is permanent. */
-#define OFP_FLOW_PERMANENT 0
-
-/* By default, choose a priority in the middle. */
-#define OFP_DEFAULT_PRIORITY 0x8000
-
 enum ofp10_flow_mod_flags {
     OFPFF10_EMERG       = 1 << 2   /* Ramark this is for emergency. */
 };
@@ -393,7 +328,7 @@ struct ofp10_flow_mod {
 OFP_ASSERT(sizeof(struct ofp10_flow_mod) == 64);
 
 /* Flow removed (datapath -> controller). */
-struct ofp_flow_removed {
+struct ofp10_flow_removed {
     struct ofp10_match match; /* Description of fields. */
     ovs_be64 cookie;          /* Opaque controller-issued identifier. */
 
@@ -409,16 +344,7 @@ struct ofp_flow_removed {
     ovs_be64 packet_count;
     ovs_be64 byte_count;
 };
-OFP_ASSERT(sizeof(struct ofp_flow_removed) == 80);
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-struct ofp_error_msg {
-    ovs_be16 type;
-    ovs_be16 code;
-    uint8_t data[0];          /* Variable-length data.  Interpreted based
-                                 on the type and code. */
-};
-OFP_ASSERT(sizeof(struct ofp_error_msg) == 4);
+OFP_ASSERT(sizeof(struct ofp10_flow_removed) == 80);
 
 /* Statistics request or reply message. */
 struct ofp10_stats_msg {
@@ -429,10 +355,6 @@ struct ofp10_stats_msg {
 };
 OFP_ASSERT(sizeof(struct ofp10_stats_msg) == 12);
 
-enum ofp_stats_reply_flags {
-    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
-};
-
 /* Stats request of type OFPST_AGGREGATE or OFPST_FLOW. */
 struct ofp10_flow_stats_request {
     struct ofp10_match match; /* Fields to match. */
@@ -548,15 +470,4 @@ struct ofp10_vendor_stats_msg {
 };
 OFP_ASSERT(sizeof(struct ofp10_vendor_stats_msg) == 16);
 
-/* Vendor extension. */
-struct ofp_vendor_header {
-    struct ofp_header header;   /* Type OFPT_VENDOR. */
-    ovs_be32 vendor;            /* Vendor ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by OpenFlow
-                                 *   consortium. */
-    /* Vendor-defined arbitrary additional data. */
-};
-OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12);
-
 #endif /* openflow/openflow-1.0.h */
diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h
index 9b2f754..8dfd795 100644
--- a/include/openflow/openflow-1.1.h
+++ b/include/openflow/openflow-1.1.h
@@ -753,7 +753,7 @@ struct ofp11_packet_in {
     ovs_be16 total_len;     /* Full length of frame. */
     uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */
     uint8_t table_id;       /* ID of the table that was looked up */
-    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,
+    /* uint8_t data[0];        Ethernet frame, halfway through 32-bit word,
                                so the IP header is 32-bit aligned. The
                                amount of data is inferred from the length
                                field in the header. Because of padding,
diff --git a/include/openflow/openflow-1.3.h b/include/openflow/openflow-1.3.h
index 61c4598..b7b877c 100644
--- a/include/openflow/openflow-1.3.h
+++ b/include/openflow/openflow-1.3.h
@@ -119,8 +119,8 @@ enum ofp13_table_config {
 /* OpenFlow 1.3 specific flags
  * (struct ofp12_flow_mod, member flags). */
 enum ofp13_flow_mod_flags {
-    OFPFF13_NO_PKT_COUNTS = 1 << 3, /* Don’t keep track of packet count. */
-    OFPFF13_NO_BYT_COUNTS = 1 << 4  /* Don’t keep track of byte count. */
+    OFPFF13_NO_PKT_COUNTS = 1 << 3, /* Don't keep track of packet count. */
+    OFPFF13_NO_BYT_COUNTS = 1 << 4  /* Don't keep track of byte count. */
 };
 
 /* Common header for all meter bands */
@@ -137,7 +137,7 @@ struct ofp13_meter_mod {
     ovs_be16          command;      /* One of OFPMC_*. */
     ovs_be16          flags;        /* Set of OFPMF_*. */
     ovs_be32          meter_id;     /* Meter instance. */
-    struct ofp13_meter_band_header bands[0];  /* The bands length is inferred
+    /* struct ofp13_meter_band_header bands[0];  The bands length is inferred
                                                  from the length field in the
                                                  header. */
 };
@@ -246,7 +246,7 @@ struct ofp13_table_features {
     ovs_be32 max_entries;     /* Max number of entries supported. */
 
     /* Table Feature Property list */
-    struct ofp13_table_feature_prop_header properties[0];
+    /* struct ofp13_table_feature_prop_header properties[0]; */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_features) == 64);
 
@@ -281,8 +281,8 @@ struct ofp13_table_feature_prop_instructions {
      *   - Exactly (length - 4) bytes containing the instruction ids, then
      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
-    struct ofp11_instruction instruction_ids[0]; /* List of instructions
-                                                    without any data */
+    /* struct ofp11_instruction instruction_ids[0];  List of instructions
+                                                     without any data */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_instructions) == 4);
 
@@ -295,7 +295,7 @@ struct ofp13_table_feature_prop_next_tables {
      *   - Exactly (length - 4) bytes containing the table_ids, then
      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
-    uint8_t     next_table_ids[0];
+    /* uint8_t     next_table_ids[0]; */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_next_tables) == 4);
 
@@ -310,7 +310,7 @@ struct ofp13_table_feature_prop_actions {
      *   - Exactly (length - 4) bytes containing the action_ids, then
      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
-    struct ofp_action_header action_ids[0];     /* List of actions
+    /* struct ofp_action_header action_ids[0];     List of actions
                                                    without any data */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_actions) == 4);
@@ -328,7 +328,7 @@ struct ofp13_table_feature_prop_oxm {
      *   - Exactly (length - 4) bytes containing the oxm_ids, then
      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
-    ovs_be32    oxm_ids[0];     /* Array of OXM headers */
+    /* ovs_be32    oxm_ids[0];     Array of OXM headers */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_oxm) == 4);
 
@@ -344,7 +344,7 @@ struct ofp13_table_feature_prop_experimenter {
      *   - Exactly (length - 12) bytes containing the experimenter data, then
      *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
      *     bytes of all-zero bytes */
-    ovs_be32    experimenter_data[0];
+    /* ovs_be32    experimenter_data[0]; */
 };
 OFP_ASSERT(sizeof(struct ofp13_table_feature_prop_experimenter) == 12);
 
@@ -402,7 +402,7 @@ struct ofp13_meter_stats {
     ovs_be32  duration_sec;      /* Time meter has been alive in seconds. */
     ovs_be32  duration_nsec;     /* Time meter has been alive in nanoseconds
                                     beyond duration_sec. */
-    struct ofp13_meter_band_stats band_stats[0]; /* The band_stats length is
+    /* struct ofp13_meter_band_stats band_stats[0];  The band_stats length is
                                              inferred from the length field. */
 };
 OFP_ASSERT(sizeof(struct ofp13_meter_stats) == 40);
@@ -412,7 +412,7 @@ struct ofp13_meter_config {
     ovs_be16          length;       /* Length of this entry. */
     ovs_be16          flags;        /* Set of OFPMC_* that apply. */
     ovs_be32          meter_id;     /* Meter instance. */
-    struct ofp13_meter_band_header bands[0];  /* The bands length is inferred
+    /* struct ofp13_meter_band_header bands[0];   The bands length is inferred
                                                from the length field. */
 };
 OFP_ASSERT(sizeof(struct ofp13_meter_config) == 8);
diff --git a/include/openflow/openflow-common.h b/include/openflow/openflow-common.h
index d216f0e..3cc22c9 100644
--- a/include/openflow/openflow-common.h
+++ b/include/openflow/openflow-common.h
@@ -86,6 +86,27 @@ enum ofp_version {
 
 #define OFP_ETH_ALEN 6          /* Bytes in an Ethernet address. */
 
+#define OFP_DEFAULT_MISS_SEND_LEN   128
+
+/* Values below this cutoff are 802.3 packets and the two bytes
+ * following MAC addresses are used as a frame length.  Otherwise, the
+ * two bytes are used as the Ethernet type.
+ */
+#define OFP_DL_TYPE_ETH2_CUTOFF   0x0600
+
+/* Value of dl_type to indicate that the frame does not include an
+ * Ethernet type.
+ */
+#define OFP_DL_TYPE_NOT_ETH_TYPE  0x05ff
+
+/* Value used in "idle_timeout" and "hard_timeout" to indicate that the entry
+ * is permanent. */
+#define OFP_FLOW_PERMANENT 0
+
+/* By default, choose a priority in the middle. */
+#define OFP_DEFAULT_PRIORITY 0x8000
+
+
 /* Header on all OpenFlow packets. */
 struct ofp_header {
     uint8_t version;    /* An OpenFlow version number, e.g. OFP10_VERSION. */
@@ -97,6 +118,39 @@ struct ofp_header {
 };
 OFP_ASSERT(sizeof(struct ofp_header) == 8);
 
+/* OFPT_ERROR: Error message (datapath -> controller). */
+struct ofp_error_msg {
+    ovs_be16 type;
+    ovs_be16 code;
+    uint8_t data[0];          /* Variable-length data.  Interpreted based
+                                 on the type and code. */
+};
+OFP_ASSERT(sizeof(struct ofp_error_msg) == 4);
+
+enum ofp_config_flags {
+    /* Handling of IP fragments. */
+    OFPC_FRAG_NORMAL   = 0,  /* No special handling for fragments. */
+    OFPC_FRAG_DROP     = 1,  /* Drop fragments. */
+    OFPC_FRAG_REASM    = 2,  /* Reassemble (only if OFPC_IP_REASM set). */
+    OFPC_FRAG_NX_MATCH = 3,  /* Make first fragments available for matching. */
+    OFPC_FRAG_MASK     = 3,
+
+    /* OFPC_INVALID_TTL_TO_CONTROLLER is deprecated in OpenFlow 1.3 */
+
+    /* TTL processing - applicable for IP and MPLS packets. */
+    OFPC_INVALID_TTL_TO_CONTROLLER = 1 << 2, /* Send packets with invalid TTL
+                                                to the controller. */
+};
+
+/* Switch configuration. */
+struct ofp_switch_config {
+    ovs_be16 flags;             /* OFPC_* flags. */
+    ovs_be16 miss_send_len;     /* Max bytes of new flow that datapath should
+                                   send to the controller. */
+};
+OFP_ASSERT(sizeof(struct ofp_switch_config) == 4);
+
+
 /* Common flags to indicate behavior of the physical port.  These flags are
  * used in ofp_port to describe the current configuration.  They are used in
  * the ofp_port_mod message to configure the port's behavior.
@@ -215,6 +269,29 @@ enum ofp_flow_mod_flags {
     OFPFF_CHECK_OVERLAP = 1 << 1,  /* Check for overlapping entries first. */
 };
 
+/* Action header for OFPAT10_VENDOR and OFPAT11_EXPERIMEMNTER.
+ * The rest of the body is vendor-defined. */
+struct ofp_action_vendor_header {
+    ovs_be16 type;                  /* OFPAT10_VENDOR. */
+    ovs_be16 len;                   /* Length is a multiple of 8. */
+    ovs_be32 vendor;                /* Vendor ID, which takes the same form
+                                       as in "struct ofp_vendor_header". */
+};
+OFP_ASSERT(sizeof(struct ofp_action_vendor_header) == 8);
+
+/* Action header that is common to all actions.  The length includes the
+ * header and any padding used to make the action 64-bit aligned.
+ * NB: The length of an action *must* always be a multiple of eight. */
+struct ofp_action_header {
+    ovs_be16 type;                  /* One of OFPAT10_*. */
+    ovs_be16 len;                   /* Length of action, including this
+                                       header.  This is the length of action,
+                                       including any padding to make it
+                                       64-bit aligned. */
+    uint8_t pad[4];
+};
+OFP_ASSERT(sizeof(struct ofp_action_header) == 8);
+
 /* Action structure for OFPAT10_SET_VLAN_VID and OFPAT11_SET_VLAN_VID. */
 struct ofp_action_vlan_vid {
     ovs_be16 type;                  /* Type. */
@@ -292,6 +369,10 @@ struct ofp_port_status {
 };
 OFP_ASSERT(sizeof(struct ofp_port_status) == 8);
 
+enum ofp_stats_reply_flags {
+    OFPSF_REPLY_MORE  = 1 << 0  /* More replies to follow. */
+};
+
 #define DESC_STR_LEN   256
 #define SERIAL_NUM_LEN 32
 /* Body of reply to OFPST_DESC request.  Each entry is a NULL-terminated ASCII
@@ -349,4 +430,15 @@ struct ofp_hello_elem_header {
 };
 OFP_ASSERT(sizeof(struct ofp_hello_elem_header) == 4);
 
+/* Vendor extension. */
+struct ofp_vendor_header {
+    struct ofp_header header;   /* Type OFPT_VENDOR or OFPT_EXPERIMENTER. */
+    ovs_be32 vendor;            /* Vendor ID:
+                                 * - MSB 0: low-order bytes are IEEE OUI.
+                                 * - MSB != 0: defined by OpenFlow
+                                 *   consortium. */
+    /* Vendor-defined arbitrary additional data. */
+};
+OFP_ASSERT(sizeof(struct ofp_vendor_header) == 12);
+
 #endif /* openflow/openflow-common.h */
diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index 564e420..9c458a9 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -49,7 +49,7 @@ output_from_openflow10(const struct ofp10_action_output *oao,
 }
 
 static enum ofperr
-enqueue_from_openflow10(const struct ofp_action_enqueue *oae,
+enqueue_from_openflow10(const struct ofp10_action_enqueue *oae,
                         struct ofpbuf *out)
 {
     struct ofpact_enqueue *enqueue;
@@ -479,7 +479,7 @@ ofpact_from_openflow10(const union ofp_action *a, struct ofpbuf *out)
         break;
 
     case OFPUTIL_OFPAT10_ENQUEUE:
-        error = enqueue_from_openflow10((const struct ofp_action_enqueue *) a,
+        error = enqueue_from_openflow10((const struct ofp10_action_enqueue *) a,
                                         out);
         break;
 
@@ -1404,7 +1404,7 @@ static void
 ofpact_enqueue_to_openflow10(const struct ofpact_enqueue *enqueue,
                              struct ofpbuf *out)
 {
-    struct ofp_action_enqueue *oae;
+    struct ofp10_action_enqueue *oae;
 
     oae = ofputil_put_OFPAT10_ENQUEUE(out);
     oae->port = htons(enqueue->port);
diff --git a/lib/ofp-msgs.h b/lib/ofp-msgs.h
index 496d120..8d28ce3 100644
--- a/lib/ofp-msgs.h
+++ b/lib/ofp-msgs.h
@@ -142,9 +142,9 @@ enum ofpraw {
     /* OFPT 1.0+ (9): struct ofp_switch_config. */
     OFPRAW_OFPT_SET_CONFIG,
 
-    /* OFPT 1.0 (10): struct ofp_packet_in up to data, uint8_t[]. */
+    /* OFPT 1.0 (10): struct ofp10_packet_in up to data, uint8_t[]. */
     OFPRAW_OFPT10_PACKET_IN,
-    /* OFPT 1.1 (10): struct ofp11_packet_in up to data, uint8_t[]. */
+    /* OFPT 1.1 (10): struct ofp11_packet_in, uint8_t[]. */
     OFPRAW_OFPT11_PACKET_IN,
     /* OFPT 1.2 (10): struct ofp12_packet_in, uint8_t[]. */
     OFPRAW_OFPT12_PACKET_IN,
@@ -153,7 +153,7 @@ enum ofpraw {
     /* NXT 1.0+ (17): struct nx_packet_in, uint8_t[]. */
     OFPRAW_NXT_PACKET_IN,
 
-    /* OFPT 1.0 (11): struct ofp_flow_removed. */
+    /* OFPT 1.0 (11): struct ofp10_flow_removed. */
     OFPRAW_OFPT10_FLOW_REMOVED,
     /* OFPT 1.1+ (11): struct ofp11_flow_removed, uint8_t[8][]. */
     OFPRAW_OFPT11_FLOW_REMOVED,
@@ -165,7 +165,7 @@ enum ofpraw {
     /* OFPT 1.1+ (12): struct ofp_port_status, struct ofp11_port. */
     OFPRAW_OFPT11_PORT_STATUS,
 
-    /* OFPT 1.0 (13): struct ofp_packet_out, uint8_t[]. */
+    /* OFPT 1.0 (13): struct ofp10_packet_out, uint8_t[]. */
     OFPRAW_OFPT10_PACKET_OUT,
     /* OFPT 1.1+ (13): struct ofp11_packet_out, uint8_t[]. */
     OFPRAW_OFPT11_PACKET_OUT,
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 49cbe2d..320bfde 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2288,7 +2288,7 @@ ofputil_decode_flow_removed(struct ofputil_flow_removed *fr,
         fr->packet_count = ntohll(ofr->packet_count);
         fr->byte_count = ntohll(ofr->byte_count);
     } else if (raw == OFPRAW_OFPT10_FLOW_REMOVED) {
-        const struct ofp_flow_removed *ofr;
+        const struct ofp10_flow_removed *ofr;
 
         ofr = ofpbuf_pull(&b, sizeof *ofr);
 
@@ -2368,7 +2368,7 @@ ofputil_encode_flow_removed(const struct ofputil_flow_removed *fr,
 
     case OFPUTIL_P_OF10_STD:
     case OFPUTIL_P_OF10_STD_TID: {
-        struct ofp_flow_removed *ofr;
+        struct ofp10_flow_removed *ofr;
 
         msg = ofpraw_alloc_xid(OFPRAW_OFPT10_FLOW_REMOVED, OFP10_VERSION,
                                htonl(0), 0);
@@ -2472,9 +2472,9 @@ ofputil_decode_packet_in(struct ofputil_packet_in *pin,
 
         ofputil_decode_packet_in_finish(pin, &match, &b);
     } else if (raw == OFPRAW_OFPT10_PACKET_IN) {
-        const struct ofp_packet_in *opi;
+        const struct ofp10_packet_in *opi;
 
-        opi = ofpbuf_pull(&b, offsetof(struct ofp_packet_in, data));
+        opi = ofpbuf_pull(&b, offsetof(struct ofp10_packet_in, data));
 
         pin->packet = opi->data;
         pin->packet_len = b.size;
@@ -2585,11 +2585,11 @@ ofputil_encode_packet_in(const struct ofputil_packet_in *pin,
             opi->cookie = pin->cookie;
         }
     } else if (packet_in_format == NXPIF_OPENFLOW10) {
-        struct ofp_packet_in *opi;
+        struct ofp10_packet_in *opi;
 
         packet = ofpraw_alloc_xid(OFPRAW_OFPT10_PACKET_IN, OFP10_VERSION,
                                   htonl(0), send_len);
-        opi = ofpbuf_put_zeros(packet, offsetof(struct ofp_packet_in, data));
+        opi = ofpbuf_put_zeros(packet, offsetof(struct ofp10_packet_in, data));
         opi->total_len = htons(pin->total_len);
         opi->in_port = htons(pin->fmd.in_port);
         opi->reason = pin->reason;
@@ -2698,7 +2698,7 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,
         }
     } else if (raw == OFPRAW_OFPT10_PACKET_OUT) {
         enum ofperr error;
-        const struct ofp_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
+        const struct ofp10_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
 
         po->buffer_id = ntohl(opo->buffer_id);
         po->in_port = ntohs(opo->in_port);
@@ -3353,7 +3353,7 @@ ofputil_put_ofp10_table_stats(const struct ofp12_table_stats *in,
                               struct ofpbuf *buf)
 {
     struct wc_map {
-        enum ofp_flow_wildcards wc10;
+        enum ofp10_flow_wildcards wc10;
         enum oxm12_ofb_match_fields mf12;
     };
 
@@ -3778,7 +3778,7 @@ ofputil_encode_packet_out(const struct ofputil_packet_out *po,
 
     switch (ofp_version) {
     case OFP10_VERSION: {
-        struct ofp_packet_out *opo;
+        struct ofp10_packet_out *opo;
         size_t actions_ofs;
 
         msg = ofpraw_alloc(OFPRAW_OFPT10_PACKET_OUT, OFP10_VERSION, size);
diff --git a/lib/ofp-util.def b/lib/ofp-util.def
index 421adb1..6d08d8a 100644
--- a/lib/ofp-util.def
+++ b/lib/ofp-util.def
@@ -14,7 +14,7 @@ OFPAT10_ACTION(OFPAT10_SET_NW_DST,   ofp_action_nw_addr,  "mod_nw_dst")
 OFPAT10_ACTION(OFPAT10_SET_NW_TOS,   ofp_action_nw_tos,   "mod_nw_tos")
 OFPAT10_ACTION(OFPAT10_SET_TP_SRC,   ofp_action_tp_port,  "mod_tp_src")
 OFPAT10_ACTION(OFPAT10_SET_TP_DST,   ofp_action_tp_port,  "mod_tp_dst")
-OFPAT10_ACTION(OFPAT10_ENQUEUE,      ofp_action_enqueue,  "enqueue")
+OFPAT10_ACTION(OFPAT10_ENQUEUE,      ofp10_action_enqueue,  "enqueue")
 
 #ifndef OFPAT11_ACTION
 #define OFPAT11_ACTION(ENUM, STRUCT, EXTENSIBLE, NAME)
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index bc3eb54..1130eb7 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -2158,7 +2158,7 @@ ofoperation_has_out_port(const struct ofoperation *op, uint16_t out_port)
 
 /* Executes the actions indicated by 'rule' on 'packet' and credits 'rule''s
  * statistics appropriately.  'packet' must have at least sizeof(struct
- * ofp_packet_in) bytes of headroom.
+ * ofp10_packet_in) bytes of headroom.
  *
  * 'packet' doesn't necessarily have to match 'rule'.  'rule' will be credited
  * with statistics for 'packet' either way.
@@ -2169,7 +2169,7 @@ rule_execute(struct rule *rule, uint16_t in_port, struct ofpbuf *packet)
 {
     struct flow flow;
 
-    assert(ofpbuf_headroom(packet) >= sizeof(struct ofp_packet_in));
+    assert(ofpbuf_headroom(packet) >= sizeof(struct ofp10_packet_in));
 
     flow_extract(packet, 0, 0, NULL, in_port, &flow);
     return rule->ofproto->ofproto_class->rule_execute(rule, &flow, packet);
diff --git a/ofproto/pktbuf.c b/ofproto/pktbuf.c
index 71be34a..902b19d 100644
--- a/ofproto/pktbuf.c
+++ b/ofproto/pktbuf.c
@@ -120,7 +120,7 @@ pktbuf_save(struct pktbuf *pb, const void *buffer, size_t buffer_size,
         p->cookie = 0;
     }
     p->buffer = ofpbuf_clone_data_with_headroom(buffer, buffer_size,
-                                                sizeof(struct ofp_packet_in));
+                                                sizeof(struct ofp10_packet_in));
 
 
     p->timeout = time_msec() + OVERWRITE_MSECS;
@@ -165,7 +165,7 @@ pktbuf_get_null(void)
  *
  * 'in_port' may be NULL if the input port is not of interest.
  *
- * A returned packet will have at least sizeof(struct ofp_packet_in) bytes of
+ * A returned packet will have at least sizeof(struct ofp10_packet_in) bytes of
  * headroom.
  *
  * On failure, stores NULL in in '*bufferp' and UINT16_MAX in '*in_port'. */
-- 
1.7.10.4




More information about the dev mailing list