From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 125CFC282C2 for ; Thu, 7 Feb 2019 19:54:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D1ADF2173B for ; Thu, 7 Feb 2019 19:54:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lSkNYMRm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727239AbfBGTyV (ORCPT ); Thu, 7 Feb 2019 14:54:21 -0500 Received: from mail-qt1-f196.google.com ([209.85.160.196]:37801 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726902AbfBGTyV (ORCPT ); Thu, 7 Feb 2019 14:54:21 -0500 Received: by mail-qt1-f196.google.com with SMTP id a48so1332299qtb.4 for ; Thu, 07 Feb 2019 11:54:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=TOP2mQaGNx0OPy5EuCOvcOUwGLFqXMnW1QJ5D0auF7c=; b=lSkNYMRmGC4k5gOokyr57RAVE3ZEMNw+Qk5GuPp/X4+XVarlSXtMsxiidUgaIrJ9Og RfLa2P+5dT2d+Y6KXai9vR0WC0DvStJEuadAuZpW/jHLjoNvtqy9odJX1xhfgAXo+f1Q 1jJw3ZOVWLLVbp/g3UIkrtgY4IwNBeIQ7zfwsm6cusgGU9RNuv6oTZr+OkCZMdP5h6kf EF3FBSC/mfSaLQ2e3Z6tOJO9v7vFO7x/Ldw+lLQyQhZv5nNfUtp+U+/OU7ms60UQDs49 XCh+28BUleKrWKzaZhRpwHmR/7kXU9U1DxXJbdBYFkdrr3x/fFNnBekLiUZiy6k5wai6 78UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=TOP2mQaGNx0OPy5EuCOvcOUwGLFqXMnW1QJ5D0auF7c=; b=JodoaVRsSvCBP2QQne7qIbcUQ0lWy5PmM4GMPQ3RJ9Ie+zpRusVOCjFdKSFRX9u8Iu cCVqD76jaJBmr+le3lF3oz97pZv7Fn2xrc9KMYofOtAb8kC6UKoov38Q/bZ0n3U7KLUr EcbgSKcA/lYi0gAB+1Gkl5qePCyQFX3oQmY/5T7ZlMtNveEElHZsrm3FQJuC7DWIz8Jh own3kXiSVTeKrhIBzSy7olwq42kZylNFGucE7HvajL5OQ5mPng1HbjxzWQxGLA3kXHE0 qF3vl9X28L9gwWSuqcmUqI6HquhboGrY+ZD/On5n0jK4PjEhubeBhoTmWQsT51ZLMWTs 2dfg== X-Gm-Message-State: AHQUAuZBTgBkBexmxIf/A8Ke3a8oHnMbDseryxyB2DvBZBxf8I9gmMuq Qae6pcBQvuNn6fJZU1UYIWc/8GNl X-Google-Smtp-Source: AHgI3IYeHa4CemmhV6XaXSVd8b/cHoKQOZBbVrF4aj/qVJZZ0lDmz217lN4Rd4G9N3tIfysZgu/GFA== X-Received: by 2002:aed:227b:: with SMTP id o56mr13198302qtc.267.1549569260439; Thu, 07 Feb 2019 11:54:20 -0800 (PST) Received: from willemb1.nyc.corp.google.com ([2620:0:1003:315:3fa1:a34c:1128:1d39]) by smtp.gmail.com with ESMTPSA id x26sm4031223qtr.23.2019.02.07.11.54.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Feb 2019 11:54:19 -0800 (PST) From: Willem de Bruijn To: netdev@vger.kernel.org Cc: ast@kernel.org, daniel@iogearbox.net, posk.devel@gmail.com, dja@axtens.net, Willem de Bruijn Subject: [PATCH bpf] bpf: only adjust gso_size on bytestream protocols Date: Thu, 7 Feb 2019 14:54:16 -0500 Message-Id: <20190207195416.27082-1-willemdebruijn.kernel@gmail.com> X-Mailer: git-send-email 2.20.1.611.gfbb209baf1-goog MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Willem de Bruijn bpf_skb_change_proto and bpf_skb_adjust_room change skb header length. For GSO packets they adjust gso_size to maintain the same MTU. The gso size can only be safely adjusted on bytestream protocols. Commit d02f51cbcf12 ("bpf: fix bpf_skb_adjust_net/bpf_skb_proto_xlat to deal with gso sctp skbs") excluded SKB_GSO_SCTP. Since then type SKB_GSO_UDP_L4 has been added, whose contents are one gso_size unit per datagram. Also exclude these. Move from a blacklist to a whitelist check to future proof against additional such new GSO types, e.g., for fraglist based GRO. Fixes: bec1f6f69736 ("udp: generate gso with UDP_SEGMENT") Signed-off-by: Willem de Bruijn --- include/linux/skbuff.h | 6 ++++++ net/core/filter.c | 12 ++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 95d25b010a257..5a7a8b93a5abf 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -4212,6 +4212,12 @@ static inline bool skb_is_gso_sctp(const struct sk_buff *skb) return skb_shinfo(skb)->gso_type & SKB_GSO_SCTP; } +static inline bool skb_is_gso_tcp(const struct sk_buff *skb) +{ + return skb_is_gso(skb) && + skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6); +} + static inline void skb_gso_reset(struct sk_buff *skb) { skb_shinfo(skb)->gso_size = 0; diff --git a/net/core/filter.c b/net/core/filter.c index 7a54dc11ac2d3..f7d0004fc1609 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -2789,8 +2789,7 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb) u32 off = skb_mac_header_len(skb); int ret; - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) + if (!skb_is_gso_tcp(skb)) return -ENOTSUPP; ret = skb_cow(skb, len_diff); @@ -2831,8 +2830,7 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb) u32 off = skb_mac_header_len(skb); int ret; - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) + if (!skb_is_gso_tcp(skb)) return -ENOTSUPP; ret = skb_unclone(skb, GFP_ATOMIC); @@ -2957,8 +2955,7 @@ static int bpf_skb_net_grow(struct sk_buff *skb, u32 len_diff) u32 off = skb_mac_header_len(skb) + bpf_skb_net_base_len(skb); int ret; - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) + if (!skb_is_gso_tcp(skb)) return -ENOTSUPP; ret = skb_cow(skb, len_diff); @@ -2987,8 +2984,7 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 len_diff) u32 off = skb_mac_header_len(skb) + bpf_skb_net_base_len(skb); int ret; - /* SCTP uses GSO_BY_FRAGS, thus cannot adjust it. */ - if (skb_is_gso(skb) && unlikely(skb_is_gso_sctp(skb))) + if (!skb_is_gso_tcp(skb)) return -ENOTSUPP; ret = skb_unclone(skb, GFP_ATOMIC); -- 2.20.1.611.gfbb209baf1-goog