Netdev List
 help / color / mirror / Atom feed
From: Demos Ra via B4 Relay <devnull+demosthenes.ra.gmail.com@kernel.org>
To: "David S. Miller" <davem@davemloft.net>,
	 Eric Dumazet <edumazet@kernel.org>,
	Jakub Kicinski <kuba@kernel.org>,
	 Paolo Abeni <pabeni@redhat.com>,
	Donald Hunter <donald.hunter@gmail.com>,
	 David Ahern <dsahern@kernel.org>,
	Ido Schimmel <idosch@nvidia.com>
Cc: Simon Horman <horms@kernel.org>,
	netdev@vger.kernel.org,  Demos Ra <demosthenes.ra@gmail.com>
Subject: [PATCH net-next] netlink: specs: Add a spec for nexthops in rtnetlink
Date: Mon, 19 Oct 2026 13:35:51 +0700	[thread overview]
Message-ID: <20261019-rt-nexthop-spec-v1-1-9c586edf86ab@gmail.com> (raw)

From: Demos Ra <demosthenes.ra@gmail.com>

Add a YNL spec for nexthop objects and nexthop buckets in rtnetlink.

./tools/net/ynl/pyynl/cli.py \
    --spec Documentation/netlink/specs/rt-nexthop.yaml \
    --dump getnexthop

Exclude newnexthopbucket-ntf from the C code generation. ynl_gen_c.py
looks up a classic notification by the request of the same message
type, and no request uses RTM_NEWNEXTHOPBUCKET. The spec keeps the
notification, so the Python tools can still subscribe to it.

Signed-off-by: Demos Ra <demosthenes.ra@gmail.com>
---
Tested with tools/net/ynl/pyynl/cli.py on a 7.0 kernel: each
operation's replies match ip nexthop, and the create and delete
notifications are received. rt-nexthop-user.o builds with no warnings.

newnexthopbucket-ntf is left out of the C generation with
--exclude-op, as ethtool does for stats-get. If you would rather
have ynl_gen_c.py handle a notification with no matching request,
I can do that instead.
---
 Documentation/netlink/specs/rt-nexthop.yaml | 761 ++++++++++++++++++++++++++++
 MAINTAINERS                                 |   1 +
 tools/net/ynl/Makefile.deps                 |   9 +
 tools/net/ynl/generated/Makefile            |   1 +
 4 files changed, 772 insertions(+)

