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=-16.6 required=3.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT,USER_IN_DEF_DKIM_WL 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 539B2C282CB for ; Tue, 5 Feb 2019 17:36:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1EE8A217D6 for ; Tue, 5 Feb 2019 17:36:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Ru7S/yI4" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729203AbfBERgm (ORCPT ); Tue, 5 Feb 2019 12:36:42 -0500 Received: from mail-qk1-f202.google.com ([209.85.222.202]:49377 "EHLO mail-qk1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726550AbfBERgl (ORCPT ); Tue, 5 Feb 2019 12:36:41 -0500 Received: by mail-qk1-f202.google.com with SMTP id t29so3823942qkt.16 for ; Tue, 05 Feb 2019 09:36:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=GY3XDbl35ApppFak5LeDlBb8ZHlfHk2O0bmx3vS6BzE=; b=Ru7S/yI4WTzb8cwioXeOa0J2XzqsQ+3FQU0hMkawxUmGs6jKLNHJPsTKl5wFV2ng+P LkW3ZVyuLwrwS4mSddo3izECTHXWjehQPb04IGX3SSik86TxteIcCDvkw3WgBSaYsejL YURtYjIF+zG40h4MXyY3mr3wwxEG8h2nGK0QJfU9w5LbyceD5RMU4ykTIMRbQ/yUThas Ojz9u2ySoT9yYLMlQRq3JfZ3JV5MWdFrJ49nbHYzhPaPuJc5F5mL3AIv4mBliQW4O2Qt 8xbMc+B4/cMZAEIM9P0otsEC/+DDYQw5ttgl/mtmRZf0/9jMdbEWMFO/4Nmm8PE/SDIj 62IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=GY3XDbl35ApppFak5LeDlBb8ZHlfHk2O0bmx3vS6BzE=; b=MS7+6IkRcf0oFYAzR2MuJdwEh1CJ3va+21CyxDFFD5KHwQhKtJUnvht0rA/dwE/j/D rNidhXj/Nbs6YiqdgebyWmLdwqwc/WBVOBxbs8VNSA/1uOWZbZwQngUHwtNBaL1ttVQQ TIpDBOedeqd6RluQIb6bQeckhp0UhHz4yBZKGFcg56yqxGg/ofR7xC/yvGJ3dt9tlCTd 9vBG8IcHNOUxB0Ez0ROoD0NDTYRPGlwsRYgbtElx28GWJO+/yqYA2+6LsVYYrrEafkbh ZtreBiEf3LN8xkXp20x0VK23y6uJqRRcIT6ydgbIBcIfFnH4J1KEmRea3rsvStwwLrFG LKiA== X-Gm-Message-State: AHQUAuaQ27dSCyP2qG+CVtyR2UC+Mi3QI0bq8AmzCzStL1WseqXXQber x0p4dcUb2FkYS6e9kOFBkuJAuvSnXgicUol69HHmnJUSfHXDiExEJ1tbL3Sa/4xYkifUBZ++hWe lWtojF8AMyFoQ/Evcss+EOwE7XsBSP0siNpSt3hKxdcBbANQy1oy+uw== X-Google-Smtp-Source: AHgI3IbGdgymN/E9K4eDT8U0y+Q674ui7lABK68fFko15uPqSKfnRBigg9hMLhPb488gd3bYuoQlUI0= X-Received: by 2002:ac8:2345:: with SMTP id b5mr3735375qtb.41.1549388200146; Tue, 05 Feb 2019 09:36:40 -0800 (PST) Date: Tue, 5 Feb 2019 09:36:25 -0800 In-Reply-To: <20190205173629.160717-1-sdf@google.com> Message-Id: <20190205173629.160717-4-sdf@google.com> Mime-Version: 1.0 References: <20190205173629.160717-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.611.gfbb209baf1-goog Subject: [RFC bpf-next 3/7] net: plumb network namespace into __skb_flow_dissect From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, simon.horman@netronome.com, willemb@google.com, Stanislav Fomichev Content-Type: text/plain; charset="UTF-8" Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This new argument will be used in the next patches for the eth_get_headlen use case. eth_get_headlen calls flow dissector with only data (without skb) so there is currently no way to pull attached BPF flow dissector program. With this new argument, we can amend the callers to explicitly pass network namespace so we can use attached BPF program. Note: WARN_ON_ONCE(!net) will now trigger for eth_get_headlen users. Signed-off-by: Stanislav Fomichev --- include/linux/skbuff.h | 15 +++++++++------ net/core/flow_dissector.c | 20 +++++++++++--------- net/ethernet/eth.c | 5 +++-- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 28723a86efdf..aa9a9983de80 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1227,7 +1227,8 @@ bool __skb_flow_bpf_dissect(struct bpf_prog *prog, const struct sk_buff *skb, struct flow_dissector *flow_dissector, struct bpf_flow_keys *flow_keys); -bool __skb_flow_dissect(const struct sk_buff *skb, +bool __skb_flow_dissect(struct net *net, + const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container, void *data, __be16 proto, int nhoff, int hlen, @@ -1237,7 +1238,7 @@ static inline bool skb_flow_dissect(const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container, unsigned int flags) { - return __skb_flow_dissect(skb, flow_dissector, target_container, + return __skb_flow_dissect(NULL, skb, flow_dissector, target_container, NULL, 0, 0, 0, flags); } @@ -1246,18 +1247,19 @@ static inline bool skb_flow_dissect_flow_keys(const struct sk_buff *skb, unsigned int flags) { memset(flow, 0, sizeof(*flow)); - return __skb_flow_dissect(skb, &flow_keys_dissector, flow, + return __skb_flow_dissect(NULL, skb, &flow_keys_dissector, flow, NULL, 0, 0, 0, flags); } static inline bool -skb_flow_dissect_flow_keys_basic(const struct sk_buff *skb, +skb_flow_dissect_flow_keys_basic(struct net *net, + const struct sk_buff *skb, struct flow_keys_basic *flow, void *data, __be16 proto, int nhoff, int hlen, unsigned int flags) { memset(flow, 0, sizeof(*flow)); - return __skb_flow_dissect(skb, &flow_keys_basic_dissector, flow, + return __skb_flow_dissect(net, skb, &flow_keys_basic_dissector, flow, data, proto, nhoff, hlen, flags); } @@ -2438,7 +2440,8 @@ static inline void skb_probe_transport_header(struct sk_buff *skb, if (skb_transport_header_was_set(skb)) return; - if (skb_flow_dissect_flow_keys_basic(skb, &keys, NULL, 0, 0, 0, 0)) + if (skb_flow_dissect_flow_keys_basic(NULL, skb, &keys, + NULL, 0, 0, 0, 0)) skb_set_transport_header(skb, keys.control.thoff); else skb_set_transport_header(skb, offset_hint); diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index bb1a54747d64..dddcc37c0462 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -725,6 +725,7 @@ bool __skb_flow_bpf_dissect(struct bpf_prog *prog, /** * __skb_flow_dissect - extract the flow_keys struct and return it + * @net: associated network namespace, if NULL pulled from skb * @skb: sk_buff to extract the flow from, can be NULL if the rest are specified * @flow_dissector: list of keys to dissect * @target_container: target structure to put dissected values into @@ -739,7 +740,8 @@ bool __skb_flow_bpf_dissect(struct bpf_prog *prog, * * Caller must take care of zeroing target container memory. */ -bool __skb_flow_dissect(const struct sk_buff *skb, +bool __skb_flow_dissect(struct net *net, + const struct sk_buff *skb, struct flow_dissector *flow_dissector, void *target_container, void *data, __be16 proto, int nhoff, int hlen, @@ -799,12 +801,11 @@ bool __skb_flow_dissect(const struct sk_buff *skb, rcu_read_lock(); - if (skb->dev) - attached = rcu_dereference(dev_net(skb->dev)->flow_dissector_prog); - else if (skb->sk) - attached = rcu_dereference(sock_net(skb->sk)->flow_dissector_prog); - else - WARN_ON_ONCE(1); + if (!net && skb) + net = skb_net(skb); + if (net) + attached = rcu_dereference(net->flow_dissector_prog); + WARN_ON_ONCE(!net); if (attached) { ret = __skb_flow_bpf_dissect(attached, skb, @@ -1406,7 +1407,7 @@ u32 __skb_get_hash_symmetric(const struct sk_buff *skb) __flow_hash_secret_init(); memset(&keys, 0, sizeof(keys)); - __skb_flow_dissect(skb, &flow_keys_dissector_symmetric, &keys, + __skb_flow_dissect(NULL, skb, &flow_keys_dissector_symmetric, &keys, NULL, 0, 0, 0, FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL); @@ -1508,7 +1509,8 @@ u32 skb_get_poff(const struct sk_buff *skb) { struct flow_keys_basic keys; - if (!skb_flow_dissect_flow_keys_basic(skb, &keys, NULL, 0, 0, 0, 0)) + if (!skb_flow_dissect_flow_keys_basic(NULL, skb, &keys, + NULL, 0, 0, 0, 0)) return 0; return __skb_get_poff(skb, skb->data, &keys, skb_headlen(skb)); diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 4c520110b04f..155d55025bfc 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -136,8 +136,9 @@ u32 eth_get_headlen(void *data, unsigned int len) return len; /* parse any remaining L2/L3 headers, check for L4 */ - if (!skb_flow_dissect_flow_keys_basic(NULL, &keys, data, eth->h_proto, - sizeof(*eth), len, flags)) + if (!skb_flow_dissect_flow_keys_basic(NULL, NULL, &keys, data, + eth->h_proto, sizeof(*eth), + len, flags)) return max_t(u32, keys.control.thoff, sizeof(*eth)); /* parse for any L4 headers */ -- 2.20.1.611.gfbb209baf1-goog