Message ID | 1566917890-22304-2-git-send-email-gvrose8192@gmail.com |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | None | expand |
On Tue, Aug 27, 2019 at 7:58 AM Greg Rose <gvrose8192@gmail.com> wrote: > > From: Justin Pettit <jpettit@ovn.org> > > Only the first fragment in a datagram contains the L4 headers. When the > Open vSwitch module parses a packet, it always sets the IP protocol > field in the key, but can only set the L4 fields on the first fragment. > The original behavior would not clear the L4 portion of the key, so > garbage values would be sent in the key for "later" fragments. This > patch clears the L4 fields in that circumstance to prevent sending those > garbage values as part of the upcall. > > Signed-off-by: Justin Pettit <jpettit@ovn.org> Acked-by: Pravin B Shelar <pshelar@ovn.org> Thanks, Pravin.
From: Greg Rose <gvrose8192@gmail.com> Date: Tue, 27 Aug 2019 07:58:10 -0700 > From: Justin Pettit <jpettit@ovn.org> > > Only the first fragment in a datagram contains the L4 headers. When the > Open vSwitch module parses a packet, it always sets the IP protocol > field in the key, but can only set the L4 fields on the first fragment. > The original behavior would not clear the L4 portion of the key, so > garbage values would be sent in the key for "later" fragments. This > patch clears the L4 fields in that circumstance to prevent sending those > garbage values as part of the upcall. > > Signed-off-by: Justin Pettit <jpettit@ovn.org> Applied.
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 005f762..9d81d2c 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c @@ -560,6 +560,7 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key) offset = nh->frag_off & htons(IP_OFFSET); if (offset) { key->ip.frag = OVS_FRAG_TYPE_LATER; + memset(&key->tp, 0, sizeof(key->tp)); return 0; } if (nh->frag_off & htons(IP_MF) || @@ -677,8 +678,10 @@ static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key) return error; } - if (key->ip.frag == OVS_FRAG_TYPE_LATER) + if (key->ip.frag == OVS_FRAG_TYPE_LATER) { + memset(&key->tp, 0, sizeof(key->tp)); return 0; + } if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) key->ip.frag = OVS_FRAG_TYPE_FIRST;