diff mbox series

[net] openvswitch: Fix IPv6 later frags parsing

Message ID 1546537917-20237-1-git-send-email-yihung.wei@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series [net] openvswitch: Fix IPv6 later frags parsing | expand

Commit Message

Yi-Hung Wei Jan. 3, 2019, 5:51 p.m. UTC
The previous commit fa642f08839b
("openvswitch: Derive IP protocol number for IPv6 later frags")
introduces IP protocol number parsing for IPv6 later frags that can mess
up the network header length calculation logic, i.e. nh_len < 0.
However, the network header length calculation is mainly for deriving
the transport layer header in the key extraction process which the later
fragment does not apply.

Therefore, this commit skips the network header length calculation to
fix the issue.

Reported-by: Chris Mi <chrism@mellanox.com>
Reported-by: Greg Rose <gvrose8192@gmail.com>
Fixes: fa642f08839b ("openvswitch: Derive IP protocol number for IPv6 later frags")
Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com>
---
 net/openvswitch/flow.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

David Miller Jan. 4, 2019, 9 p.m. UTC | #1
From: Yi-Hung Wei <yihung.wei@gmail.com>
Date: Thu,  3 Jan 2019 09:51:57 -0800

> The previous commit fa642f08839b
> ("openvswitch: Derive IP protocol number for IPv6 later frags")
> introduces IP protocol number parsing for IPv6 later frags that can mess
> up the network header length calculation logic, i.e. nh_len < 0.
> However, the network header length calculation is mainly for deriving
> the transport layer header in the key extraction process which the later
> fragment does not apply.
> 
> Therefore, this commit skips the network header length calculation to
> fix the issue.
> 
> Reported-by: Chris Mi <chrism@mellanox.com>
> Reported-by: Greg Rose <gvrose8192@gmail.com>
> Fixes: fa642f08839b ("openvswitch: Derive IP protocol number for IPv6 later frags")
> Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com>

Applied.
diff mbox series

Patch

diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c
index 57e07768c9d1..f54cf17ef7a8 100644
--- a/net/openvswitch/flow.c
+++ b/net/openvswitch/flow.c
@@ -276,10 +276,12 @@  static int parse_ipv6hdr(struct sk_buff *skb, struct sw_flow_key *key)
 
 	nexthdr = ipv6_find_hdr(skb, &payload_ofs, -1, &frag_off, &flags);
 	if (flags & IP6_FH_F_FRAG) {
-		if (frag_off)
+		if (frag_off) {
 			key->ip.frag = OVS_FRAG_TYPE_LATER;
-		else
-			key->ip.frag = OVS_FRAG_TYPE_FIRST;
+			key->ip.proto = nexthdr;
+			return 0;
+		}
+		key->ip.frag = OVS_FRAG_TYPE_FIRST;
 	} else {
 		key->ip.frag = OVS_FRAG_TYPE_NONE;
 	}