All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Fastabend <john.fastabend@gmail.com>
To: Donald Hunter <donald.hunter@gmail.com>,
	bpf@vger.kernel.org, linux-doc@vger.kernel.org
Cc: Donald Hunter <donald.hunter@gmail.com>
Subject: RE: [PATCH bpf-next v1] Document BPF_MAP_TYPE_LPM_TRIE
Date: Fri, 28 Oct 2022 17:54:59 -0700	[thread overview]
Message-ID: <635c79e315b77_b1ba20836@john.notmuch> (raw)
In-Reply-To: <20221026100232.49181-1-donald.hunter@gmail.com>

Donald Hunter wrote:
> Add documentation for BPF_MAP_TYPE_LPM_TRIE including kernel
> BPF helper usage, userspace usage and examples.
> 
> Signed-off-by: Donald Hunter <donald.hunter@gmail.com>
> ---
>  Documentation/bpf/map_lpm_trie.rst | 179 +++++++++++++++++++++++++++++
>  1 file changed, 179 insertions(+)
>  create mode 100644 Documentation/bpf/map_lpm_trie.rst
> 
> diff --git a/Documentation/bpf/map_lpm_trie.rst b/Documentation/bpf/map_lpm_trie.rst
> new file mode 100644
> index 000000000000..d57c967d11d0
> --- /dev/null
> +++ b/Documentation/bpf/map_lpm_trie.rst
> @@ -0,0 +1,179 @@
> +.. SPDX-License-Identifier: GPL-2.0-only
> +.. Copyright (C) 2022 Red Hat, Inc.
> +
> +=====================
> +BPF_MAP_TYPE_LPM_TRIE
> +=====================
> +
> +.. note::
> +   - ``BPF_MAP_TYPE_LPM_TRIE`` was introduced in kernel version 4.11
> +
> +``BPF_MAP_TYPE_LPM_TRIE`` provides a longest prefix match algorithm that
> +can be used to match IP addresses to a stored set of prefixes.
> +Internally, data is stored in an unbalanced trie of nodes that uses
> +``prefixlen,data`` pairs as its keys. The ``data`` is interpreted in
> +network byte order, i.e. big endian, so ``data[0]`` stores the most
> +significant byte.
> +
> +LPM tries may be created with a maximum prefix length that is a multiple
> +of 8, in the range from 8 to 2048. The key used for lookup and update
> +operations is a ``struct bpf_lpm_trie_key``, extended by
> +``max_prefixlen/8`` bytes.
> +
> +- For IPv4 addresses the data length is 4 bytes
> +- For IPv6 addresses the data length is 16 bytes
> +
> +The value type stored in the LPM trie can be any user defined type.
> +
> +.. note::
> +   When creating a map of type ``BPF_MAP_TYPE_LPM_TRIE`` you must set the
> +   ``BPF_F_NO_PREALLOC`` flag.
> +
> +Usage
> +=====
> +
> +Kernel BPF
> +----------
> +
> +.. c:function::
> +   void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)
> +
> +The longest prefix entry for a given data value can be found using the
> +``bpf_map_lookup_elem()`` helper. This helper returns a pointer to the
> +value associated with the longest matching ``key``, or ``NULL`` if no
> +entry was found.
> +
> +The ``key`` should have ``prefixlen`` set to ``max_prefixlen`` when
> +performing longest prefix lookups. For example, when searching for the
> +longest prefix match for an IPv4 address, ``prefixlen`` should be set to
> +``32``.
> +
> +.. c:function::
> +   long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
> +
> +Prefix entries can be added or updated using the ``bpf_map_update_elem()``
> +helper. This helper replaces existing elements atomically.
> +
> +``bpf_map_update_elem()`` returns ``0`` on success, or negative error in
> +case of failure.
> +
> + .. note::
> +    The flags parameter must be one of BPF_ANY, BPF_NOEXIST or BPF_EXIST,
> +    but the value is ignored, giving BPF_ANY semantics.
> +
> +.. c:function::
> +   long bpf_map_delete_elem(struct bpf_map *map, const void *key)
> +
> +Prefix entries can be deleted using the ``bpf_map_delete_elem()``
> +helper. This helper will return 0 on success, or negative error in case
> +of failure.

The map ops lookup, update, delete and below userspace are pretty generic to
all map types. How about moving those into a generic file about maps? Maybe
./Documentation/bpf/mpas.rst? Then perhaps there is a way to link to
them from here.

> +
> +Userspace
> +---------
> +
> +Access from userspace uses libbpf APIs with the same names as above, with
> +the map identified by ``fd``.
> +
> +.. c:function::
> +   int bpf_map_get_next_key (int fd, const void *cur_key, void *next_key)
> +
> +A userspace program can iterate through the entries in an LPM trie using
> +libbpf's ``bpf_map_get_next_key()`` function. The first key can be
> +fetched by calling ``bpf_map_get_next_key()`` with ``cur_key`` set to
> +``NULL``. Subsequent calls will fetch the next key that follows the
> +current key. ``bpf_map_get_next_key()`` returns ``0`` on success,
> +``-ENOENT`` if cur_key is the last key in the hash, or negative error in
> +case of failure.
> +
> +``bpf_map_get_next_key()`` will iterate through the LPM trie elements
> +from leftmost leaf first. This means that iteration will return more
> +specific keys before less specific ones.

So I tihnk none of this is specific to LPM tries.

> +
> +Examples
> +========
> +
> +Please see ``tools/samples/bpf/xdp_router_ipv4_user.c`` and

I wouldn't link to samples. Can we link to a selftest? Maybe move the
xdp_router_ipv4_user into a selftest otherwise no one ensures it is
always working.

> +``xdp_router_ipv4.bpf.c`` for a functional example. The code snippets
> +below demonstrates API usage.
> +
> +Kernel BPF
> +----------

rest lgtm. Thanks for working on docs.

  parent reply	other threads:[~2022-10-29  0:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-26 10:02 [PATCH bpf-next v1] Document BPF_MAP_TYPE_LPM_TRIE Donald Hunter
2022-10-28  9:22 ` Jesper Dangaard Brouer
2022-10-29  0:54 ` John Fastabend [this message]
2022-10-31 12:28   ` Donald Hunter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=635c79e315b77_b1ba20836@john.notmuch \
    --to=john.fastabend@gmail.com \
    --cc=bpf@vger.kernel.org \
    --cc=donald.hunter@gmail.com \
    --cc=linux-doc@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.