Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1199045 > unrolled thread

[PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments

Started byGlenn Griffin <ggriffin.kernel@gmail.com>
First post2015-08-03 19:00 +0200
Last post2015-08-03 23:10 +0200
Articles 3 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with  IP fragments Glenn Griffin <ggriffin.kernel@gmail.com> - 2015-08-03 19:00 +0200
    Re: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing  with IP fragments Pravin Shelar <pshelar@nicira.com> - 2015-08-03 19:20 +0200
    Re: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing  with IP fragments David Miller <davem@davemloft.net> - 2015-08-03 23:10 +0200

#1199045 — [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments

FromGlenn Griffin <ggriffin.kernel@gmail.com>
Date2015-08-03 19:00 +0200
Subject[PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments
Message-ID<pTrfI-uN-19@gated-at.bofh.it>
openvswitch modifies the L4 checksum of a packet when modifying
the ip address. When an IP packet is fragmented only the first
fragment contains an L4 header and checksum. Prior to this change
openvswitch would modify all fragments, modifying application data
in non-first fragments, causing checksum failures in the
reassembled packet.

Signed-off-by: Glenn Griffin <ggriffin.kernel@gmail.com>
---
Changes in v2:
  - Compare frag_off in network byte order rather than host byte order

 net/openvswitch/actions.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 8a8c0b8..ee34f47 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -273,28 +273,36 @@ static int set_eth_addr(struct sk_buff *skb, struct sw_flow_key *flow_key,
 	return 0;
 }
 
-static void set_ip_addr(struct sk_buff *skb, struct iphdr *nh,
-			__be32 *addr, __be32 new_addr)
+static void update_ip_l4_checksum(struct sk_buff *skb, struct iphdr *nh,
+				  __be32 addr, __be32 new_addr)
 {
 	int transport_len = skb->len - skb_transport_offset(skb);
 
+	if (nh->frag_off & htons(IP_OFFSET))
+		return;
+
 	if (nh->protocol == IPPROTO_TCP) {
 		if (likely(transport_len >= sizeof(struct tcphdr)))
 			inet_proto_csum_replace4(&tcp_hdr(skb)->check, skb,
-						 *addr, new_addr, 1);
+						 addr, new_addr, 1);
 	} else if (nh->protocol == IPPROTO_UDP) {
 		if (likely(transport_len >= sizeof(struct udphdr))) {
 			struct udphdr *uh = udp_hdr(skb);
 
 			if (uh->check || skb->ip_summed == CHECKSUM_PARTIAL) {
 				inet_proto_csum_replace4(&uh->check, skb,
-							 *addr, new_addr, 1);
+							 addr, new_addr, 1);
 				if (!uh->check)
 					uh->check = CSUM_MANGLED_0;
 			}
 		}
 	}
+}
 
+static void set_ip_addr(struct sk_buff *skb, struct iphdr *nh,
+			__be32 *addr, __be32 new_addr)
+{
+	update_ip_l4_checksum(skb, nh, *addr, new_addr);
 	csum_replace4(&nh->check, *addr, new_addr);
 	skb_clear_hash(skb);
 	*addr = new_addr;
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1199086 — Re: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments

FromPravin Shelar <pshelar@nicira.com>
Date2015-08-03 19:20 +0200
SubjectRe: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments
Message-ID<pTrz4-17w-23@gated-at.bofh.it>
In reply to#1199045
On Mon, Aug 3, 2015 at 9:56 AM, Glenn Griffin <ggriffin.kernel@gmail.com> wrote:
> openvswitch modifies the L4 checksum of a packet when modifying
> the ip address. When an IP packet is fragmented only the first
> fragment contains an L4 header and checksum. Prior to this change
> openvswitch would modify all fragments, modifying application data
> in non-first fragments, causing checksum failures in the
> reassembled packet.
>
> Signed-off-by: Glenn Griffin <ggriffin.kernel@gmail.com>

Looks good.
Acked-by: Pravin B Shelar <pshelar@nicira.com>

This patch needs to be backported to stable branches.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1199264 — Re: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments

FromDavid Miller <davem@davemloft.net>
Date2015-08-03 23:10 +0200
SubjectRe: [PATCH v2] openvswitch: Fix L4 checksum handling when dealing with IP fragments
Message-ID<pTv9D-6mn-3@gated-at.bofh.it>
In reply to#1199045
From: Glenn Griffin <ggriffin.kernel@gmail.com>
Date: Mon, 3 Aug 2015 09:56:54 -0700

> openvswitch modifies the L4 checksum of a packet when modifying
> the ip address. When an IP packet is fragmented only the first
> fragment contains an L4 header and checksum. Prior to this change
> openvswitch would modify all fragments, modifying application data
> in non-first fragments, causing checksum failures in the
> reassembled packet.
> 
> Signed-off-by: Glenn Griffin <ggriffin.kernel@gmail.com>
> ---
> Changes in v2:
>   - Compare frag_off in network byte order rather than host byte order

Applied and queued up for -stable.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web