diff --git a/Documentation/netlink/specs/rt-nexthop.yaml b/Documentation/netlink/specs/rt-nexthop.yaml
new file mode 100644
index 000000000..06c28fa7d
--- /dev/null
+++ b/Documentation/netlink/specs/rt-nexthop.yaml
@@ -0,0 +1,761 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+---
+name: rt-nexthop
+protocol: netlink-raw
+uapi-header: linux/nexthop.h
+protonum: 0
+
+doc: >-
+  Nexthop object management over rtnetlink.
+
+definitions:
+  -
+    name: nhmsg
+    type: struct
+    members:
+      -
+        name: nh-family
+        type: u8
+      -
+        name: nh-scope
+        type: u8
+      -
+        name: nh-protocol
+        type: u8
+      -
+        name: resvd
+        type: pad
+        len: 1
+      -
+        name: nh-flags
+        type: u32
+        enum: rtnh-f
+  -
+    name: rtnh-f
+    type: flags
+    name-prefix: rtnh-f-
+    enum-name:
+    entries:
+      - dead
+      - pervasive
+      - onlink
+      - offload
+      - linkdown
+      - unresolved
+      - trap
+  -
+    name: nexthop-grp
+    type: struct
+    members:
+      -
+        name: id
+        type: u32
+      -
+        name: weight
+        type: u8
+      -
+        name: weight-high
+        type: u8
+      -
+        name: resvd2
+        type: pad
+        len: 2
+  -
+    name: nexthop-grp-type
+    type: enum
+    name-prefix: nexthop-grp-type-
+    enum-name:
+    entries:
+      - mpath
+      - res
+  -
+    name: encap-type
+    type: enum
+    name-prefix: lwtunnel-encap-
+    enum-name:
+    entries:
+      - none
+      - mpls
+      - ip
+      - ila
+      - ip6
+      - seg6
+      - bpf
+      - seg6-local
+      - rpl
+      - ioam6
+      - xfrm
+  -
+    name: seg6-local-actions
+    type: enum
+    name-prefix: seg6-local-action-
+    enum-name:
+    entries:
+      - unspec
+      - end
+      - end-x
+      - end-t
+      - end-dx2
+      - end-dx6
+      - end-dx4
+      - end-dt6
+      - end-dt4
+      - end-b6
+      - end-b6-encap
+      - end-bm
+      - end-s
+      - end-as
+      - end-am
+      - end-bpf
+      - end-dt46
+  -
+    name: seg6-local-flv-ops
+    type: enum
+    name-prefix: seg6-local-flv-op-
+    enum-name:
+    entries:
+      -
+        name: unspec
+      -
+        name: psp
+      -
+        name: usp
+      -
+        name: usd
+      -
+        name: next-csid
+  -
+    name: nha-op-flag
+    type: flags
+    name-prefix: nha-op-flag-
+    enum-name:
+    entries:
+      - dump-stats
+      - dump-hw-stats
+  -
+    name: nha-op-flag-resp-grp-resvd-0
+    type: const
+    value: 2147483648
+
+sub-messages:
+  -
+    name: encap-data
+    formats:
+      -
+        value: mpls
+        attribute-set: mpls-iptunnel
+      -
+        value: ip
+        attribute-set: lwtunnel-ip
+      -
+        value: ila
+        attribute-set: ila-attrs
+      -
+        value: ip6
+        attribute-set: lwtunnel-ip6
+      -
+        value: seg6
+        attribute-set: seg6-iptunnel
+      -
+        value: bpf
+        attribute-set: lwt-bpf
+      -
+        value: seg6-local
+        attribute-set: seg6-local
+      -
+        value: rpl
+        attribute-set: rpl-iptunnel
+      -
+        value: ioam6
+        attribute-set: ioam6-iptunnel
+      -
+        value: xfrm
+        attribute-set: lwt-xfrm
+
+attribute-sets:
+  -
+    name: nexthop-attrs
+    name-prefix: nha-
+    attributes:
+      -
+        name: id
+        type: u32
+      -
+        name: group
+        type: binary  # array of struct: nexthop-grp
+      -
+        name: group-type
+        type: u16
+        enum: nexthop-grp-type
+      -
+        name: blackhole
+        type: flag
+      -
+        name: oif
+        type: u32
+      -
+        name: gateway
+        type: binary
+        display-hint: ipv4-or-v6
+      -
+        name: encap-type
+        type: u16
+        enum: encap-type
+      -
+        name: encap
+        type: sub-message
+        sub-message: encap-data
+        selector: encap-type
+      -
+        name: groups
+        type: flag
+      -
+        name: master
+        type: u32
+      -
+        name: fdb
+        type: flag
+      -
+        name: res-group
+        type: nest
+        nested-attributes: res-group-attrs
+      -
+        name: res-bucket
+        type: nest
+        nested-attributes: res-bucket-attrs
+      -
+        name: op-flags
+        type: u32
+        checks:
+          flags-mask: nha-op-flag
+      -
+        name: group-stats
+        type: nest
+        nested-attributes: group-stats-attrs
+      -
+        name: hw-stats-enable
+        type: u32
+        checks:
+          max: 1
+      -
+        name: hw-stats-used
+        type: u32
+      -
+        name: dst-port
+        type: u16
+        byte-order: big-endian
+        checks:
+          min: 1
+  -
+    name: mpls-iptunnel
+    name-prefix: mpls-iptunnel-
+    header: linux/mpls_iptunnel.h
+    attributes:
+      -
+        name: dst
+        type: binary
+      -
+        name: ttl
+        type: u8
+  -
+    name: lwtunnel-ip
+    name-prefix: lwtunnel-ip-
+    header: linux/lwtunnel.h
+    attributes:
+      -
+        name: id
+        type: u64
+        byte-order: big-endian
+      -
+        name: dst
+        type: u32
+        byte-order: big-endian
+        display-hint: ipv4
+      -
+        name: src
+        type: u32
+        byte-order: big-endian
+        display-hint: ipv4
+      -
+        name: ttl
+        type: u8
+      -
+        name: tos
+        type: u8
+      -
+        name: flags
+        type: u16
+        byte-order: big-endian
+      -
+        name: pad
+        type: pad
+      -
+        name: opts
+        type: nest
+        nested-attributes: lwtunnel-ip-opts
+  -
+    name: ila-attrs
+    name-prefix: ila-attr-
+    header: linux/ila.h
+    attributes:
+      -
+        name: locator
+        type: u64
+        byte-order: big-endian
+      -
+        name: identifier
+        type: u64
+      -
+        name: locator-match
+        type: u64
+        byte-order: big-endian
+      -
+        name: ifindex
+        type: s32
+      -
+        name: dir
+        type: u32
+      -
+        name: pad
+        type: pad
+      -
+        name: csum-mode
+        type: u8
+      -
+        name: ident-type
+        type: u8
+      -
+        name: hook-type
+        type: u8
+  -
+    name: lwtunnel-ip6
+    name-prefix: lwtunnel-ip6-
+    header: linux/lwtunnel.h
+    attributes:
+      -
+        name: id
+        type: u64
+        byte-order: big-endian
+      -
+        name: dst
+        type: binary
+        display-hint: ipv6
+      -
+        name: src
+        type: binary
+        display-hint: ipv6
+      -
+        name: hoplimit
+        type: u8
+      -
+        name: tc
+        type: u8
+      -
+        name: flags
+        type: u16
+        byte-order: big-endian
+      -
+        name: pad
+        type: pad
+      -
+        name: opts
+        type: nest
+        nested-attributes: lwtunnel-ip-opts
+  -
+    name: seg6-iptunnel
+    name-prefix: seg6-iptunnel-
+    header: linux/seg6_iptunnel.h
+    attributes:
+      -
+        name: srh
+        type: binary
+      -
+        name: src
+        type: binary
+        display-hint: ipv6
+      -
+        name: table
+        type: u32
+  -
+    name: lwt-bpf
+    name-prefix: lwt-bpf-
+    header: linux/lwtunnel.h
+    attributes:
+      -
+        name: in
+        type: nest
+        nested-attributes: lwt-bpf-prog
+      -
+        name: out
+        type: nest
+        nested-attributes: lwt-bpf-prog
+      -
+        name: xmit
+        type: nest
+        nested-attributes: lwt-bpf-prog
+      -
+        name: xmit-headroom
+        type: u32
+  -
+    name: seg6-local
+    name-prefix: seg6-local-
+    header: linux/seg6_local.h
+    attributes:
+      -
+        name: action
+        type: u32
+        enum: seg6-local-actions
+      -
+        name: srh
+        type: binary
+      -
+        name: table
+        type: u32
+      -
+        name: nh4
+        type: u32
+        byte-order: big-endian
+        display-hint: ipv4
+      -
+        name: nh6
+        type: binary
+        display-hint: ipv6
+      -
+        name: iif
+        type: u32
+      -
+        name: oif
+        type: u32
+      -
+        name: bpf
+        type: nest
+        nested-attributes: seg6-local-bpf
+      -
+        name: vrftable
+        type: u32
+      -
+        name: counters
+        type: nest
+        nested-attributes: seg6-local-cnt
+      -
+        name: flavors
+        type: nest
+        nested-attributes: seg6-local-flv
+  -
+    name: rpl-iptunnel
+    name-prefix: rpl-iptunnel-
+    header: linux/rpl_iptunnel.h
+    attributes:
+      -
+        name: srh
+        type: binary
+  -
+    name: ioam6-iptunnel
+    name-prefix: ioam6-iptunnel-
+    header: linux/ioam6_iptunnel.h
+    attributes:
+      -
+        name: mode
+        type: u8
+      -
+        name: dst
+        type: binary
+        display-hint: ipv6
+      -
+        name: trace
+        type: binary
+      -
+        name: freq-k
+        type: u32
+      -
+        name: freq-n
+        type: u32
+      -
+        name: src
+        type: binary
+        display-hint: ipv6
+  -
+    name: lwt-xfrm
+    name-prefix: lwt-xfrm-
+    header: linux/lwtunnel.h
+    attributes:
+      -
+        name: if-id
+        type: u32
+      -
+        name: link
+        type: u32
+  -
+    name: lwtunnel-ip-opts
+    name-prefix: lwtunnel-ip-opts-
+    attributes:
+      -
+        name: geneve
+        type: binary
+      -
+        name: vxlan
+        type: nest
+        nested-attributes: lwtunnel-ip-opt-vxlan
+      -
+        name: erspan
+        type: nest
+        nested-attributes: lwtunnel-ip-opt-erspan
+  -
+    name: lwtunnel-ip-opt-vxlan
+    name-prefix: lwtunnel-ip-opt-vxlan-
+    attributes:
+      -
+        name: gbp
+        type: u32
+  -
+    name: lwtunnel-ip-opt-erspan
+    name-prefix: lwtunnel-ip-opt-erspan-
+    attributes:
+      -
+        name: ver
+        type: u8
+      -
+        name: index
+        type: u32
+        byte-order: big-endian
+      -
+        name: dir
+        type: u8
+      -
+        name: hwid
+        type: u8
+  -
+    name: lwt-bpf-prog
+    name-prefix: lwt-bpf-prog-
+    attributes:
+      -
+        name: fd
+        type: u32
+      -
+        name: name
+        type: string
+        checks:
+          max-len: 256
+  -
+    name: seg6-local-bpf
+    name-prefix: seg6-local-bpf-
+    attr-max-name: seg6-local-bpf-prog-max
+    attributes:
+      -
+        name: prog
+        type: u32
+      -
+        name: prog-name
+        type: string
+        checks:
+          max-len: 256
+  -
+    name: seg6-local-cnt
+    name-prefix: seg6-local-cnt-
+    attributes:
+      -
+        name: pad
+        type: pad
+      -
+        name: packets
+        type: u64
+      -
+        name: bytes
+        type: u64
+      -
+        name: errors
+        type: u64
+  -
+    name: seg6-local-flv
+    name-prefix: seg6-local-flv-
+    attributes:
+      -
+        name: operation
+        type: u32
+        enum: seg6-local-flv-ops
+        enum-as-flags: true
+      -
+        name: lcblock-bits
+        type: u8
+      -
+        name: lcnode-fn-bits
+        type: u8
+  -
+    name: res-group-attrs
+    name-prefix: nha-res-group-
+    attributes:
+      -
+        name: pad
+        type: pad
+        value: 0
+      -
+        name: buckets
+        type: u16
+      -
+        name: idle-timer
+        type: u32
+      -
+        name: unbalanced-timer
+        type: u32
+      -
+        name: unbalanced-time
+        type: u64
+  -
+    name: res-bucket-attrs
+    name-prefix: nha-res-bucket-
+    attributes:
+      -
+        name: pad
+        type: pad
+        value: 0
+      -
+        name: index
+        type: u16
+      -
+        name: idle-time
+        type: u64
+      -
+        name: nh-id
+        type: u32
+  -
+    name: group-stats-attrs
+    name-prefix: nha-group-stats-
+    attributes:
+      -
+        name: entry
+        type: nest
+        nested-attributes: group-stats-entry-attrs
+        multi-attr: true
+  -
+    name: group-stats-entry-attrs
+    name-prefix: nha-group-stats-entry-
+    attributes:
+      -
+        name: id
+        type: u32
+      -
+        name: packets
+        type: uint
+      -
+        name: packets-hw
+        type: uint
+
+operations:
+  enum-model: directional
+  fixed-header: nhmsg
+  name-prefix: rtm-
+  list:
+    -
+      name: newnexthop
+      doc: Add new nexthop entry
+      attribute-set: nexthop-attrs
+      do:
+        request:
+          value: 104
+          attributes:
+            - id
+            - group
+            - group-type
+            - blackhole
+            - oif
+            - gateway
+            - encap-type
+            - encap
+            - fdb
+            - res-group
+            - hw-stats-enable
+            - dst-port
+    -
+      name: delnexthop
+      doc: Delete nexthop with given id.
+      attribute-set: nexthop-attrs
+      do:
+        request:
+          value: 105
+          attributes:
+            - id
+    -
+      name: getnexthop
+      doc: Get or dump nexthop entries
+      attribute-set: nexthop-attrs
+      do:
+        request:
+          value: 106
+          attributes:
+            - id
+            - op-flags
+        reply:
+          value: 104
+          attributes: &nexthop-all-attrs
+            - id
+            - group
+            - group-type
+            - blackhole
+            - oif
+            - gateway
+            - encap-type
+            - encap
+            - fdb
+            - res-group
+            - op-flags
+            - group-stats
+            - hw-stats-enable
+            - hw-stats-used
+            - dst-port
+      dump:
+        request:
+          value: 106
+          attributes:
+            - oif
+            - groups
+            - master
+            - fdb
+            - op-flags
+        reply:
+          value: 104
+          attributes: *nexthop-all-attrs
+    -
+      name: newnexthop-ntf
+      doc: Notification about a created nexthop.
+      value: 104
+      notify: getnexthop
+    -
+      name: delnexthop-ntf
+      doc: Notification about a deleted nexthop.
+      value: 105
+      notify: getnexthop
+    -
+      name: getnexthopbucket
+      doc: Get or dump nexthop buckets
+      attribute-set: nexthop-attrs
+      do:
+        request:
+          value: 118
+          attributes: &nexthop-bucket-all-attrs
+            - id
+            - res-bucket
+        reply:
+          value: 116
+          attributes: *nexthop-bucket-all-attrs
+      dump:
+        request:
+          value: 118
+          attributes:
+            - id
+            - oif
+            - master
+            - res-bucket
+        reply:
+          value: 116
+          attributes: *nexthop-bucket-all-attrs
+    -
+      name: newnexthopbucket-ntf
+      doc: Notification about a created nexthop bucket.
+      value: 116
+      notify: getnexthopbucket
+
+mcast-groups:
+  list:
+    -
+      name: rtnlgrp-nexthop
+      value: 32
diff --git a/MAINTAINERS b/MAINTAINERS
index 23e919448..6a5062f02 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -19144,6 +19144,7 @@ L:	netdev@vger.kernel.org
 S:	Maintained
 F:	Documentation/netlink/specs/rt-addr.yaml
 F:	Documentation/netlink/specs/rt-neigh.yaml
