ofproto: fix OF1.0 packet_in parser
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 <yamamoto@valinux.co.jp> Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
parent
54989c7862
commit
a53bc8052d
ryu/ofproto
@ -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_NO_MATCH = 0 # No matching flow.
|
||||||
OFPR_ACTION = 1 # Action explicitly output to controller.
|
OFPR_ACTION = 1 # Action explicitly output to controller.
|
||||||
|
|
||||||
OFP_PACKET_IN_PACK_STR = '!IHHBx2x' # the last 2x is for ofp_packet_in::data
|
# OF1.0 spec says OFP_ASSERT(sizeof(struct ofp_packet_in) == 20).
|
||||||
OFP_PACKET_IN_SIZE = 20
|
# It's quite bogus as it assumes a specific class of C implementations.
|
||||||
OFP_PACKET_IN_DATA_OFFSET = 18
|
# (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
|
assert calcsize(OFP_PACKET_IN_PACK_STR) + OFP_HEADER_SIZE == OFP_PACKET_IN_SIZE
|
||||||
|
|
||||||
# enum ofp_action_type
|
# enum ofp_action_type
|
||||||
|
@ -1730,7 +1730,7 @@ class OFPPacketIn(MsgBase):
|
|||||||
msg.reason) = struct.unpack_from(
|
msg.reason) = struct.unpack_from(
|
||||||
ofproto_v1_0.OFP_PACKET_IN_PACK_STR,
|
ofproto_v1_0.OFP_PACKET_IN_PACK_STR,
|
||||||
msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)
|
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):
|
if msg.total_len < len(msg.data):
|
||||||
# discard padding for 8-byte alignment of OFP packet
|
# discard padding for 8-byte alignment of OFP packet
|
||||||
msg.data = msg.data[:msg.total_len]
|
msg.data = msg.data[:msg.total_len]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user