--- openflow-2012-07-02.h	2015-07-23 09:54:17.172479363 -0700
+++ openflow-2012-06-21.h	2015-07-23 09:54:17.176479363 -0700
@@ -166,11 +166,41 @@
 };
 OFP_ASSERT(sizeof(struct ofp_header) == 8);
 
-/* OFPT_HELLO.  This message has an empty body, but implementations must
- * ignore any data included in the body, to allow for future extensions. */
+/* Hello elements types.
+ */
+enum ofp_hello_elem_type {
+    OFPHET_VERSIONBITMAP          = 1,  /* Bitmap of version supported. */
+};
+
+/* Common header for all Hello Elements */
+struct ofp_hello_elem_header {
+    uint16_t         type;    /* One of OFPHET_*. */
+    uint16_t         length;  /* Length in bytes of this element. */
+};
+OFP_ASSERT(sizeof(struct ofp_hello_elem_header) == 4);
+
+/* Version bitmap Hello Element */
+struct ofp_hello_elem_versionbitmap {
+    uint16_t         type;    /* OFPHET_VERSIONBITMAP. */
+    uint16_t         length;  /* Length in bytes of this element. */
+    /* Followed by:
+     *   - Exactly (length - 4) bytes containing the bitmaps, then
+     *   - Exactly (length + 7)/8*8 - (length) (between 0 and 7)
+     *     bytes of all-zero bytes */
+    uint32_t         bitmaps[0];   /* List of bitmaps - supported versions */
+};
+OFP_ASSERT(sizeof(struct ofp_hello_elem_versionbitmap) == 4);
+
+/* OFPT_HELLO.  This message includes zero or more hello elements having
+ * variable size. Unknown elements types must be ignored/skipped, to allow
+ * for future extensions. */
 struct ofp_hello {
     struct ofp_header header;
+
+    /* Hello element list */
+    struct ofp_hello_elem_header elements[0];
 };
+OFP_ASSERT(sizeof(struct ofp_hello) == 8);
 
 #define OFP_DEFAULT_MISS_SEND_LEN   128
 