+F:	Documentation/netlink/specs/rt-nexthop.yaml
 F:	Documentation/netlink/specs/rt-route.yaml
 F:	Documentation/netlink/specs/rt-rule.yaml
 F:	include/linux/inetdevice.h
diff --git a/tools/net/ynl/Makefile.deps b/tools/net/ynl/Makefile.deps
index 3eee34e0e..9389f3752 100644
--- a/tools/net/ynl/Makefile.deps
+++ b/tools/net/ynl/Makefile.deps
@@ -45,6 +45,15 @@ CFLAGS_rt-link:=$(call get_hdr_inc,__LINUX_RTNETLINK_H,rtnetlink.h) \
 	$(call get_hdr_inc,_LINUX_IF_LINK_H,if_link.h)
 CFLAGS_rt-neigh:=$(call get_hdr_inc,__LINUX_RTNETLINK_H,rtnetlink.h) \
 	$(call get_hdr_inc,__LINUX_NEIGHBOUR_H,neighbour.h)
+CFLAGS_rt-nexthop:=$(call get_hdr_inc,__LINUX_RTNETLINK_H,rtnetlink.h) \
+	$(call get_hdr_inc,_LINUX_NEXTHOP_H,nexthop.h) \
+	$(call get_hdr_inc,_LINUX_ILA_H,ila.h) \
+	$(call get_hdr_inc,_LINUX_IOAM6_IPTUNNEL_H,ioam6_iptunnel.h) \
+	$(call get_hdr_inc,_LINUX_MPLS_IPTUNNEL_H,mpls_iptunnel.h) \
+	$(call get_hdr_inc,_LINUX_RPL_IPTUNNEL_H,rpl_iptunnel.h) \
+	$(call get_hdr_inc,_LINUX_SEG6_IPTUNNEL_H,seg6_iptunnel.h) \
+	$(call get_hdr_inc,_LINUX_SEG6_LOCAL_H,seg6_local.h) \
+	$(call get_hdr_inc,_LWTUNNEL_H_,lwtunnel.h)
 CFLAGS_rt-route:=$(call get_hdr_inc,_LINUX_ILA_H,ila.h) \
 	$(call get_hdr_inc,_LINUX_IOAM6_IPTUNNEL_H,ioam6_iptunnel.h) \
 	$(call get_hdr_inc,_LINUX_MPLS_IPTUNNEL_H,mpls_iptunnel.h) \
