From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by mail.toke.dk (Postfix) with ESMTPS id 5E7F1A1B23F for ; Thu, 20 Jul 2023 23:50:03 +0200 (CEST) Authentication-Results: mail.toke.dk; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.a=rsa-sha256 header.s=20221208 header.b=cetlgxvA Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-5766e49b802so12083907b3.1 for ; Thu, 20 Jul 2023 14:50:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1689889800; x=1690494600; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Fzj245p/zdp2VbtUUSkZh5iBN/rtlvOBoNOG5lsLugE=; b=cetlgxvA76sxVXy5H7k6a8mEmWKoY0Ka4zy++yHS+8O6VmGz/ealaoNH8sbIBZvl1+ L0yayYvd3T7VzSoxY8y9F40+ygPVH6KT0sLpsourlkuKrAB5bm0/HfDbjwC5Dtcb2mVP dQusVtIHngqXuvCXXVS3VVF5VjDqAsIcYnf0/WinJ3TT3jja4wemkvFE+SFG4mBcVvPG GZ9lRpjChNwh9Un0BMTbwBpNgHEjnHkJwliG25TwMUJhTxdQ4X/5ZEdYqyeMa/er5wqi m+iUDvcPEPosrJ3lwIbpKQc66n2ESz9kVMXf3V48wVZfB1Stas5pqaS5ugoIei8IfazZ 8WMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1689889800; x=1690494600; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Fzj245p/zdp2VbtUUSkZh5iBN/rtlvOBoNOG5lsLugE=; b=Bn1Y/3HYSrO6jW6H6M7/JFdt0DULcffD792EnUbD14qishBA7BHvP3INmYKqTpljdM bGZOHWDrZdkpVZssS8ZsCgajRYVvYCTY67FLaZu3wzzTJ1dIJsSOtzhQaTnydO/lY8UX vGdQwQ9LBkBm/F1wwwLr3ewR9XBOFA2V2Zki9Zi0b3vXkN5nnGcawsDdqrPslKopiv4Z nFchC5ThazuR9p3OvHkrDS9TZVC3MwTjoYJ6gK9H2rpBmbL/OOekzBTOkUhuwQjdl9FO isWn7vpYyg5ppXgLPjFL27F+SOwZB/Imozy0I1ANyx6xIZIEY3OxGsTqzridGQ5ULhOv C6aA== X-Gm-Message-State: ABy/qLYr433nFdh6EZrpp6SDcmCXIQKfVeD/aZ14oF8dCuEcDk50ifjB YSqOR8eDaNT7bKjyUo/mz5npNYo= X-Google-Smtp-Source: APBJJlEGREZVSzGktA4CzLW93lGIVLcfthHQpGiDzuhwbeSzcbY0SLBp7Yxm4L+FUbTXJ+LoTERsFEc= X-Received: from sdf.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:5935]) (user=sdf job=sendgmr) by 2002:a25:704:0:b0:c67:975c:74ab with SMTP id 4-20020a250704000000b00c67975c74abmr1551ybh.4.1689889800145; Thu, 20 Jul 2023 14:50:00 -0700 (PDT) Date: Thu, 20 Jul 2023 14:49:58 -0700 In-Reply-To: <20230719183734.21681-10-larysa.zaremba@intel.com> Mime-Version: 1.0 References: <20230719183734.21681-1-larysa.zaremba@intel.com> <20230719183734.21681-10-larysa.zaremba@intel.com> Message-ID: From: Stanislav Fomichev To: Larysa Zaremba Content-Type: text/plain; charset="utf-8" Message-ID-Hash: BTFKUO632IJXSRMDSVOG5ICMD5DMX4DE X-Message-ID-Hash: BTFKUO632IJXSRMDSVOG5ICMD5DMX4DE X-MailFrom: 3CKy5ZAMKCXMjUWXffXcV.TfdoUg-YZekjoUg-gifaVTk.eVk@flex--sdf.bounces.google.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: bpf@vger.kernel.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org, martin.lau@linux.dev, song@kernel.org, yhs@fb.com, john.fastabend@gmail.com, kpsingh@kernel.org, haoluo@google.com, jolsa@kernel.org, David Ahern , Jakub Kicinski , Willem de Bruijn , Jesper Dangaard Brouer , Anatoly Burakov , Alexander Lobakin , Magnus Karlsson , Maryam Tahhan , xdp-hints@xdp-project.net, netdev@vger.kernel.org X-Mailman-Version: 3.3.8 Precedence: list Subject: [xdp-hints] Re: [PATCH bpf-next v3 09/21] xdp: Add VLAN tag hint List-Id: XDP hardware hints design discussion Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 07/19, Larysa Zaremba wrote: > Implement functionality that enables drivers to expose VLAN tag > to XDP code. > > Signed-off-by: Larysa Zaremba Acked-by: Stanislav Fomichev Thank you for a super detailed kfunc kdoc! > --- > Documentation/networking/xdp-rx-metadata.rst | 8 ++++- > include/linux/netdevice.h | 2 ++ > include/net/xdp.h | 2 ++ > kernel/bpf/offload.c | 2 ++ > net/core/xdp.c | 34 ++++++++++++++++++++ > 5 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/Documentation/networking/xdp-rx-metadata.rst b/Documentation/networking/xdp-rx-metadata.rst > index 25ce72af81c2..ea6dd79a21d3 100644 > --- a/Documentation/networking/xdp-rx-metadata.rst > +++ b/Documentation/networking/xdp-rx-metadata.rst > @@ -18,7 +18,13 @@ Currently, the following kfuncs are supported. In the future, as more > metadata is supported, this set will grow: > > .. kernel-doc:: net/core/xdp.c > - :identifiers: bpf_xdp_metadata_rx_timestamp bpf_xdp_metadata_rx_hash > + :identifiers: bpf_xdp_metadata_rx_timestamp > + > +.. kernel-doc:: net/core/xdp.c > + :identifiers: bpf_xdp_metadata_rx_hash > + > +.. kernel-doc:: net/core/xdp.c > + :identifiers: bpf_xdp_metadata_rx_vlan_tag > > An XDP program can use these kfuncs to read the metadata into stack > variables for its own consumption. Or, to pass the metadata on to other > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h > index b828c7a75be2..1749f4f75c64 100644 > --- a/include/linux/netdevice.h > +++ b/include/linux/netdevice.h > @@ -1658,6 +1658,8 @@ struct xdp_metadata_ops { > int (*xmo_rx_timestamp)(const struct xdp_md *ctx, u64 *timestamp); > int (*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash, > enum xdp_rss_hash_type *rss_type); > + int (*xmo_rx_vlan_tag)(const struct xdp_md *ctx, u16 *vlan_tci, > + __be16 *vlan_proto); > }; > > /** > diff --git a/include/net/xdp.h b/include/net/xdp.h > index 6381560efae2..89c58f56ffc6 100644 > --- a/include/net/xdp.h > +++ b/include/net/xdp.h > @@ -389,6 +389,8 @@ void xdp_attachment_setup(struct xdp_attachment_info *info, > bpf_xdp_metadata_rx_timestamp) \ > XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_HASH, \ > bpf_xdp_metadata_rx_hash) \ > + XDP_METADATA_KFUNC(XDP_METADATA_KFUNC_RX_VLAN_TAG, \ > + bpf_xdp_metadata_rx_vlan_tag) \ > > enum { > #define XDP_METADATA_KFUNC(name, _) name, > diff --git a/kernel/bpf/offload.c b/kernel/bpf/offload.c > index 8a26cd8814c1..986e7becfd42 100644 > --- a/kernel/bpf/offload.c > +++ b/kernel/bpf/offload.c > @@ -848,6 +848,8 @@ void *bpf_dev_bound_resolve_kfunc(struct bpf_prog *prog, u32 func_id) > p = ops->xmo_rx_timestamp; > else if (func_id == bpf_xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_HASH)) > p = ops->xmo_rx_hash; > + else if (func_id == bpf_xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_VLAN_TAG)) > + p = ops->xmo_rx_vlan_tag; > out: > up_read(&bpf_devs_lock); > > diff --git a/net/core/xdp.c b/net/core/xdp.c > index 8362130bf085..8b55419d332e 100644 > --- a/net/core/xdp.c > +++ b/net/core/xdp.c > @@ -738,6 +738,40 @@ __bpf_kfunc int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, u32 *hash, > return -EOPNOTSUPP; > } > > +/** > + * bpf_xdp_metadata_rx_vlan_tag - Get XDP packet outermost VLAN tag > + * @ctx: XDP context pointer. > + * @vlan_tci: Destination pointer for VLAN TCI (VID + DEI + PCP) > + * @vlan_proto: Destination pointer for VLAN Tag protocol identifier (TPID). > + * > + * In case of success, ``vlan_proto`` contains *Tag protocol identifier (TPID)*, > + * usually ``ETH_P_8021Q`` or ``ETH_P_8021AD``, but some networks can use > + * custom TPIDs. ``vlan_proto`` is stored in **network byte order (BE)** > + * and should be used as follows: > + * ``if (vlan_proto == bpf_htons(ETH_P_8021Q)) do_something();`` > + * > + * ``vlan_tci`` contains the remaining 16 bits of a VLAN tag. > + * Driver is expected to provide those in **host byte order (usually LE)**, > + * so the bpf program should not perform byte conversion. > + * According to 802.1Q standard, *VLAN TCI (Tag control information)* > + * is a bit field that contains: > + * *VLAN identifier (VID)* that can be read with ``vlan_tci & 0xfff``, > + * *Drop eligible indicator (DEI)* - 1 bit, > + * *Priority code point (PCP)* - 3 bits. > + * For detailed meaning of DEI and PCP, please refer to other sources. > + * > + * Return: > + * * Returns 0 on success or ``-errno`` on error. > + * * ``-EOPNOTSUPP`` : device driver doesn't implement kfunc > + * * ``-ENODATA`` : VLAN tag was not stripped or is not available > + */ > +__bpf_kfunc int bpf_xdp_metadata_rx_vlan_tag(const struct xdp_md *ctx, > + u16 *vlan_tci, > + __be16 *vlan_proto) > +{ > + return -EOPNOTSUPP; > +} > + > __diag_pop(); > > BTF_SET8_START(xdp_metadata_kfunc_ids) > -- > 2.41.0 >