--- openflow-2011-10-13.h	2015-07-23 09:54:16.704479344 -0700
+++ openflow-2011-10-07.h	2015-07-23 09:54:16.708479344 -0700
@@ -1119,17 +1119,21 @@
 struct ofp_packet_in {
     struct ofp_header header;
     uint32_t buffer_id;     /* ID assigned by datapath. */
-    uint32_t in_port;       /* Port on which frame was received. */
     uint32_t in_phy_port;   /* Physical Port on which frame was received. */
     uint16_t total_len;     /* Full length of frame. */
+    uint16_t match_type;    /* OFPMT_OXM. */
+    uint16_t match_len;     /* Length of OXM TLVs. */
     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,
-                               so the IP header is 32-bit aligned.  The
-                               amount of data is inferred from the length
-                               field in the header.  Because of padding,
-                               offsetof(struct ofp_packet_in, data) ==
-                               sizeof(struct ofp_packet_in) - 2. */
+    /* Followed by:
+     *   - Exactly match_len bytes containing OXM TLVs, then
+     *   - Exactly (match_len + 7)/8*8 - match_len (between 0 and 7) bytes of
+     *     all-zero bytes, then
+     *   - Exactly 2 all-zero padding bytes, then
+     *   - An Ethernet frame whose length is inferred from header.length.
+     * The padding bytes preceding the Ethernet frame ensure that the IP
+     * header (if any) following the Ethernet header is 32-bit aligned.
+     */
 };
 OFP_ASSERT(sizeof(struct ofp_packet_in) == 24);
 
