mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
docs: netlink: add a starting guide for working with specs
We have a bit of documentation about the internals of Netlink and the specs, but really the goal is for most people to not worry about those. Add a practical guide for beginners who want to poke at the specs. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b784db7ae8
commit
01e47a3722
@ -10,6 +10,7 @@ Netlink documentation for users.
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
intro
|
intro
|
||||||
|
intro-specs
|
||||||
specs
|
specs
|
||||||
c-code-gen
|
c-code-gen
|
||||||
genetlink-legacy
|
genetlink-legacy
|
||||||
|
80
Documentation/userspace-api/netlink/intro-specs.rst
Normal file
80
Documentation/userspace-api/netlink/intro-specs.rst
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
.. SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
=====================================
|
||||||
|
Using Netlink protocol specifications
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
This document is a quick starting guide for using Netlink protocol
|
||||||
|
specifications. For more detailed description of the specs see :doc:`specs`.
|
||||||
|
|
||||||
|
Simple CLI
|
||||||
|
==========
|
||||||
|
|
||||||
|
Kernel comes with a simple CLI tool which should be useful when
|
||||||
|
developing Netlink related code. The tool is implemented in Python
|
||||||
|
and can use a YAML specification to issue Netlink requests
|
||||||
|
to the kernel. Only Generic Netlink is supported.
|
||||||
|
|
||||||
|
The tool is located at ``tools/net/ynl/cli.py``. It accepts
|
||||||
|
a handul of arguments, the most important ones are:
|
||||||
|
|
||||||
|
- ``--spec`` - point to the spec file
|
||||||
|
- ``--do $name`` / ``--dump $name`` - issue request ``$name``
|
||||||
|
- ``--json $attrs`` - provide attributes for the request
|
||||||
|
- ``--subscribe $group`` - receive notifications from ``$group``
|
||||||
|
|
||||||
|
YAML specs can be found under ``Documentation/netlink/specs/``.
|
||||||
|
|
||||||
|
Example use::
|
||||||
|
|
||||||
|
$ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/ethtool.yaml \
|
||||||
|
--do rings-get \
|
||||||
|
--json '{"header":{"dev-index": 18}}'
|
||||||
|
{'header': {'dev-index': 18, 'dev-name': 'eni1np1'},
|
||||||
|
'rx': 0,
|
||||||
|
'rx-jumbo': 0,
|
||||||
|
'rx-jumbo-max': 4096,
|
||||||
|
'rx-max': 4096,
|
||||||
|
'rx-mini': 0,
|
||||||
|
'rx-mini-max': 4096,
|
||||||
|
'tx': 0,
|
||||||
|
'tx-max': 4096,
|
||||||
|
'tx-push': 0}
|
||||||
|
|
||||||
|
The input arguments are parsed as JSON, while the output is only
|
||||||
|
Python-pretty-printed. This is because some Netlink types can't
|
||||||
|
be expressed as JSON directly. If such attributes are needed in
|
||||||
|
the input some hacking of the script will be necessary.
|
||||||
|
|
||||||
|
The spec and Netlink internals are factored out as a standalone
|
||||||
|
library - it should be easy to write Python tools / tests reusing
|
||||||
|
code from ``cli.py``.
|
||||||
|
|
||||||
|
Generating kernel code
|
||||||
|
======================
|
||||||
|
|
||||||
|
``tools/net/ynl/ynl-regen.sh`` scans the kernel tree in search of
|
||||||
|
auto-generated files which need to be updated. Using this tool is the easiest
|
||||||
|
way to generate / update auto-generated code.
|
||||||
|
|
||||||
|
By default code is re-generated only if spec is newer than the source,
|
||||||
|
to force regeneration use ``-f``.
|
||||||
|
|
||||||
|
``ynl-regen.sh`` searches for ``YNL-GEN`` in the contents of files
|
||||||
|
(note that it only scans files in the git index, that is only files
|
||||||
|
tracked by git!) For instance the ``fou_nl.c`` kernel source contains::
|
||||||
|
|
||||||
|
/* Documentation/netlink/specs/fou.yaml */
|
||||||
|
/* YNL-GEN kernel source */
|
||||||
|
|
||||||
|
``ynl-regen.sh`` will find this marker and replace the file with
|
||||||
|
kernel source based on fou.yaml.
|
||||||
|
|
||||||
|
The simplest way to generate a new file based on a spec is to add
|
||||||
|
the two marker lines like above to a file, add that file to git,
|
||||||
|
and run the regeneration tool. Grep the tree for ``YNL-GEN``
|
||||||
|
to see other examples.
|
||||||
|
|
||||||
|
The code generation itself is performed by ``tools/net/ynl/ynl-gen-c.py``
|
||||||
|
but it takes a few arguments so calling it directly for each file
|
||||||
|
quickly becomes tedious.
|
@ -21,6 +21,9 @@ Internally kernel uses the YAML specs to generate:
|
|||||||
|
|
||||||
YAML specifications can be found under ``Documentation/netlink/specs/``
|
YAML specifications can be found under ``Documentation/netlink/specs/``
|
||||||
|
|
||||||
|
This document describes details of the schema.
|
||||||
|
See :doc:`intro-specs` for a practical starting guide.
|
||||||
|
|
||||||
Compatibility levels
|
Compatibility levels
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user