diff --git a/tools/net/ynl/generated/Makefile b/tools/net/ynl/generated/Makefile
index 5a186349b..d76d4ca94 100644
--- a/tools/net/ynl/generated/Makefile
+++ b/tools/net/ynl/generated/Makefile
@@ -18,6 +18,7 @@ include ../Makefile.deps
 
 YNL_GEN_ARG_ethtool:=--user-header linux/ethtool_netlink.h \
 	--exclude-op stats-get
+YNL_GEN_ARG_rt-nexthop:=--exclude-op newnexthopbucket-ntf
 
 TOOL:=../pyynl/ynl_gen_c.py
 TOOL_RST:=../pyynl/ynl_gen_rst.py

---
base-commit: 98c2ad4f5d805dbc1ea436a334ee59311806a48c
change-id: 20261019-rt-nexthop-spec-0fc03a2c9935

Best regards,
-- 
Demos Ra <demosthenes.ra@gmail.com>



             reply	other threads:[~2026-10-19  6:36 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-19  6:35 Demos Ra via B4 Relay [this message]
2026-10-21  2:50 ` [PATCH net-next] netlink: specs: Add a spec for nexthops in rtnetlink patchwork-bot+netdevbpf

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=20261019-rt-nexthop-spec-v1-1-9c586edf86ab@gmail.com \
    --to=devnull+demosthenes.ra.gmail.com@kernel.org \
    --cc=davem@davemloft.net \
    --cc=demosthenes.ra@gmail.com \
    --cc=donald.hunter@gmail.com \
    --cc=dsahern@kernel.org \
    --cc=edumazet@kernel.org \
    --cc=horms@kernel.org \
    --cc=idosch@nvidia.com \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox