From patchwork Sun Aug 21 08:22:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shmulik Ladkani X-Patchwork-Id: 661219 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3sH8qY2c9Gz9s9x for ; Sun, 21 Aug 2016 18:23:53 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=C6SrDN3x; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751789AbcHUIXG (ORCPT ); Sun, 21 Aug 2016 04:23:06 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36434 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751121AbcHUIXE (ORCPT ); Sun, 21 Aug 2016 04:23:04 -0400 Received: by mail-wm0-f65.google.com with SMTP id i138so8991082wmf.3 for ; Sun, 21 Aug 2016 01:23:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=OVTkvee4pvBHrBqYOPjCYjs3Q6MZGaaI7hMW23+wh5k=; b=C6SrDN3xBsD5TtLCOXQAiAvnY6vgq+0fcuKSzMj3bdlVELZ88ykVWvA8fFWvZA/BHW w+Q9e86U+3bYKnJBDPYoUD2t8jso7vHhojNKaZrhX8FI1VKMrJEzVvW9cduV2aoq5S6p 8lFxnz9Ac/7a0eTh6bJG8ri0BL2QBxjJLeBo/Zx8mYh/gt3h+w9ETjGhUYPRV37S7R6N f7DKZpZseKnxoRQvySU1ayCpj8If3HCjlzxPAjnjIkk7K0HcPzjA7xmZeCSesoGQ+jW3 09ldkZsFI2s6Fdlbca9QMTiz5SDQtvFrMJ0aR1AsgcEYqGZBelk/KJMHvGfr4hJ8NPaf tiHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=OVTkvee4pvBHrBqYOPjCYjs3Q6MZGaaI7hMW23+wh5k=; b=agNwK9hp4gN+4MAVnXBfG4aaXgk8eTp7WEWHOpDATI5rp5YlMSvn8nLwQLxuvztySY sI4yZwuYZz7tHB1Ls73RRMM651/L//61IAWRsGwN1Vfk+BxFB+DiLpowUyzcJD/svsQZ VZfKWfpKqbVOuSe2tCHGHFl4ENmrxwBvbKizqd0d3+GzX5phbacOsC2rvQFKbtc4m7fc Dgl5/xGdL489Uv67Zg7yciTdvRJIZ0C12Fc7wbsNwwf0tzthK9meaVfZalYS6K+kjPWs FmslPNFLw6XGTMfyegCxTWJIzUhhZ1XtPNMbzSfmFWcEKx4ZtT2C4GR20ska34eI4UoD +1GQ== X-Gm-Message-State: AEkooutKHkzkHvB8RmrNcGFgZeCTHtQyZ8qLs9b7wrw6RF8+PodSIT3RzJzsaL4a55uqXg== X-Received: by 10.28.211.1 with SMTP id k1mr10180876wmg.112.1471767782599; Sun, 21 Aug 2016 01:23:02 -0700 (PDT) Received: from halley.ravello.local ([188.120.154.89]) by smtp.gmail.com with ESMTPSA id kq2sm16445144wjc.41.2016.08.21.01.23.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 21 Aug 2016 01:23:01 -0700 (PDT) From: Shmulik Ladkani To: "David S . Miller" , netdev@vger.kernel.org Cc: pravin shelar , wenxu , Shmulik Ladkani , Hannes Frederic Sowa Subject: [PATCH] net: ip_finish_output_gso: Allow fragmenting segments of tunneled skbs if their DF is unset Date: Sun, 21 Aug 2016 11:22:32 +0300 Message-Id: <1471767752-7849-1-git-send-email-shmulik.ladkani@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In b8247f095e, "net: ip_finish_output_gso: If skb_gso_network_seglen exceeds MTU, allow segmentation for local udp tunneled skbs" gso skbs arriving from an ingress interface that go through UDP tunneling, are allowed to be fragmented if the resulting encapulated segments exceed the dst mtu of the egress interface. This aligned the behavior of gso skbs to non-gso skbs going through udp encapsulation path. However the non-gso vs gso anomaly is present also in the following cases of a GRE tunnel: - ip_gre in collect_md mode, where TUNNEL_DONT_FRAGMENT is not set (e.g. OvS vport-gre with df_default=false) - ip_gre in nopmtudisc mode, where IFLA_GRE_IGNORE_DF is set In both of the above cases, the non-gso skbs get fragmented, whereas the gso skbs (having skb_gso_network_seglen that exceeds dst mtu) get dropped, as they don't go through the segment+fragment code path. Fix: Setting IPSKB_FRAG_SEGS if the tunnel specified IP_DF bit is NOT set. Tunnels that do set IP_DF, will not go to fragmentation of segments. This preserves behavior of ip_gre in (the default) pmtudisc mode. Fixes: b8247f095e ("net: ip_finish_output_gso: If skb_gso_network_seglen exceeds MTU, allow segmentation for local udp tunneled skbs") Reported-by: wenxu Cc: Hannes Frederic Sowa Signed-off-by: Shmulik Ladkani Tested-by: wenxu Acked-by: Hannes Frederic Sowa --- wenxu, can you please add a Tested-by? net/ipv4/ip_tunnel_core.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c index 9d847c3025..0f227db0e9 100644 --- a/net/ipv4/ip_tunnel_core.c +++ b/net/ipv4/ip_tunnel_core.c @@ -73,9 +73,11 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb, skb_dst_set(skb, &rt->dst); memset(IPCB(skb), 0, sizeof(*IPCB(skb))); - if (skb_iif && proto == IPPROTO_UDP) { - /* Arrived from an ingress interface and got udp encapuslated. - * The encapsulated network segment length may exceed dst mtu. + if (skb_iif && !(df & htons(IP_DF))) { + /* Arrived from an ingress interface, got encapsulated, with + * fragmentation of encapulating frames allowed. + * If skb is gso, the resulting encapsulated network segments + * may exceed dst mtu. * Allow IP Fragmentation of segments. */ IPCB(skb)->flags |= IPSKB_FRAG_SEGS;