OF1.0 spec says OFP_ASSERT(sizeof(struct ofp_packet_in) == 20).
It's quite bogus as it assumes a specific class of C implementations.
(well, if it was C.  it's unclear from the spec itself.)
We just use the real size of the structure as this is not C.  This
agrees with on-wire messages OpenFlow Reference Release and Open vSwitch
produce.

This should fix a crash Chen Chen reported on ryu-devel recently.

Signed-off-by: YAMAMOTO Takashi <[email protected]>
---
 ryu/ofproto/ofproto_v1_0.py        | 11 ++++++++---
 ryu/ofproto/ofproto_v1_0_parser.py |  2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
index b47d0a1..777a165 100644
--- a/ryu/ofproto/ofproto_v1_0.py
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -164,9 +164,14 @@ assert calcsize(OFP_PORT_MOD_PACK_STR) + OFP_HEADER_SIZE 
== OFP_PORT_MOD_SIZE
 OFPR_NO_MATCH = 0       # No matching flow.
 OFPR_ACTION = 1         # Action explicitly output to controller.
 
-OFP_PACKET_IN_PACK_STR = '!IHHBx2x'  # the last 2x is for ofp_packet_in::data
-OFP_PACKET_IN_SIZE = 20
-OFP_PACKET_IN_DATA_OFFSET = 18
+# OF1.0 spec says OFP_ASSERT(sizeof(struct ofp_packet_in) == 20).
+# It's quite bogus as it assumes a specific class of C implementations.
+# (well, if it was C.  it's unclear from the spec itself.)
+# We just use the real size of the structure as this is not C.  This
+# agrees with on-wire messages OpenFlow Reference Release and Open vSwitch
+# produce.
+OFP_PACKET_IN_PACK_STR = '!IHHBx'
+OFP_PACKET_IN_SIZE = 18
 assert calcsize(OFP_PACKET_IN_PACK_STR) + OFP_HEADER_SIZE == OFP_PACKET_IN_SIZE
 
 # enum ofp_action_type
diff --git a/ryu/ofproto/ofproto_v1_0_parser.py 
b/ryu/ofproto/ofproto_v1_0_parser.py
index d163474..8856fa1 100644
--- a/ryu/ofproto/ofproto_v1_0_parser.py
+++ b/ryu/ofproto/ofproto_v1_0_parser.py
@@ -1730,7 +1730,7 @@ class OFPPacketIn(MsgBase):
          msg.reason) = struct.unpack_from(
             ofproto_v1_0.OFP_PACKET_IN_PACK_STR,
             msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)
-        msg.data = msg.buf[ofproto_v1_0.OFP_PACKET_IN_DATA_OFFSET:]
+        msg.data = msg.buf[ofproto_v1_0.OFP_PACKET_IN_SIZE:]
         if msg.total_len < len(msg.data):
             # discard padding for 8-byte alignment of OFP packet
             msg.data = msg.data[:msg.total_len]
-- 
1.8.3.1


------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60133471&iu=/4140/ostg.clktrk
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to