openvswitch: Check gso_type for correct sk_buff in queue_gso_packets().
authorBen Pfaff <blp@nicira.com>
Fri, 20 Jul 2012 21:47:54 +0000 (14:47 -0700)
committerJesse Gross <jesse@nicira.com>
Fri, 20 Jul 2012 21:47:54 +0000 (14:47 -0700)
commita1b5d0dd28e9cb4fe42ad2df4ebbe5cce96866d7
tree9642e1cee958e5a5cb3b61f112deb66c7b6f9f22
parent92e5dfc34cf39c20ae1087bd5e676238b5d0dfac
openvswitch: Check gso_type for correct sk_buff in queue_gso_packets().

At the point where it was used, skb_shinfo(skb)->gso_type referred to a
post-GSO sk_buff.  Thus, it would always be 0.  We want to know the pre-GSO
gso_type, so we need to obtain it before segmenting.

Before this change, the kernel would pass inconsistent data to userspace:
packets for UDP fragments with nonzero offset would be passed along with
flow keys that indicate a zero offset (that is, the flow key for "later"
fragments claimed to be "first" fragments).  This inconsistency tended
to confuse Open vSwitch userspace, causing it to log messages about
"failed to flow_del" the flows with "later" fragments.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
net/openvswitch/datapath.c